[flang] Catch attempts to initialize allocatable components with DATA statement

Nice try, but no, you can't initialize an instance of a derived type using a
structure constructor that has a component corresponding to an allocatable
component.

Differential Revision: https://reviews.llvm.org/D140144
This commit is contained in:
Peter Klausler 2022-12-16 16:47:06 -08:00
parent 852db8e97e
commit 12ec5b20c2
2 changed files with 8 additions and 0 deletions

View File

@ -33,6 +33,8 @@ auto InitialImage::Add(ConstantSubscript offset, std::size_t bytes,
return SizeMismatch;
} else if (IsPointer(component)) {
AddPointer(offset + component.offset(), indExpr.value());
} else if (IsAllocatable(component) || IsAutomatic(component)) {
return NotAConstant;
} else {
Result added{Add(offset + component.offset(), component.size(),
indExpr.value(), context)};

View File

@ -11,6 +11,9 @@ module m1
integer, parameter :: repeat = -1
integer :: myAge = 2
type(person) associated
type hasAlloc
integer, allocatable :: a(:)
end type
end
subroutine CheckRepeat
@ -63,4 +66,7 @@ subroutine CheckValue
data y / a(i) /
!ERROR: DATA statement value 'b(1_8)' for 'z' is not a constant
data z / b(1) /
type(hasAlloc) ha
!ERROR: DATA statement value 'hasalloc(a=0_4)' for 'ha' is not a constant
data ha / hasAlloc(0) /
end