[flang-commits] [PATCH] D125129: [flang] Allow implicit declaration of DATA objects in inner procedures
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Fri May 6 13:48:45 PDT 2022
klausler created this revision.
klausler added a reviewer: PeteSteinfeld.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
Herald added a reviewer: sscalpone.
Herald added a project: All.
klausler requested review of this revision.
DATA statements in inner procedures were not treating undeclared objects
as implicitly declared variables if the DATA statement appeared in a
specification part; they were treated as host-associated symbols instead.
This was incorrect. Fix DATA statement name resolution to always treat
DATA as if it had appeared in the executable part.
https://reviews.llvm.org/D125129
Files:
flang/lib/Semantics/resolve-names.cpp
flang/test/Semantics/data16.f90
Index: flang/test/Semantics/data16.f90
===================================================================
--- /dev/null
+++ flang/test/Semantics/data16.f90
@@ -0,0 +1,15 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+! Ensure that implicit declarations work in DATA statements
+! appearing in specification parts of inner procedures; they
+! should not elicit diagnostics about initialization of host
+! associated objects.
+program main
+ contains
+ subroutine subr
+ data foo/6.66/ ! implicit declaration of "foo": ok
+ !ERROR: Implicitly typed local entity 'n' not allowed in specification expression
+ real a(n)
+ !ERROR: Host-associated object 'n' must not be initialized in a DATA statement
+ data n/123/
+ end subroutine
+end program
Index: flang/lib/Semantics/resolve-names.cpp
===================================================================
--- flang/lib/Semantics/resolve-names.cpp
+++ flang/lib/Semantics/resolve-names.cpp
@@ -644,7 +644,6 @@
std::optional<SourceName> HadForwardRef(const Symbol &) const;
bool CheckPossibleBadForwardRef(const Symbol &);
- bool inExecutionPart_{false};
bool inSpecificationPart_{false};
bool inEquivalenceStmt_{false};
@@ -3380,7 +3379,7 @@
context().SetError(*resultSymbol);
}},
resultSymbol->details());
- } else if (inExecutionPart_) {
+ } else if (!inSpecificationPart_) {
ObjectEntityDetails entity;
entity.set_funcResult(true);
resultSymbol = &MakeSymbol(effectiveResultName, std::move(entity));
@@ -3413,7 +3412,7 @@
dummy->details());
} else {
dummy = &MakeSymbol(*dummyName, EntityDetails{true});
- if (inExecutionPart_) {
+ if (!inSpecificationPart_) {
ApplyImplicitRules(*dummy);
}
}
@@ -5850,6 +5849,12 @@
}
bool ConstructVisitor::Pre(const parser::DataStmtObject &x) {
+ // Subtle: DATA statements may appear in both the specification and
+ // execution parts, but should be treated as if in the execution part
+ // for purposes of implicit variable declaration vs. host association.
+ // When a name first appears as an object in a DATA statement, it should
+ // be implicitly declared locally as if it had been assigned.
+ auto flagRestorer{common::ScopedSet(inSpecificationPart_, false)};
common::visit(common::visitors{
[&](const Indirection<parser::Variable> &y) {
Walk(y.value());
@@ -6406,7 +6411,7 @@
// be wrong we report an error later in CheckDeclarations().
bool DeclarationVisitor::CheckForHostAssociatedImplicit(
const parser::Name &name) {
- if (inExecutionPart_) {
+ if (!inSpecificationPart_) {
return false;
}
if (name.symbol) {
@@ -7219,9 +7224,7 @@
SetScope(topScope_);
ResolveSpecificationParts(root);
FinishSpecificationParts(root);
- inExecutionPart_ = true;
ResolveExecutionParts(root);
- inExecutionPart_ = false;
ResolveAccParts(context(), x);
ResolveOmpParts(context(), x);
return false;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D125129.427730.patch
Type: text/x-patch
Size: 3057 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220506/694ef101/attachment.bin>
More information about the flang-commits
mailing list