diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 1514c01a49528..d29e04869e615 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -7477,15 +7477,10 @@ bool ConstructVisitor::Pre(const parser::DataImpliedDo &x) { Walk(bounds.upper); Walk(bounds.step); EndCheckOnIndexUseInOwnBounds(restore); - bool pushScope{currScope().kind() != Scope::Kind::ImpliedDos}; - if (pushScope) { - PushScope(Scope::Kind::ImpliedDos, nullptr); - } + PushScope(Scope::Kind::ImpliedDos, nullptr); DeclareStatementEntity(bounds.name, type); Walk(objects); - if (pushScope) { - PopScope(); - } + PopScope(); return false; } @@ -7526,9 +7521,9 @@ bool ConstructVisitor::Pre(const parser::DataStmtObject &x) { } }, [&](const parser::DataImpliedDo &y) { - PushScope(Scope::Kind::ImpliedDos, nullptr); + // Don't push scope here, since it's done when visiting + // DataImpliedDo. Walk(y); - PopScope(); }, }, x.u); diff --git a/flang/test/Semantics/resolve40.f90 b/flang/test/Semantics/resolve40.f90 index b3384a91097d7..a91507aa62282 100644 --- a/flang/test/Semantics/resolve40.f90 +++ b/flang/test/Semantics/resolve40.f90 @@ -69,8 +69,8 @@ subroutine s8 subroutine s9 real :: x(2,2) - !ERROR: 'i' is already declared in this scoping unit - data ((x(i,i),i=1,2),i=1,2)/4*0.0/ + ! Nested implied DO loops have their own scope + data ((x(i,j),j=1,2),(x(i,j),j=1,2),i=1,2)/8*0.0/ end module m10 diff --git a/flang/test/Semantics/symbol09.f90 b/flang/test/Semantics/symbol09.f90 index 98cd1d954c3e7..0ed80b55b34d1 100644 --- a/flang/test/Semantics/symbol09.f90 +++ b/flang/test/Semantics/symbol09.f90 @@ -51,7 +51,7 @@ subroutine s3 real, dimension(n,n) :: x !REF: /s3/x !DEF: /s3/ImpliedDos1/k (Implicit) ObjectEntity INTEGER(4) - !DEF: /s3/ImpliedDos1/j ObjectEntity INTEGER(8) + !DEF: /s3/ImpliedDos1/ImpliedDos1/j ObjectEntity INTEGER(8) !REF: /s3/n !REF: /s3/n2 data ((x(k,j),integer(kind=8)::j=1,n),k=1,n)/n2*3.0/