Skip to content
8 changes: 8 additions & 0 deletions flang/lib/Semantics/resolve-names.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
20 changes: 20 additions & 0 deletions flang/test/Semantics/resolve55.f90
Original file line number Diff line number Diff line change
Expand Up @@ -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