[flang][runtime] Handle array components in NAMELIST input
A namelist input item that is a derived type component reference needs additional processing when the base item or the component is an array. When both have rank > 0, the component reference must of course be subscripted. Differential Revision: https://reviews.llvm.org/D135218
This commit is contained in:
parent
d96ade00c3
commit
6e7df70e5a
|
@ -310,7 +310,42 @@ static bool HandleComponent(IoStatementState &io, Descriptor &desc,
|
|||
type{addendum ? addendum->derivedType() : nullptr}) {
|
||||
if (const typeInfo::Component *
|
||||
comp{type->FindDataComponent(compName, std::strlen(compName))}) {
|
||||
bool createdDesc{false};
|
||||
if (comp->rank() > 0 && source.rank() > 0) {
|
||||
// If base and component are both arrays, the component name
|
||||
// must be followed by subscripts; process them now.
|
||||
std::size_t byteCount{0};
|
||||
if (std::optional<char32_t> next{io.GetNextNonBlank(byteCount)};
|
||||
next && *next == '(') {
|
||||
io.HandleRelativePosition(byteCount); // skip over '('
|
||||
StaticDescriptor<maxRank, true, 16> staticDesc;
|
||||
Descriptor &tmpDesc{staticDesc.descriptor()};
|
||||
comp->CreatePointerDescriptor(tmpDesc, source, handler);
|
||||
if (!HandleSubscripts(io, desc, tmpDesc, compName)) {
|
||||
return false;
|
||||
}
|
||||
createdDesc = true;
|
||||
}
|
||||
}
|
||||
if (!createdDesc) {
|
||||
comp->CreatePointerDescriptor(desc, source, handler);
|
||||
}
|
||||
if (source.rank() > 0) {
|
||||
if (desc.rank() > 0) {
|
||||
handler.SignalError(
|
||||
"NAMELIST component reference '%%%s' of input group "
|
||||
"item %s cannot be an array when its base is not scalar",
|
||||
compName, name);
|
||||
return false;
|
||||
}
|
||||
desc.raw().rank = source.rank();
|
||||
for (int j{0}; j < source.rank(); ++j) {
|
||||
const auto &srcDim{source.GetDimension(j)};
|
||||
desc.GetDimension(j)
|
||||
.SetBounds(1, srcDim.UpperBound())
|
||||
.SetByteStride(srcDim.ByteStride());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
handler.SignalError(
|
||||
|
|
Loading…
Reference in New Issue