diff --git a/flang/lib/Semantics/resolve-names-utils.cpp b/flang/lib/Semantics/resolve-names-utils.cpp index a838d49c06104..347f54e064070 100644 --- a/flang/lib/Semantics/resolve-names-utils.cpp +++ b/flang/lib/Semantics/resolve-names-utils.cpp @@ -762,7 +762,11 @@ void SymbolMapper::MapSymbolExprs(Symbol &symbol) { proc.set_procInterfaces( *mappedSymbol, BypassGeneric(mappedSymbol->GetUltimate())); } else if (const DeclTypeSpec * mappedType{MapType(proc.type())}) { - proc.set_type(*mappedType); + if (proc.type()) { + CHECK(*proc.type() == *mappedType); + } else { + proc.set_type(*mappedType); + } } if (proc.init()) { if (const Symbol * mapped{MapSymbol(*proc.init())}) { diff --git a/flang/test/Semantics/bug124487.f90 b/flang/test/Semantics/bug124487.f90 new file mode 100644 index 0000000000000..b91757c362367 --- /dev/null +++ b/flang/test/Semantics/bug124487.f90 @@ -0,0 +1,14 @@ +!RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck --allow-empty %s +!CHECK-NOT: error: +module m + interface + module subroutine smp(x) + character, external :: x + end + end interface +end +submodule (m) sm + contains + module procedure smp ! crashes here + end +end