diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -4995,14 +4995,18 @@ return false; } +// Section 19.4, paragraph 5 says that each ac-do-variable has the scope of the +// enclocing ac-impled-do bool ConstructVisitor::Pre(const parser::AcImpliedDo &x) { auto &values{std::get>(x.t)}; auto &control{std::get(x.t)}; auto &type{std::get>(control.t)}; auto &bounds{std::get(control.t)}; + PushScope(Scope::Kind::ImpliedDos, nullptr); DeclareStatementEntity(bounds.name.thing.thing, type); Walk(bounds); Walk(values); + PopScope(); return false; } diff --git a/flang/test/Semantics/array-constr-values.f90 b/flang/test/Semantics/array-constr-values.f90 --- a/flang/test/Semantics/array-constr-values.f90 +++ b/flang/test/Semantics/array-constr-values.f90 @@ -55,9 +55,14 @@ real, dimension(10), parameter :: good1 = [(99.9, i = 1, 10)] real, dimension(100), parameter :: good2 = [((88.8, i = 1, 10), j = 1, 10)] !ERROR: Implied DO index is active in surrounding implied DO loop and may not have the same name - !ERROR: 'i' is already declared in this scoping unit real, dimension(100), parameter :: bad = [((88.8, i = 1, 10), i = 1, 10)] !ERROR: The stride of an implied DO loop must not be zero integer, parameter :: bad2(*) = [(j, j=1,1,0)] end subroutine checkC7115 +subroutine checkOkDuplicates + real :: realArray(21) = & + [ ((1.0, iDuplicate = 1,j), & + (0.0, iDuplicate = j,3 ), & + j = 1,5 ) ] +end subroutine diff --git a/flang/test/Semantics/symbol05.f90 b/flang/test/Semantics/symbol05.f90 --- a/flang/test/Semantics/symbol05.f90 +++ b/flang/test/Semantics/symbol05.f90 @@ -48,10 +48,10 @@ !DEF: /s3/Block1/t DerivedType type :: t !DEF: /s3/Block1/t/x ObjectEntity REAL(4) - !DEF: /s3/Block1/t/ImpliedDos1/i (Implicit) ObjectEntity INTEGER(4) + !DEF: /s3/Block1/t/ImpliedDos1/ImpliedDos1/i (Implicit) ObjectEntity INTEGER(4) real :: x(10) = [(i, i=1,10)] !DEF: /s3/Block1/t/y ObjectEntity REAL(4) - !DEF: /s3/Block1/t/ImpliedDos2/j ObjectEntity INTEGER(8) + !DEF: /s3/Block1/t/ImpliedDos2/ImpliedDos1/j ObjectEntity INTEGER(8) real :: y(10) = [(j, j=1,10)] end type end block