[flang] Set default form if unspecified at end of OPEN statement

The standard specifies that the form must be set to a default at the
end of an open statement (C.7.4 point 2) where it was not specified.
Only in the case of a pre-connected unit can the form be deferred
until the first data transfer statement.

Set back the default form setting in OpenStatementState::EndIoStatement
that had been removed when deferring the pre-connected unit from setting
in 199a623ebf.

Also return "UNDEFINED" instead of "UNKNOWN" to the FORM inquiry when the
form was not yet specified as defined in 12.10.2.12.

Related test: syntax 215a216.

Differential Revision: https://reviews.llvm.org/D108990
This commit is contained in:
Jean Perier 2021-09-01 08:39:39 +02:00
parent a78dd726f4
commit c5729f2e63
1 changed files with 5 additions and 1 deletions

View File

@ -243,6 +243,10 @@ int OpenStatementState::EndIoStatement() {
}
unit().isUnformatted = *isUnformatted_;
}
if (!unit().isUnformatted) {
// Set default format (C.7.4 point 2).
unit().isUnformatted = unit().access != Access::Sequential;
}
return ExternalIoStatementBase::EndIoStatement();
}
@ -969,7 +973,7 @@ bool InquireUnitState::Inquire(
: "ASCII";
break;
case HashInquiryKeyword("FORM"):
str = !unit().isUnformatted ? "UNKNOWN"
str = !unit().isUnformatted ? "UNDEFINED"
: *unit().isUnformatted ? "UNFORMATTED"
: "FORMATTED";
break;