[flang] Support legacy extension OPEN(ACCESS='APPEND')

It should of course be POSITION='APPEND' but Sun Fortran
supported it on ACCESS=.

Differential Revision: https://reviews.llvm.org/D102350
This commit is contained in:
peter klausler 2021-05-12 12:03:21 -07:00
parent fe319a8848
commit 72abc19977
4 changed files with 18 additions and 5 deletions

View File

@ -134,6 +134,8 @@ accepted if enabled by command-line options.
bound, in a scope with IMPLICIT NONE(TYPE) if the name
of the dummy argument would have caused it to be implicitly typed
as default INTEGER if IMPLICIT NONE(TYPE) were absent.
* OPEN(ACCESS='APPEND') is interpreted as OPEN(POSITION='APPEND')
to ease porting from Sun Fortran.
### Extensions supported when enabled by options

View File

@ -30,7 +30,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines,
EquivalenceNumericWithCharacter, AdditionalIntrinsics, AnonymousParents,
OldLabelDoEndStatements, LogicalIntegerAssignment, EmptySourceFile,
ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways,
ForwardRefDummyImplicitNone)
ForwardRefDummyImplicitNone, OpenAccessAppend)
using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>;

View File

@ -831,9 +831,16 @@ void IoChecker::CheckStringValue(IoSpecKind specKind, const std::string &value,
{IoSpecKind::Convert, {"BIG_ENDIAN", "LITTLE_ENDIAN", "NATIVE"}},
{IoSpecKind::Dispose, {"DELETE", "KEEP"}},
};
if (!specValues.at(specKind).count(parser::ToUpperCaseLetters(value))) {
context_.Say(source, "Invalid %s value '%s'"_err_en_US,
parser::ToUpperCaseLetters(common::EnumToString(specKind)), value);
auto upper{parser::ToUpperCaseLetters(value)};
if (specValues.at(specKind).count(upper) == 0) {
if (specKind == IoSpecKind::Access && upper == "APPEND" &&
context_.languageFeatures().ShouldWarn(
common::LanguageFeature::OpenAccessAppend)) {
context_.Say(source, "ACCESS='%s' interpreted as POSITION='%s'"_en_US, value, upper);
} else {
context_.Say(source, "Invalid %s value '%s'"_err_en_US,
parser::ToUpperCaseLetters(common::EnumToString(specKind)), value);
}
}
}

View File

@ -589,7 +589,8 @@ bool IONAME(SetAccess)(Cookie cookie, const char *keyword, std::size_t length) {
io.GetIoErrorHandler().Crash(
"SetAccess() called when not in an OPEN statement");
}
static const char *keywords[]{"SEQUENTIAL", "DIRECT", "STREAM", nullptr};
static const char *keywords[]{
"SEQUENTIAL", "DIRECT", "STREAM", "APPEND", nullptr};
switch (IdentifyValue(keyword, length, keywords)) {
case 0:
open->set_access(Access::Sequential);
@ -600,6 +601,9 @@ bool IONAME(SetAccess)(Cookie cookie, const char *keyword, std::size_t length) {
case 2:
open->set_access(Access::Stream);
break;
case 3: // Sun Fortran extension ACCESS=APPEND: treat as if POSITION=APPEND
open->set_position(Position::Append);
break;
default:
open->SignalError(IostatErrorInKeyword, "Invalid ACCESS='%.*s'",
static_cast<int>(length), keyword);