diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 9e465f8ff3e1e..6a464e7ad8d24 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -7278,6 +7278,14 @@ bool DeclarationVisitor::PassesLocalityChecks( specName); return false; } + if (const DerivedTypeSpec *derived{type->AsDerived()}) { // F'2023 C1130 + if (auto bad{FindAllocatableUltimateComponent(*derived)}) { + SayWithDecl(name, symbol, + "Derived type variable '%s' with ultimate ALLOCATABLE component '%s' not allowed in a %s locality-spec"_err_en_US, + bad.BuildResultDesignatorName(), specName); + return false; + } + } } if (symbol.attrs().test(Attr::ASYNCHRONOUS) && isReduce) { // F'2023 C1131 SayWithDecl(name, symbol, diff --git a/flang/test/Semantics/resolve55.f90 b/flang/test/Semantics/resolve55.f90 index 5f7a3044e834c..908fda8a83e15 100644 --- a/flang/test/Semantics/resolve55.f90 +++ b/flang/test/Semantics/resolve55.f90 @@ -94,3 +94,23 @@ subroutine s8(arg) do concurrent(i=1:5) local(arg) end do end subroutine s8 + +subroutine s9() + type l3 + integer, allocatable :: a + end type + type l2 + type(l3) :: l2_3 + end type + type l1 + type(l2) :: l1_2 + end type + type(l1) :: v + integer sum + + sum = 0 +!ERROR: Derived type variable 'v' with ultimate ALLOCATABLE component '%l1_2%l2_3%a' not allowed in a LOCAL_INIT locality-spec + do concurrent (i = 1:10) local_init(v) + sum = sum + i + end do +end subroutine s9