diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 122c0a2ebb646a..724f1b28078356 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -3162,6 +3162,10 @@ ModuleVisitor::SymbolRename ModuleVisitor::AddUse( // Convert it to a UseError with this additional location. static bool ConvertToUseError( Symbol &symbol, const SourceName &location, const Scope &module) { + if (auto *ued{symbol.detailsIf()}) { + ued->add_occurrence(location, module); + return true; + } const auto *useDetails{symbol.detailsIf()}; if (!useDetails) { if (auto *genericDetails{symbol.detailsIf()}) { @@ -3319,6 +3323,8 @@ void ModuleVisitor::DoAddUse(SourceName location, SourceName localName, combinedDerivedType = CreateLocalUseError(); } else { ConvertToUseError(*localSymbol, location, *useModuleScope_); + localDerivedType = nullptr; + localGeneric = nullptr; combinedDerivedType = localSymbol; } } diff --git a/flang/test/Semantics/bug121718.f90 b/flang/test/Semantics/bug121718.f90 new file mode 100644 index 00000000000000..e99391f227d72e --- /dev/null +++ b/flang/test/Semantics/bug121718.f90 @@ -0,0 +1,31 @@ +! RUN: %flang_fc1 2>&1 | FileCheck %s --allow-empty +! CHECK-NOT: error +! Regression test simplified from LLVM bug 121718. +! Ensure no crash and no spurious error message. +module m1 + type foo + integer x + end type + contains + subroutine test + print *, foo(123) + end +end +module m2 + interface foo + procedure f + end interface + type foo + real x + end type + contains + complex function f(x) + complex, intent(in) :: x + f = x + end +end +program main + use m1 + use m2 + call test +end