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 @@ -3157,6 +3157,13 @@ // A subprogram declared with SUBROUTINE or FUNCTION bool SubprogramVisitor::BeginSubprogram( const parser::Name &name, Symbol::Flag subpFlag, bool hasModulePrefix) { + if (hasModulePrefix && currScope().IsGlobal()) { // C1547 + Say(name, + "'%s' is a MODULE procedure which must be declared within a " + "MODULE or SUBMODULE"_err_en_US); + return false; + } + if (hasModulePrefix && !inInterfaceBlock() && !IsSeparateModuleProcedureInterface( FindSymbol(currScope().parent(), name))) { diff --git a/flang/test/Semantics/resolve36.f90 b/flang/test/Semantics/resolve36.f90 --- a/flang/test/Semantics/resolve36.f90 +++ b/flang/test/Semantics/resolve36.f90 @@ -2,6 +2,9 @@ ! C1568 The procedure-name shall have been declared to be a separate module ! procedure in the containing program unit or an ancestor of that program unit. +! C1547 MODULE shall appear only in the function-stmt or subroutine-stmt of a +! module subprogram or of a nonabstract interface body that is declared in the +! scoping unit of a module or submodule. module m1 interface module subroutine sub1(arg1) @@ -89,3 +92,8 @@ module procedure b end procedure end + +!ERROR: 'c1547' is a MODULE procedure which must be declared within a MODULE or SUBMODULE +real module function c1547() + func = 0.0 +end function