[flang-commits] [flang] [llvm] [Flang] [Runtime ]Fix write endfile abort (PR #191633)

via flang-commits flang-commits at lists.llvm.org
Sat Apr 11 09:28:32 PDT 2026


https://github.com/blazie2004 updated https://github.com/llvm/llvm-project/pull/191633

>From 17c54cd23fab01a302955765edba64a9611aa417 Mon Sep 17 00:00:00 2001
From: Jay Satish Kumar Patel <kumarpat at pe31.hpc.amslabs.hpecorp.net>
Date: Sat, 11 Apr 2026 08:51:39 -0500
Subject: [PATCH 1/2] Fix WRITE after ENDFILE abort

---
 flang-rt/include/flang-rt/runtime/io-error.h |  4 +++
 flang-rt/lib/runtime/unit.cpp                |  2 +-
 flang/test/Runtime/write-after-endfile.f90   | 29 ++++++++++++++++++++
 3 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 flang/test/Runtime/write-after-endfile.f90

diff --git a/flang-rt/include/flang-rt/runtime/io-error.h b/flang-rt/include/flang-rt/runtime/io-error.h
index d2180a83f8c3c..4691a0ff5b8cd 100644
--- a/flang-rt/include/flang-rt/runtime/io-error.h
+++ b/flang-rt/include/flang-rt/runtime/io-error.h
@@ -34,6 +34,10 @@ class IoErrorHandler : public Terminator {
   RT_API_ATTRS void HasEorLabel() { flags_ |= hasEor; }
   RT_API_ATTRS void HasIoMsg() { flags_ |= hasIoMsg; }
   RT_API_ATTRS void HasRec() { flags_ |= hasRec; }
+  RT_API_ATTRS void SignalPendingIoStat(int iostat) {
+  if (ioStat_ == IostatOk || ioStat_ == IostatEnd || ioStat_ == IostatEor)
+    ioStat_ = iostat;
+}
 
   RT_API_ATTRS bool InError() const {
     return ioStat_ != IostatOk || pendingError_ != IostatOk;
diff --git a/flang-rt/lib/runtime/unit.cpp b/flang-rt/lib/runtime/unit.cpp
index c577ae7673127..32a48cd4fe3ef 100644
--- a/flang-rt/lib/runtime/unit.cpp
+++ b/flang-rt/lib/runtime/unit.cpp
@@ -84,7 +84,7 @@ bool ExternalFileUnit::Emit(const char *data, std::size_t bytes,
     beganReadingRecord_ = false;
   }
   if (IsAfterEndfile()) {
-    handler.SignalError(IostatWriteAfterEndfile);
+     handler.SignalPendingIoStat(IostatWriteAfterEndfile);
     return false;
   }
   CheckDirectAccess(handler);
diff --git a/flang/test/Runtime/write-after-endfile.f90 b/flang/test/Runtime/write-after-endfile.f90
new file mode 100644
index 0000000000000..c519bb4b649a0
--- /dev/null
+++ b/flang/test/Runtime/write-after-endfile.f90
@@ -0,0 +1,29 @@
+! RUN: %flang %s -o %t && %t | FileCheck %s
+! CHECK: k= {{ *}}2
+
+
+program test_write_after_endfile
+  implicit none
+  integer :: n, k
+
+  open(10, status='scratch')
+
+  write(10,*) 123
+  endfile(10)
+
+  ! This should NOT crash; should go to ERR label
+  write(10, err=100, iostat=n) 456
+  k = 1
+  goto 200
+
+100 continue
+  k = 2
+
+200 continue
+  print *, "k=", k
+end program
+
+
+
+
+

>From 5c7c9eceec533214ff98d5b0e18ca7b7ff6ec043 Mon Sep 17 00:00:00 2001
From: Jay Satish Kumar Patel <kumarpat at pe31.hpc.amslabs.hpecorp.net>
Date: Sat, 11 Apr 2026 11:28:09 -0500
Subject: [PATCH 2/2] fixed formatting

---
 flang-rt/include/flang-rt/runtime/io-error.h | 6 +++---
 flang-rt/lib/runtime/unit.cpp                | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/flang-rt/include/flang-rt/runtime/io-error.h b/flang-rt/include/flang-rt/runtime/io-error.h
index 4691a0ff5b8cd..088fc76a7909a 100644
--- a/flang-rt/include/flang-rt/runtime/io-error.h
+++ b/flang-rt/include/flang-rt/runtime/io-error.h
@@ -35,9 +35,9 @@ class IoErrorHandler : public Terminator {
   RT_API_ATTRS void HasIoMsg() { flags_ |= hasIoMsg; }
   RT_API_ATTRS void HasRec() { flags_ |= hasRec; }
   RT_API_ATTRS void SignalPendingIoStat(int iostat) {
-  if (ioStat_ == IostatOk || ioStat_ == IostatEnd || ioStat_ == IostatEor)
-    ioStat_ = iostat;
-}
+    if (ioStat_ == IostatOk || ioStat_ == IostatEnd || ioStat_ == IostatEor)
+      ioStat_ = iostat;
+  }
 
   RT_API_ATTRS bool InError() const {
     return ioStat_ != IostatOk || pendingError_ != IostatOk;
diff --git a/flang-rt/lib/runtime/unit.cpp b/flang-rt/lib/runtime/unit.cpp
index 32a48cd4fe3ef..5dfc1702234a3 100644
--- a/flang-rt/lib/runtime/unit.cpp
+++ b/flang-rt/lib/runtime/unit.cpp
@@ -84,7 +84,7 @@ bool ExternalFileUnit::Emit(const char *data, std::size_t bytes,
     beganReadingRecord_ = false;
   }
   if (IsAfterEndfile()) {
-     handler.SignalPendingIoStat(IostatWriteAfterEndfile);
+    handler.SignalPendingIoStat(IostatWriteAfterEndfile);
     return false;
   }
   CheckDirectAccess(handler);



More information about the flang-commits mailing list