diff --git a/flang/runtime/edit-input.cpp b/flang/runtime/edit-input.cpp --- a/flang/runtime/edit-input.cpp +++ b/flang/runtime/edit-input.cpp @@ -13,14 +13,24 @@ namespace Fortran::runtime::io { +static std::optional PrepareInput( + IoStatementState &io, const DataEdit &edit, std::optional &remaining) { + remaining.reset(); + if (edit.descriptor == DataEdit::ListDirected) { + io.GetNextNonBlank(); + } else { + if (edit.width.value_or(0) > 0) { + remaining = *edit.width; + } + io.SkipSpaces(remaining); + } + return io.NextInField(remaining); +} + static bool EditBOZInput(IoStatementState &io, const DataEdit &edit, void *n, int base, int totalBitSize) { std::optional remaining; - if (edit.width) { - remaining = std::max(0, *edit.width); - } - io.SkipSpaces(remaining); - std::optional next{io.NextInField(remaining)}; + std::optional next{PrepareInput(io, edit, remaining)}; common::UnsignedInt128 value{0}; for (; next; next = io.NextInField(remaining)) { char32_t ch{*next}; @@ -54,14 +64,7 @@ // Returns false if there's a '-' sign static bool ScanNumericPrefix(IoStatementState &io, const DataEdit &edit, std::optional &next, std::optional &remaining) { - if (edit.descriptor != DataEdit::ListDirected && edit.width) { - remaining = std::max(0, *edit.width); - } else { - // list-directed, namelist, or (nonstandard) 0-width input editing - remaining.reset(); - } - io.SkipSpaces(remaining); - next = io.NextInField(remaining); + next = PrepareInput(io, edit, remaining); bool negative{false}; if (next) { negative = *next == '-'; @@ -310,11 +313,7 @@ return false; } std::optional remaining; - if (edit.width) { - remaining = std::max(0, *edit.width); - } - io.SkipSpaces(remaining); - std::optional next{io.NextInField(remaining)}; + std::optional next{PrepareInput(io, edit, remaining)}; if (next && *next == '.') { // skip optional period next = io.NextInField(remaining); }