[flang] Runtime: Reset list-directed input state for each NAMELIST item

NAMELIST I/O formatting uses the runtime infrastructure for
list-directed I/O.  List-directed input processing has same state
that requires reinitialization for each successive NAMELIST input
item.  This patch fixes bugs with "null" items and repetition counts
on NAMELIST input items after the first in the group.

Differential Revision: https://reviews.llvm.org/D106694
This commit is contained in:
peter klausler 2021-07-21 13:07:04 -07:00
parent 80ac12b70b
commit e093cbb7ae
2 changed files with 13 additions and 0 deletions

View File

@ -217,6 +217,16 @@ public:
std::optional<DataEdit> GetNextDataEdit(
IoStatementState &, int maxRepeat = 1);
// Each NAMELIST input item is a distinct "list-directed"
// input statement. This member function resets this state
// so that repetition and null values work correctly for each
// successive NAMELIST input item.
void ResetForNextNamelistItem() {
remaining_ = 0;
isFirstItem_ = true;
realPart_ = imaginaryPart_ = false;
}
private:
int remaining_{0}; // for "r*" repetition
std::int64_t initialRecordNumber_;

View File

@ -260,6 +260,8 @@ bool IONAME(InputNamelist)(Cookie cookie, const NamelistGroup &group) {
ConnectionState &connection{io.GetConnectionState()};
connection.modes.inNamelist = true;
IoErrorHandler &handler{io.GetIoErrorHandler()};
auto *listInput{io.get_if<ListDirectedStatementState<Direction::Input>>()};
RUNTIME_CHECK(handler, listInput != nullptr);
// Check the group header
std::optional<char32_t> next{io.GetNextNonBlank()};
if (!next || *next != '&') {
@ -331,6 +333,7 @@ bool IONAME(InputNamelist)(Cookie cookie, const NamelistGroup &group) {
}
io.HandleRelativePosition(1);
// Read the values into the descriptor
listInput->ResetForNextNamelistItem();
if (!descr::DescriptorIO<Direction::Input>(io, *useDescriptor)) {
return false;
}