[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:
Peter Klausler 2022-10-04 14:14:05 -07:00
parent d96ade00c3
commit 6e7df70e5a
1 changed files with 36 additions and 1 deletions

View File

@ -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))}) {
comp->CreatePointerDescriptor(desc, source, handler);
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(