From cfa032cea0a165ad803fbfdd17e805052e2f3640 Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Thu, 20 Jul 2023 14:44:46 -0700 Subject: [flang] Emit just one warning for a bad format edit descriptor An attempt to use an edit descriptor (other than A or L) in a FORMAT statement without arequired 'w' width will elicit warnings from both the parser and the I/O checker in semantics. Remove the warning from the parser. Differential Revision: https://reviews.llvm.org/D155977 --- flang/include/flang/Common/format.h | 2 +- flang/lib/Parser/io-parsers.cpp | 42 ++++++++++++++++++------------------- 2 files changed, 21 insertions(+), 23 deletions(-) (limited to 'flang') diff --git a/flang/include/flang/Common/format.h b/flang/include/flang/Common/format.h index 0137da5..2374ff6 100644 --- a/flang/include/flang/Common/format.h +++ b/flang/include/flang/Common/format.h @@ -471,7 +471,7 @@ template bool FormatValidator::check_w() { NextToken(); return true; } - if (*argString_ != 'A') { + if (*argString_ != 'A' && *argString_ != 'L') { ReportWarning("Expected '%s' edit descriptor 'w' value"); // C1306 } return false; diff --git a/flang/lib/Parser/io-parsers.cpp b/flang/lib/Parser/io-parsers.cpp index 8c08281..ca0dbed 100644 --- a/flang/lib/Parser/io-parsers.cpp +++ b/flang/lib/Parser/io-parsers.cpp @@ -601,28 +601,26 @@ TYPE_PARSER(construct( "A " >> pure(format::IntrinsicTypeDataEditDesc::Kind::A), maybe(width), noInt, noInt) || // PGI/Intel extension: omitting width (and all else that follows) - extension( - "nonstandard usage: abbreviated edit descriptor"_port_en_US, - construct( - "I " >> pure(format::IntrinsicTypeDataEditDesc::Kind::I) || - ("B "_tok / !letter /* don't occlude BN & BZ */) >> - pure(format::IntrinsicTypeDataEditDesc::Kind::B) || - "O " >> pure(format::IntrinsicTypeDataEditDesc::Kind::O) || - "Z " >> pure(format::IntrinsicTypeDataEditDesc::Kind::Z) || - "F " >> pure(format::IntrinsicTypeDataEditDesc::Kind::F) || - ("D "_tok / !letter /* don't occlude DT, DC, & DP */) >> - pure(format::IntrinsicTypeDataEditDesc::Kind::D) || - "E " >> - ("N " >> - pure(format::IntrinsicTypeDataEditDesc::Kind::EN) || - "S " >> - pure(format::IntrinsicTypeDataEditDesc::Kind::ES) || - "X " >> - pure(format::IntrinsicTypeDataEditDesc::Kind::EX) || - pure(format::IntrinsicTypeDataEditDesc::Kind::E)) || - "G " >> pure(format::IntrinsicTypeDataEditDesc::Kind::G) || - "L " >> pure(format::IntrinsicTypeDataEditDesc::Kind::L), - noInt, noInt, noInt))) + // Parse them just to get them to the I/O checker in semantics; + // they are not supported by the runtime. + extension(construct< + format::IntrinsicTypeDataEditDesc>( + "I " >> pure(format::IntrinsicTypeDataEditDesc::Kind::I) || + ("B "_tok / !letter /* don't occlude BN & BZ */) >> + pure(format::IntrinsicTypeDataEditDesc::Kind::B) || + "O " >> pure(format::IntrinsicTypeDataEditDesc::Kind::O) || + "Z " >> pure(format::IntrinsicTypeDataEditDesc::Kind::Z) || + "F " >> pure(format::IntrinsicTypeDataEditDesc::Kind::F) || + ("D "_tok / !letter /* don't occlude DT, DC, & DP */) >> + pure(format::IntrinsicTypeDataEditDesc::Kind::D) || + "E " >> + ("N " >> pure(format::IntrinsicTypeDataEditDesc::Kind::EN) || + "S " >> pure(format::IntrinsicTypeDataEditDesc::Kind::ES) || + "X " >> pure(format::IntrinsicTypeDataEditDesc::Kind::EX) || + pure(format::IntrinsicTypeDataEditDesc::Kind::E)) || + "G " >> pure(format::IntrinsicTypeDataEditDesc::Kind::G) || + "L " >> pure(format::IntrinsicTypeDataEditDesc::Kind::L), + noInt, noInt, noInt))) // R1307 data-edit-desc (part 2 of 2) // R1312 v -> [sign] digit-string -- cgit v1.1