[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
This commit is contained in:
Peter Steinfeld 2021-03-03 10:52:40 -08:00
parent 83c56aa4ee
commit 1c2935a772
2 changed files with 15 additions and 0 deletions

View File

@ -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))) {

View File

@ -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