[flang] Check for ultimate ALLOCATABLE component in LOCAL_INIT() (#145800)
Fortran 2023 constraint C1130 disallows variables of derived type with ultimate allocatable component to appear in LOCAL_INIT().
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user