[flang-commits] [flang] [flang][runtime] Skip unused truncated list-directed character input (PR #118320)

Peter Klausler via flang-commits flang-commits at lists.llvm.org
Mon Dec 2 10:59:36 PST 2024


https://github.com/klausler updated https://github.com/llvm/llvm-project/pull/118320

>From 6936bb0263956df21324cb65118f8a9f142da135 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Mon, 2 Dec 2024 08:36:44 -0800
Subject: [PATCH] [flang][runtime] Skip unused truncated list-directed
 character input

When reading non-delimited list-directed character input, read the
whole field even if it doesn't fit into the variable.

Fixes https://github.com/llvm/llvm-project/issues/118277.
---
 flang/runtime/edit-input.cpp | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/flang/runtime/edit-input.cpp b/flang/runtime/edit-input.cpp
index 2cee35e23f31a3..b5725a90ba82ac 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<int> remaining{length > 0 ? maxUTF8Bytes : 0};
-  while (Fortran::common::optional<char32_t> 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;



More information about the flang-commits mailing list