From: peter klausler Date: Wed, 21 Jul 2021 20:07:04 +0000 (-0700) Subject: [flang] Runtime: Reset list-directed input state for each NAMELIST item X-Git-Tag: llvmorg-14-init~398 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e093cbb7ae1448379cad5520db5dfa5cf0b06bdf;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/flang/runtime/io-stmt.h b/flang/runtime/io-stmt.h index 4996435..eeae510 100644 --- a/flang/runtime/io-stmt.h +++ b/flang/runtime/io-stmt.h @@ -217,6 +217,16 @@ public: std::optional 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_; diff --git a/flang/runtime/namelist.cpp b/flang/runtime/namelist.cpp index 72d669f..7ca8d5c 100644 --- a/flang/runtime/namelist.cpp +++ b/flang/runtime/namelist.cpp @@ -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>()}; + RUNTIME_CHECK(handler, listInput != nullptr); // Check the group header std::optional 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(io, *useDescriptor)) { return false; }