Index: flang/runtime/io-api.cpp =================================================================== --- flang/runtime/io-api.cpp +++ flang/runtime/io-api.cpp @@ -156,6 +156,13 @@ } ExternalFileUnit &unit{ExternalFileUnit::LookUpOrCreateAnonymous( unitNumber, DIR, false /*!unformatted*/, terminator)}; + if (!unit.isUnformatted.has_value()) { + unit.isUnformatted = false; + } + if (*unit.isUnformatted) { + terminator.Crash("%s attempted on unformatted file", what); + return nullptr; + } if (ChildIo * child{unit.GetChildIo()}) { return child->CheckFormattingAndDirection(terminator, what, false, DIR) ? &child->BeginIoStatement>( @@ -166,13 +173,6 @@ terminator.Crash("%s attempted on direct access file", what); return nullptr; } - if (!unit.isUnformatted.has_value()) { - unit.isUnformatted = false; - } - if (*unit.isUnformatted) { - terminator.Crash("%s attempted on unformatted file", what); - return nullptr; - } IoErrorHandler handler{terminator}; unit.SetDirection(DIR, handler); IoStatementState &io{unit.BeginIoStatement>( @@ -202,6 +202,13 @@ } ExternalFileUnit &unit{ExternalFileUnit::LookUpOrCreateAnonymous( unitNumber, DIR, false /*!unformatted*/, terminator)}; + if (!unit.isUnformatted.has_value()) { + unit.isUnformatted = false; + } + if (*unit.isUnformatted) { + terminator.Crash("Formatted I/O attempted on unformatted file"); + return nullptr; + } if (ChildIo * child{unit.GetChildIo()}) { return child->CheckFormattingAndDirection(terminator, DIR == Direction::Output ? "formatted output" @@ -211,13 +218,6 @@ *child, sourceFile, sourceLine) : nullptr; } else { - if (!unit.isUnformatted.has_value()) { - unit.isUnformatted = false; - } - if (*unit.isUnformatted) { - terminator.Crash("Formatted I/O attempted on unformatted file"); - return nullptr; - } IoErrorHandler handler{terminator}; unit.SetDirection(DIR, handler); IoStatementState &io{ @@ -247,6 +247,12 @@ Terminator terminator{sourceFile, sourceLine}; ExternalFileUnit &unit{ExternalFileUnit::LookUpOrCreateAnonymous( unitNumber, DIR, true /*unformatted*/, terminator)}; + if (!unit.isUnformatted.has_value()) { + unit.isUnformatted = true; + } + if (!*unit.isUnformatted) { + terminator.Crash("Unformatted I/O attempted on formatted file"); + } if (ChildIo * child{unit.GetChildIo()}) { return child->CheckFormattingAndDirection(terminator, DIR == Direction::Output ? "unformatted output" @@ -256,12 +262,6 @@ *child, sourceFile, sourceLine) : nullptr; } else { - if (!unit.isUnformatted.has_value()) { - unit.isUnformatted = true; - } - if (!*unit.isUnformatted) { - terminator.Crash("Unformatted I/O attempted on formatted file"); - } IoStatementState &io{ unit.BeginIoStatement>( unit, sourceFile, sourceLine)}; @@ -367,8 +367,13 @@ Cookie IONAME(BeginInquireUnit)( ExternalUnit unitNumber, const char *sourceFile, int sourceLine) { if (ExternalFileUnit * unit{ExternalFileUnit::LookUp(unitNumber)}) { - return &unit->BeginIoStatement( - *unit, sourceFile, sourceLine); + if (ChildIo * child{unit->GetChildIo()}) { + return &child->BeginIoStatement( + *unit, sourceFile, sourceLine); + } else { + return &unit->BeginIoStatement( + *unit, sourceFile, sourceLine); + } } else { // INQUIRE(UNIT=unrecognized unit) Terminator oom{sourceFile, sourceLine}; Index: flang/runtime/unit.h =================================================================== --- flang/runtime/unit.h +++ flang/runtime/unit.h @@ -183,7 +183,7 @@ ChildListIoStatementState, ChildListIoStatementState, ChildUnformattedIoStatementState, - ChildUnformattedIoStatementState> + ChildUnformattedIoStatementState, InquireUnitState> u_; std::optional io_; };