diff --git a/flang/include/flang/Runtime/iostat.h b/flang/include/flang/Runtime/iostat.h index 0456e24f4e381..afce509cf1f56 100644 --- a/flang/include/flang/Runtime/iostat.h +++ b/flang/include/flang/Runtime/iostat.h @@ -85,6 +85,7 @@ enum Iostat { IostatBadOpOnChildUnit, IostatBadNewUnit, IostatBadListDirectedInputSeparator, + IostatNonExternalDefinedUnformattedIo, }; const char *IostatErrorString(int); diff --git a/flang/runtime/descriptor-io.cpp b/flang/runtime/descriptor-io.cpp index 563a69e999d5f..3093a23a03513 100644 --- a/flang/runtime/descriptor-io.cpp +++ b/flang/runtime/descriptor-io.cpp @@ -119,7 +119,10 @@ bool DefinedUnformattedIo(IoStatementState &io, const Descriptor &descriptor, // Unformatted I/O must have an external unit (or child thereof). IoErrorHandler &handler{io.GetIoErrorHandler()}; ExternalFileUnit *external{io.GetExternalFileUnit()}; - RUNTIME_CHECK(handler, external != nullptr); + if (!external) { // INQUIRE(IOLENGTH=) + handler.SignalError(IostatNonExternalDefinedUnformattedIo); + return false; + } ChildIo &child{external->PushChildIo(io)}; int unit{external->unitNumber()}; int ioStat{IostatOk}; diff --git a/flang/runtime/iostat.cpp b/flang/runtime/iostat.cpp index cc5641693a078..c993b778e9e1f 100644 --- a/flang/runtime/iostat.cpp +++ b/flang/runtime/iostat.cpp @@ -115,6 +115,8 @@ const char *IostatErrorString(int iostat) { return "NEWUNIT= without FILE= or STATUS='SCRATCH'"; case IostatBadListDirectedInputSeparator: return "List-directed input value has trailing unused characters"; + case IostatNonExternalDefinedUnformattedIo: + return "Defined unformatted I/O without an external unit"; default: return nullptr; }