[flang-commits] [flang] [flang] Reject MODULE prefix in abstract interface body (PR #212980)
via flang-commits
flang-commits at lists.llvm.org
Wed Oct 7 00:28:50 PDT 2026
https://github.com/ejose02 updated https://github.com/llvm/llvm-project/pull/212980
>From a657316c4feca2cdd29c30f9a1b5c9df23e7c917 Mon Sep 17 00:00:00 2001
From: ejose <ejose at amd.com>
Date: Thu, 30 Jul 2026 09:45:23 +0000
Subject: [PATCH 1/3] [flang] Reject MODULE prefix in abstract interface body
Diagnose MODULE on a procedure in an ABSTRACT INTERFACE block per Fortran C1547 (R1526, J3/18-007r1): MODULE may appear only in a module subprogram or a nonabstract interface body in a module/submodule.
Fixes #208200
---
flang/lib/Semantics/resolve-names.cpp | 5 +++++
flang/test/Semantics/resolve36.f90 | 9 +++++++++
2 files changed, 14 insertions(+)
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 67690d6f47d067..09a51800947e43 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -5919,6 +5919,11 @@ bool SubprogramVisitor::BeginSubprogram(const parser::Name &name,
// other semantic checks run before we print the errors
isValid = false;
}
+ if (hasModulePrefix && inInterfaceBlock() && isAbstract()) { // C1547
+ Say(name,
+ "'%s' has MODULE prefix, which is not allowed in an ABSTRACT interface body"_err_en_US);
+ isValid = false;
+ }
Symbol *moduleInterface{nullptr};
if (isValid && hasModulePrefix && !inInterfaceBlock()) {
moduleInterface = FindSeparateModuleProcedureInterface(name);
diff --git a/flang/test/Semantics/resolve36.f90 b/flang/test/Semantics/resolve36.f90
index bdb1b227f61ceb..b3aed359c04fb9 100644
--- a/flang/test/Semantics/resolve36.f90
+++ b/flang/test/Semantics/resolve36.f90
@@ -97,3 +97,12 @@ module subroutine b
real module function c1547()
func = 0.0
end function
+
+module mod_test
+abstract interface
+ !ERROR: 'f1' has MODULE prefix, which is not allowed in an ABSTRACT interface body
+ pure integer module function f1(i)
+ integer, intent(in) :: i
+ end function
+end interface
+end module
>From c000890db1e31771eef6e59b1e28e2bd009a4244 Mon Sep 17 00:00:00 2001
From: ejose <ejose at amd.com>
Date: Mon, 3 Aug 2026 04:56:28 +0000
Subject: [PATCH 2/3] Address review concern for MODULE prefix in abstract
interface
Updated the C1547 diagnostic to use flang's usual "may not have" wording.
Renamed the test module to m5 and extend resolve36.f90 with a module subroutine case and an abstract-interface-in-submodule case.
---
flang/lib/Semantics/resolve-names.cpp | 2 +-
flang/test/Semantics/resolve36.f90 | 19 +++++++++++++++++--
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 09a51800947e43..fc3de93b25c020 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -5921,7 +5921,7 @@ bool SubprogramVisitor::BeginSubprogram(const parser::Name &name,
}
if (hasModulePrefix && inInterfaceBlock() && isAbstract()) { // C1547
Say(name,
- "'%s' has MODULE prefix, which is not allowed in an ABSTRACT interface body"_err_en_US);
+ "'%s' may not have a MODULE prefix in an ABSTRACT interface body"_err_en_US);
isValid = false;
}
Symbol *moduleInterface{nullptr};
diff --git a/flang/test/Semantics/resolve36.f90 b/flang/test/Semantics/resolve36.f90
index b3aed359c04fb9..348b5f6cc4ff83 100644
--- a/flang/test/Semantics/resolve36.f90
+++ b/flang/test/Semantics/resolve36.f90
@@ -98,11 +98,26 @@ real module function c1547()
func = 0.0
end function
-module mod_test
+module m5
abstract interface
- !ERROR: 'f1' has MODULE prefix, which is not allowed in an ABSTRACT interface body
+ !ERROR: 'f1' may not have a MODULE prefix in an ABSTRACT interface body
pure integer module function f1(i)
integer, intent(in) :: i
end function
+ !ERROR: 's1' may not have a MODULE prefix in an ABSTRACT interface body
+ module subroutine s1(i)
+ integer, intent(in) :: i
+ end subroutine
end interface
end module
+
+module m6
+end module
+submodule(m6) s6
+abstract interface
+ !ERROR: 'f2' may not have a MODULE prefix in an ABSTRACT interface body
+ module function f2()
+ integer :: f2
+ end function
+end interface
+end submodule
>From 92e177473be03a9dd14c517a3380dc737dbbf165 Mon Sep 17 00:00:00 2001
From: ejose <ejose at amd.com>
Date: Wed, 7 Oct 2026 07:27:08 +0000
Subject: [PATCH 3/3] [flang] Emit one C1547 error for MODULE in abstract
interface
Test abstract case before module-scope check; add program p to resolve36.
---
flang/lib/Semantics/resolve-names.cpp | 11 +++++------
flang/test/Semantics/resolve36.f90 | 9 +++++++++
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index fc3de93b25c020..9b7f3a2c2f0c6c 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -5911,7 +5911,11 @@ bool SubprogramVisitor::BeginSubprogram(const parser::Name &name,
const parser::LanguageBindingSpec *bindingSpec,
const ProgramTree::EntryStmtList *entryStmts) {
bool isValid{true};
- if (hasModulePrefix && !currScope().IsModule() &&
+ if (hasModulePrefix && isAbstract()) { // C1547
+ Say(name,
+ "'%s' may not have a MODULE prefix in an ABSTRACT interface body"_err_en_US);
+ isValid = false;
+ } else 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);
@@ -5919,11 +5923,6 @@ bool SubprogramVisitor::BeginSubprogram(const parser::Name &name,
// other semantic checks run before we print the errors
isValid = false;
}
- if (hasModulePrefix && inInterfaceBlock() && isAbstract()) { // C1547
- Say(name,
- "'%s' may not have a MODULE prefix in an ABSTRACT interface body"_err_en_US);
- isValid = false;
- }
Symbol *moduleInterface{nullptr};
if (isValid && hasModulePrefix && !inInterfaceBlock()) {
moduleInterface = FindSeparateModuleProcedureInterface(name);
diff --git a/flang/test/Semantics/resolve36.f90 b/flang/test/Semantics/resolve36.f90
index 348b5f6cc4ff83..eedbe574290de5 100644
--- a/flang/test/Semantics/resolve36.f90
+++ b/flang/test/Semantics/resolve36.f90
@@ -121,3 +121,12 @@ module function f2()
end function
end interface
end submodule
+
+program p
+abstract interface
+ !ERROR: 'f4' may not have a MODULE prefix in an ABSTRACT interface body
+ module function f4()
+ integer :: f4
+ end function
+end interface
+end program
More information about the flang-commits
mailing list