From 766a16bf72d57d93f1ae17038b34119762aa975e Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn Date: Thu, 27 Feb 2025 19:13:40 -0500 Subject: [PATCH 1/3] [flang] Allow nested implied DO loops with DATA statements Previously, netsted implied DO loops with DATA statements were disallowed, which meant that the following code couldn't compile: DATA (a(i),(b(i,j),j=1,3),(c(i,j),j=1,3),i=0,4)/ This change allowes nested implied DO loops. --- flang/lib/Semantics/resolve-names.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 17a6665dfb6a5..e6a438d471643 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -7500,15 +7500,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; } From ba489edd5b1cb974adf338298ae231a95ea2cbc5 Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn Date: Fri, 28 Feb 2025 17:26:59 -0500 Subject: [PATCH 2/3] Don't create extra scode at the entry to DATA statement: modified: lib/Semantics/resolve-names.cpp Adjusted the test to the new behavior of implied-DO loops in DATA statements: modified: test/Semantics/resolve40.f90 --- flang/lib/Semantics/resolve-names.cpp | 4 ++-- flang/test/Semantics/resolve40.f90 | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index e6cfa32ab8893..d29e04869e615 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -7521,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 From 852522969fa352618dacdf1bcfe84cb1b0975c3b Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn Date: Sat, 1 Mar 2025 21:19:36 -0500 Subject: [PATCH 3/3] Updated Semantics/symbol09.f90 to pass with the new scope changes --- flang/test/Semantics/symbol09.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/