Skip to content

Commit

Permalink
[flang] Fix crash when handling benign USE conflict
Browse files Browse the repository at this point in the history
When the same name is used for distinct derived types in two
modules, and at least one of those modules also defines a generic
interface of the same name, name resolution crashes when both
modules are USE'd into the same scope.  The crash is due to
some pointers into the symbol table becoming invalid when
a symbol is replaced with a UseErrorDetails; set them to null.
Also allow for extending a UseErrorDetails in place rather
than emitting a spurious error message.

Fixes llvm#121718.
  • Loading branch information
klausler committed Jan 7, 2025
1 parent 40ac34c commit a4aa5e2
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
6 changes: 6 additions & 0 deletions flang/lib/Semantics/resolve-names.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<UseErrorDetails>()}) {
ued->add_occurrence(location, module);
return true;
}
const auto *useDetails{symbol.detailsIf<UseDetails>()};
if (!useDetails) {
if (auto *genericDetails{symbol.detailsIf<GenericDetails>()}) {
Expand Down Expand Up @@ -3319,6 +3323,8 @@ void ModuleVisitor::DoAddUse(SourceName location, SourceName localName,
combinedDerivedType = CreateLocalUseError();
} else {
ConvertToUseError(*localSymbol, location, *useModuleScope_);
localDerivedType = nullptr;
localGeneric = nullptr;
combinedDerivedType = localSymbol;
}
}
Expand Down
31 changes: 31 additions & 0 deletions flang/test/Semantics/bug121718.f90
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit a4aa5e2

Please sign in to comment.