diff --git a/flang/runtime/edit-input.cpp b/flang/runtime/edit-input.cpp index 2cee35e23f31a..b5725a90ba82a 100644 --- a/flang/runtime/edit-input.cpp +++ b/flang/runtime/edit-input.cpp @@ -976,14 +976,10 @@ static RT_API_ATTRS bool EditListDirectedCharacterInput( return false; } // Undelimited list-directed character input: stop at a value separator - // or the end of the current record. Subtlety: the "remaining" count - // here is a dummy that's used to avoid the interpretation of separators - // in NextInField. - Fortran::common::optional remaining{length > 0 ? maxUTF8Bytes : 0}; - while (Fortran::common::optional next{ - io.NextInField(remaining, edit)}) { + // or the end of the current record. + while (auto ch{io.GetCurrentChar(byteCount)}) { bool isSep{false}; - switch (*next) { + switch (*ch) { case ' ': case '\t': case '/': @@ -1003,11 +999,17 @@ static RT_API_ATTRS bool EditListDirectedCharacterInput( break; } if (isSep) { - remaining = 0; - } else { - *x++ = *next; - remaining = --length > 0 ? maxUTF8Bytes : 0; + break; + } + if (length > 0) { + *x++ = *ch; + --length; + } else if (edit.IsNamelist()) { + // GNU compatibility + break; } + io.HandleRelativePosition(byteCount); + io.GotChar(byteCount); } Fortran::runtime::fill_n(x, length, ' '); return true;