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 @@ -5883,10 +5883,10 @@ } else if (!prev) { ApplyImplicitRules(symbol); } else { - const Symbol &prevRoot{ResolveAssociations(*prev)}; + const Symbol &prevRoot{prev->GetUltimate()}; // prev could be host- use- or construct-associated with another symbol if (!prevRoot.has() && - !prevRoot.has()) { + !prevRoot.has()) { Say2(name, "Index name '%s' conflicts with existing identifier"_err_en_US, *prev, "Previous declaration of '%s'"_en_US); context().SetError(symbol); diff --git a/flang/test/Semantics/forall01.f90 b/flang/test/Semantics/forall01.f90 --- a/flang/test/Semantics/forall01.f90 +++ b/flang/test/Semantics/forall01.f90 @@ -110,3 +110,25 @@ a(1)%p => b(i) end forall end + +subroutine forall7(x) + integer :: iarr(1) + real :: a(10) + class(*) :: x + associate (j => iarr(1)) + forall (j=1:size(a)) + a(j) = a(j) + 1 + end forall + end associate + associate (j => iarr(1) + 1) + forall (j=1:size(a)) + a(j) = a(j) + 1 + end forall + end associate + select type (j => x) + type is (integer) + forall (j=1:size(a)) + a(j) = a(j) + 1 + end forall + end select +end subroutine