[flang-commits] [PATCH] D150789: [flang] Fix bogus error under IMPLICIT NONE(EXTERNAL)
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Wed May 17 08:38:27 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.
Don't emit an error message for a possible implicit use of an
external procedure when it is known that the symbol is not
a procedure (e.g., an array).
Fixes https://github.com/llvm/llvm-project/issues/62047
https://reviews.llvm.org/D150789
Files:
flang/lib/Semantics/resolve-names.cpp
flang/test/Semantics/implicit07.f90
Index: flang/test/Semantics/implicit07.f90
===================================================================
--- flang/test/Semantics/implicit07.f90
+++ flang/test/Semantics/implicit07.f90
@@ -1,7 +1,7 @@
! RUN: %python %S/test_errors.py %s %flang_fc1
implicit none(external)
external x
-integer :: f, i
+integer :: f, i, arr(1) = [0]
call x
!ERROR: 'y' is an external procedure without the EXTERNAL attribute in a scope with IMPLICIT NONE(EXTERNAL)
call y
@@ -11,4 +11,5 @@
!ERROR: 'z' is an external procedure without the EXTERNAL attribute in a scope with IMPLICIT NONE(EXTERNAL)
call z
end block
+print *, arr(1) ! no error
end
Index: flang/lib/Semantics/resolve-names.cpp
===================================================================
--- flang/lib/Semantics/resolve-names.cpp
+++ flang/lib/Semantics/resolve-names.cpp
@@ -7164,13 +7164,13 @@
symbol = &MakeSymbol(context().globalScope(), name.source, Attrs{});
}
Resolve(name, *symbol);
+ ConvertToProcEntity(*symbol);
if (!symbol->attrs().test(Attr::INTRINSIC)) {
if (CheckImplicitNoneExternal(name.source, *symbol)) {
MakeExternal(*symbol);
}
}
CheckEntryDummyUse(name.source, symbol);
- ConvertToProcEntity(*symbol);
SetProcFlag(name, *symbol, flag);
} else if (CheckUseError(name)) {
// error was reported
@@ -7186,9 +7186,7 @@
if (!SetProcFlag(name, *symbol, flag)) {
return; // reported error
}
- if (!symbol->has<GenericDetails>()) {
- CheckImplicitNoneExternal(name.source, *symbol);
- }
+ CheckImplicitNoneExternal(name.source, *symbol);
if (IsProcedure(*symbol) || symbol->has<DerivedTypeDetails>() ||
symbol->has<AssocEntityDetails>()) {
// Symbols with DerivedTypeDetails and AssocEntityDetails are accepted
@@ -7197,7 +7195,7 @@
// references that will be fixed later when analyzing expressions.
} else if (symbol->has<ObjectEntityDetails>()) {
// Symbols with ObjectEntityDetails are also accepted because this can be
- // a mis-parsed array references that will be fixed later. Ensure that if
+ // a mis-parsed array reference that will be fixed later. Ensure that if
// this is a symbol from a host procedure, a symbol with HostAssocDetails
// is created for the current scope.
// Operate on non ultimate symbol so that HostAssocDetails are also
@@ -7217,11 +7215,11 @@
bool ResolveNamesVisitor::CheckImplicitNoneExternal(
const SourceName &name, const Symbol &symbol) {
- if (isImplicitNoneExternal() && !symbol.attrs().test(Attr::EXTERNAL) &&
+ if (symbol.has<ProcEntityDetails>() && isImplicitNoneExternal() &&
+ !symbol.attrs().test(Attr::EXTERNAL) &&
!symbol.attrs().test(Attr::INTRINSIC) && !symbol.HasExplicitInterface()) {
Say(name,
- "'%s' is an external procedure without the EXTERNAL"
- " attribute in a scope with IMPLICIT NONE(EXTERNAL)"_err_en_US);
+ "'%s' is an external procedure without the EXTERNAL attribute in a scope with IMPLICIT NONE(EXTERNAL)"_err_en_US);
return false;
}
return true;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D150789.523063.patch
Type: text/x-patch
Size: 3137 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230517/770878ef/attachment.bin>
More information about the flang-commits
mailing list