diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md index f25f0d1e0ca39..e84bceee5ca7c 100644 --- a/flang/docs/Extensions.md +++ b/flang/docs/Extensions.md @@ -411,6 +411,8 @@ end is accepted before an array specification (`ch*3(2)`) as well as afterwards. * A zero field width is allowed for logical formatted output (`L0`). +* `OPEN(..., FORM='BINARY')` is accepted as a legacy synonym for + the standard `OPEN(..., FORM='UNFORMATTED', ACCESS='STREAM')`. ### Extensions supported when enabled by options diff --git a/flang/lib/Semantics/check-io.cpp b/flang/lib/Semantics/check-io.cpp index 3c99163c1f134..42c3b9e11efc1 100644 --- a/flang/lib/Semantics/check-io.cpp +++ b/flang/lib/Semantics/check-io.cpp @@ -920,7 +920,7 @@ void IoChecker::CheckStringValue(IoSpecKind specKind, const std::string &value, {IoSpecKind::Decimal, {"COMMA", "POINT"}}, {IoSpecKind::Delim, {"APOSTROPHE", "NONE", "QUOTE"}}, {IoSpecKind::Encoding, {"DEFAULT", "UTF-8"}}, - {IoSpecKind::Form, {"FORMATTED", "UNFORMATTED"}}, + {IoSpecKind::Form, {"FORMATTED", "UNFORMATTED", "BINARY"}}, {IoSpecKind::Pad, {"NO", "YES"}}, {IoSpecKind::Position, {"APPEND", "ASIS", "REWIND"}}, {IoSpecKind::Round, diff --git a/flang/runtime/io-api.cpp b/flang/runtime/io-api.cpp index 9dfa09ab332c2..dc3f6f87fc21b 100644 --- a/flang/runtime/io-api.cpp +++ b/flang/runtime/io-api.cpp @@ -887,7 +887,7 @@ bool IODEF(SetForm)(Cookie cookie, const char *keyword, std::size_t length) { io.GetIoErrorHandler().Crash( "SetForm() called after GetNewUnit() for an OPEN statement"); } - static const char *keywords[]{"FORMATTED", "UNFORMATTED", nullptr}; + static const char *keywords[]{"FORMATTED", "UNFORMATTED", "BINARY", nullptr}; switch (IdentifyValue(keyword, length, keywords)) { case 0: open->set_isUnformatted(false); @@ -895,6 +895,10 @@ bool IODEF(SetForm)(Cookie cookie, const char *keyword, std::size_t length) { case 1: open->set_isUnformatted(true); break; + case 2: // legacy FORM='BINARY' means an unformatted stream + open->set_isUnformatted(true); + open->set_access(Access::Stream); + break; default: open->SignalError(IostatErrorInKeyword, "Invalid FORM='%.*s'", static_cast(length), keyword);