diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 4646bb01ee725..ca2a52c24a164 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -9095,6 +9095,8 @@ void ResolveNamesVisitor::EndScopeForNode(const ProgramTree &node) { // pointers, are deferred until all of the pertinent specification parts // have been visited. This deferred processing enables the use of forward // references in these circumstances. +// Data statement objects with implicit derived types are finally +// resolved here. class DeferredCheckVisitor { public: explicit DeferredCheckVisitor(ResolveNamesVisitor &resolver) @@ -9110,16 +9112,17 @@ class DeferredCheckVisitor { if (Symbol * symbol{name.symbol}) { if (Scope * scope{symbol->scope()}) { if (scope->IsDerivedType()) { - resolver_.PushScope(*scope); - pushedScope_ = true; + CHECK(outerScope_ == nullptr); + outerScope_ = &resolver_.currScope(); + resolver_.SetScope(*scope); } } } } void Post(const parser::EndTypeStmt &) { - if (pushedScope_) { - resolver_.PopScope(); - pushedScope_ = false; + if (outerScope_) { + resolver_.SetScope(*outerScope_); + outerScope_ = nullptr; } } @@ -9149,10 +9152,20 @@ class DeferredCheckVisitor { resolver_.CheckExplicitInterface(tbps.interfaceName); } void Post(const parser::TypeBoundProcedureStmt::WithoutInterface &tbps) { - if (pushedScope_) { + if (outerScope_) { resolver_.CheckBindings(tbps); } } + bool Pre(const parser::DataStmtObject &) { + ++dataStmtObjectNesting_; + return true; + } + void Post(const parser::DataStmtObject &) { --dataStmtObjectNesting_; } + void Post(const parser::Designator &x) { + if (dataStmtObjectNesting_ > 0) { + resolver_.ResolveDesignator(x); + } + } private: void Init(const parser::Name &name, @@ -9174,7 +9187,8 @@ class DeferredCheckVisitor { } ResolveNamesVisitor &resolver_; - bool pushedScope_{false}; + Scope *outerScope_{nullptr}; + int dataStmtObjectNesting_{0}; }; // Perform checks and completions that need to happen after all of diff --git a/flang/test/Semantics/data22.f90 b/flang/test/Semantics/data22.f90 new file mode 100644 index 0000000000000..365958dbe7579 --- /dev/null +++ b/flang/test/Semantics/data22.f90 @@ -0,0 +1,17 @@ +! RUN: %flang_fc1 -fdebug-dump-symbols %s 2>&1 | FileCheck %s +! Ensure that implicitly typed DATA statement objects with derived +! types get their symbols resolved by the end of the name resolution pass. +! CHECK: x1 (Implicit, InDataStmt) size=4 offset=0: ObjectEntity type: TYPE(t1) shape: 1_8:1_8 init:[t1::t1(n=123_4)] +! CHECK: x2 (InDataStmt) size=4 offset=4: ObjectEntity type: TYPE(t2) shape: 1_8:1_8 init:[t2::t2(m=456_4)] +implicit type(t1)(x) +type t1 + integer n +end type +dimension x1(1), x2(1) +data x1(1)%n /123/ +data x2(1)%m /456/ +type t2 + integer m +end type +type(t2) x2 +end