Index: flang/docs/Extensions.md =================================================================== --- flang/docs/Extensions.md +++ flang/docs/Extensions.md @@ -585,3 +585,7 @@ * `EXTENDS_TYPE_OF()` returns `.TRUE.` if both of its arguments have the same type, a case that is technically implementation-defined. + +* `ENCODING=` is not in the list of changeable modes on an I/O unit, + but every Fortran compiler allows the encoding to be changed on an + open unit. Index: flang/runtime/io-api.cpp =================================================================== --- flang/runtime/io-api.cpp +++ flang/runtime/io-api.cpp @@ -927,25 +927,20 @@ io.GetIoErrorHandler().Crash( "SetEncoding() called after GetNewUnit() for an OPEN statement"); } - bool isUTF8{false}; + // Allow the encoding to be changed on an open unit -- it's + // useful and safe. static const char *keywords[]{"UTF-8", "DEFAULT", nullptr}; switch (IdentifyValue(keyword, length, keywords)) { case 0: - isUTF8 = true; + open->unit().isUTF8 = true; break; case 1: - isUTF8 = false; + open->unit().isUTF8 = false; break; default: open->SignalError(IostatErrorInKeyword, "Invalid ENCODING='%.*s'", static_cast(length), keyword); } - if (isUTF8 != open->unit().isUTF8) { - if (open->wasExtant()) { - open->SignalError("ENCODING= may not be changed on an open unit"); - } - open->unit().isUTF8 = isUTF8; - } return true; }