forked from OSchip/llvm-project
[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:
parent
83c56aa4ee
commit
1c2935a772
|
@ -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))) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue