[flang-commits] [PATCH] D146572: [flang] Diagnose bad attributes of implicit interface externals
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Tue Mar 21 15:01:41 PDT 2023
klausler created this revision.
klausler added a reviewer: PeteSteinfeld.
klausler added a project: Flang.
Herald added subscribers: sunshaoce, jdoerfert.
Herald added a project: All.
klausler requested review of this revision.
Procedures with the EXTERNAL attribute (explicit or implied) are
not permitted to be ALLOCATABLE or be arrays if their interfaces
are implicit.
https://reviews.llvm.org/D146572
Files:
flang/lib/Semantics/check-declarations.cpp
flang/test/Semantics/call05.f90
flang/test/Semantics/resolve20.f90
Index: flang/test/Semantics/resolve20.f90
===================================================================
--- flang/test/Semantics/resolve20.f90
+++ flang/test/Semantics/resolve20.f90
@@ -21,6 +21,7 @@
procedure(h) :: i
procedure(forward) :: j
!ERROR: 'bad1' must be an abstract interface or a procedure with an explicit interface
+ !ERROR: Procedure 'k1' may not be an array without an explicit interface
procedure(bad1) :: k1
!ERROR: 'bad2' must be an abstract interface or a procedure with an explicit interface
procedure(bad2) :: k2
Index: flang/test/Semantics/call05.f90
===================================================================
--- flang/test/Semantics/call05.f90
+++ flang/test/Semantics/call05.f90
@@ -121,7 +121,9 @@
module m2
+ !ERROR: Procedure 't3' may not be ALLOCATABLE without an explicit interface
character(len=10), allocatable :: t1, t2, t3, t4
+ !ERROR: Procedure 't6' may not be ALLOCATABLE without an explicit interface
character(len=:), allocatable :: t5, t6, t7, t8(:)
character(len=10), pointer :: p1
Index: flang/lib/Semantics/check-declarations.cpp
===================================================================
--- flang/lib/Semantics/check-declarations.cpp
+++ flang/lib/Semantics/check-declarations.cpp
@@ -428,6 +428,17 @@
" of a module"_err_en_US,
symbol.name());
}
+ if (IsProcedure(symbol) && !symbol.HasExplicitInterface()) {
+ if (IsAllocatable(symbol)) {
+ messages_.Say(
+ "Procedure '%s' may not be ALLOCATABLE without an explicit interface"_err_en_US,
+ symbol.name());
+ } else if (symbol.Rank() > 0) {
+ messages_.Say(
+ "Procedure '%s' may not be an array without an explicit interface"_err_en_US,
+ symbol.name());
+ }
+ }
}
void CheckHelper::CheckCommonBlock(const Symbol &symbol) {
@@ -918,7 +929,7 @@
}
CheckPassArg(symbol, details.procInterface(), details);
}
- if (symbol.attrs().test(Attr::POINTER)) {
+ if (IsPointer(symbol)) {
CheckPointerInitialization(symbol);
if (const Symbol * interface{details.procInterface()}) {
const Symbol &ultimate{interface->GetUltimate()};
@@ -938,7 +949,7 @@
symbol.name()); // C1517
}
}
- } else if (symbol.attrs().test(Attr::SAVE)) {
+ } else if (IsSave(symbol)) {
messages_.Say(
"Procedure '%s' with SAVE attribute must also have POINTER attribute"_err_en_US,
symbol.name());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D146572.507138.patch
Type: text/x-patch
Size: 2481 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230321/4f1887af/attachment-0001.bin>
More information about the flang-commits
mailing list