[flang][runtime] Don't loop in runtime if blank appears in BOZ input
authorPeter Klausler <pklausler@nvidia.com>
Wed, 8 Jun 2022 21:52:01 +0000 (14:52 -0700)
committerPeter Klausler <pklausler@nvidia.com>
Mon, 13 Jun 2022 23:26:50 +0000 (16:26 -0700)
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

flang/runtime/edit-input.cpp

index cfcb98b68144b820209fa13783e4e577a461cfda..57a935fd5765875ca68e0eddef4d40f90cb4e746 100644 (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);