From 1c2935a7729fdc22186fa0a21968061a7f52f021 Mon Sep 17 00:00:00 2001 From: Peter Steinfeld Date: Wed, 3 Mar 2021 10:52:40 -0800 Subject: [PATCH] [flang] Prohibit MODULE procedures in the global scope We were allowing procedures with the MODULE prefix to be declared at the global scope. This is prohibited by C1547 and was causing an internal check of the compiler to fail. I fixed this by adding a check. I also added a test that would trigger a crash without this change. Differential Revision: https://reviews.llvm.org/D97875 --- flang/lib/Semantics/resolve-names.cpp | 7 +++++++ flang/test/Semantics/resolve36.f90 | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index dd8acaa..df358d8 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -3157,6 +3157,13 @@ bool SubprogramVisitor::BeginMpSubprogram(const parser::Name &name) { // 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 index 8a66d71..38bc21d 100644 --- 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 @@ contains 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 -- 2.7.4