diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -2829,7 +2829,7 @@ } else { return; } - } else if (&useUltimate == &BypassGeneric(localUltimate)) { + } else if (&useUltimate == &BypassGeneric(localUltimate).GetUltimate()) { return; // nothing to do; used subprogram is local's specific } } else if (useGeneric) { @@ -3230,7 +3230,7 @@ SayDerivedType(generic.name(), "Generic interface '%s' may only contain functions due to derived type" " with same name"_err_en_US, - *details.derivedType()->scope()); + *details.derivedType()->GetUltimate().scope()); } generic.set(isFunction ? Symbol::Flag::Function : Symbol::Flag::Subroutine); } @@ -7259,9 +7259,9 @@ } } else if (ultimate.has() || ultimate.has()) { - genericDetails.set_specific(ultimate); + genericDetails.set_specific(*existing); } else if (ultimate.has()) { - genericDetails.set_derivedType(ultimate); + genericDetails.set_derivedType(*existing); } else { SayAlreadyDeclared(symbolName, *existing); return; diff --git a/flang/test/Semantics/modfile52.f90 b/flang/test/Semantics/modfile52.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/modfile52.f90 @@ -0,0 +1,59 @@ +! RUN: %python %S/test_modfile.py %s %flang_fc1 +! Ensure that procedure name or derived type name that has been shadowed +! behind a generic interface gets its proper USE statement in a module file. +module m1 + contains + subroutine foo + end subroutine +end module +module m2 + use m1 + interface foo + procedure foo + end interface +end module +module m3 + type foo + end type +end module +module m4 + use m4 + interface foo + procedure bar + end interface + contains + integer function bar + end function +end module + +!Expect: m1.mod +!module m1 +!contains +!subroutine foo() +!end +!end + +!Expect: m2.mod +!module m2 +!use m1,only:foo +!interface foo +!procedure::foo +!end interface +!end + +!Expect: m3.mod +!module m3 +!type::foo +!end type +!end + +!Expect: m4.mod +!module m4 +!interface foo +!procedure::bar +!end interface +!contains +!function bar() +!integer(4)::bar +!end +!end