diff --git a/flang/runtime/io-stmt.h b/flang/runtime/io-stmt.h --- a/flang/runtime/io-stmt.h +++ b/flang/runtime/io-stmt.h @@ -302,7 +302,7 @@ private: bool wasExtant_; - OpenStatus status_{OpenStatus::Unknown}; + std::optional status_; Position position_{Position::AsIs}; std::optional action_; OwningPtr path_; diff --git a/flang/runtime/io-stmt.cpp b/flang/runtime/io-stmt.cpp --- a/flang/runtime/io-stmt.cpp +++ b/flang/runtime/io-stmt.cpp @@ -162,11 +162,12 @@ } int OpenStatementState::EndIoStatement() { - if (wasExtant_ && status_ != OpenStatus::Old) { - SignalError("OPEN statement for connected unit must have STATUS='OLD'"); + if (wasExtant_ && status_ && *status_ != OpenStatus::Old) { + SignalError("OPEN statement for connected unit may not have STATUS= other " + "than 'OLD'"); } - unit().OpenUnit( - status_, action_, position_, std::move(path_), pathLength_, *this); + unit().OpenUnit(status_.value_or(OpenStatus::Unknown), action_, position_, + std::move(path_), pathLength_, *this); return ExternalIoStatementBase::EndIoStatement(); }