[flang][runtime] Don't loop in runtime if blank appears in BOZ input

The code for scanning BOZ input allows for blanks and tabs to appear,
but can hang if they do and the BOZ input value is not followed by
extra valid digits; the repositioning for the second sweep simply
needed to be done in units of character, not valid digits.

Differential Revision: https://reviews.llvm.org/D127431
This commit is contained in:
Peter Klausler 2022-06-08 14:52:01 -07:00
parent f472c099be
commit 850097d6dc
1 changed files with 4 additions and 2 deletions

View File

@ -21,14 +21,16 @@ static bool EditBOZInput(
IoStatementState &io, const DataEdit &edit, void *n, std::size_t bytes) {
std::optional<int> remaining;
std::optional<char32_t> next{io.PrepareInput(edit, remaining)};
if (*next == '0') {
if (next.value_or('?') == '0') {
do {
next = io.NextInField(remaining, edit);
} while (next && *next == '0');
}
// Count significant digits after any leading white space & zeroes
int digits{0};
int chars{0};
for (; next; next = io.NextInField(remaining, edit)) {
++chars;
char32_t ch{*next};
if (ch == ' ' || ch == '\t') {
continue;
@ -52,7 +54,7 @@ static bool EditBOZInput(
return false;
}
// Reset to start of significant digits
io.HandleRelativePosition(-digits);
io.HandleRelativePosition(-chars);
remaining.reset();
// Make a second pass now that the digit count is known
std::memset(n, 0, bytes);