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 @@ -4005,6 +4005,7 @@ // Convert the module procedure's interface into a subprogram. SetScope(DEREF(symbol->scope())); symbol->get().set_isInterface(false); + name.symbol = symbol; } else { // Copy the interface into a new subprogram scope. EraseSymbol(name); @@ -4025,7 +4026,8 @@ Symbol::Flag subpFlag, bool hasModulePrefix, const parser::LanguageBindingSpec *bindingSpec, const ProgramTree::EntryStmtList *entryStmts) { - if (hasModulePrefix && currScope().IsGlobal()) { // C1547 + if (hasModulePrefix && !currScope().IsModule() && + !currScope().IsSubmodule()) { // C1547 Say(name, "'%s' is a MODULE procedure which must be declared within a " "MODULE or SUBMODULE"_err_en_US); diff --git a/flang/test/Semantics/symbol28.f90 b/flang/test/Semantics/symbol28.f90 --- a/flang/test/Semantics/symbol28.f90 +++ b/flang/test/Semantics/symbol28.f90 @@ -43,7 +43,7 @@ end subroutine end interface contains - !DEF: /m2/s MODULE SubprogramName + !REF:/m2/s module procedure s end procedure !DEF: /m2/s2 MODULE, PUBLIC (Subroutine) Subprogram