From: Peter Klausler Date: Fri, 6 Jan 2023 01:04:10 +0000 (-0800) Subject: [flang][parser] Diagnose an invalid space X-Git-Tag: upstream/17.0.6~19362 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c7f8bc0ee8d391e47286adcf6998a217bcfebd32;p=platform%2Fupstream%2Fllvm.git [flang][parser] Diagnose an invalid space In free form, don't silently skip over an invalid space between an underscore and a kind parameter. Differential Revision: https://reviews.llvm.org/D142760 --- diff --git a/flang/lib/Parser/Fortran-parsers.cpp b/flang/lib/Parser/Fortran-parsers.cpp index a6bec93517ce..1e7d7deed0a4 100644 --- a/flang/lib/Parser/Fortran-parsers.cpp +++ b/flang/lib/Parser/Fortran-parsers.cpp @@ -230,19 +230,24 @@ TYPE_PARSER(construct( construct(construct( "*" >> digitString64 / spaceCheck)))) +constexpr auto noSpace{ + recovery(withMessage("invalid space"_err_en_US, !" "_ch), space)}; + // R707 signed-int-literal-constant -> [sign] int-literal-constant -TYPE_PARSER(sourced(construct( - SignedIntLiteralConstantWithoutKind{}, maybe(underscore >> kindParam)))) +TYPE_PARSER(sourced( + construct(SignedIntLiteralConstantWithoutKind{}, + maybe(noSpace >> underscore >> noSpace >> kindParam)))) // R708 int-literal-constant -> digit-string [_ kind-param] // The negated look-ahead for a trailing underscore prevents misrecognition // when the digit string is a numeric kind parameter of a character literal. -TYPE_PARSER(construct( - space >> digitString, maybe(underscore >> kindParam) / !underscore)) +TYPE_PARSER(construct(space >> digitString, + maybe(underscore >> noSpace >> kindParam) / !underscore)) // R709 kind-param -> digit-string | scalar-int-constant-name TYPE_PARSER(construct(digitString64) || - construct(scalar(integer(constant(name))))) + construct( + scalar(integer(constant(sourced(rawName >> construct())))))) // R712 sign -> + | - // N.B. A sign constitutes a whole token, so a space is allowed in free form @@ -278,7 +283,7 @@ TYPE_CONTEXT_PARSER("REAL literal constant"_en_US, "."_ch >> digitString >> maybe(exponentPart) >> ok || digitString >> exponentPart >> ok) >> construct()), - maybe(underscore >> kindParam))) + maybe(noSpace >> underscore >> noSpace >> kindParam))) // R718 complex-literal-constant -> ( real-part , imag-part ) TYPE_CONTEXT_PARSER("COMPLEX literal constant"_en_US, @@ -343,10 +348,10 @@ TYPE_CONTEXT_PARSER( // R725 logical-literal-constant -> // .TRUE. [_ kind-param] | .FALSE. [_ kind-param] // Also accept .T. and .F. as extensions. -TYPE_PARSER(construct( - logicalTRUE, maybe(underscore >> kindParam)) || +TYPE_PARSER(construct(logicalTRUE, + maybe(noSpace >> underscore >> noSpace >> kindParam)) || construct( - logicalFALSE, maybe(underscore >> kindParam))) + logicalFALSE, maybe(noSpace >> underscore >> noSpace >> kindParam))) // R726 derived-type-def -> // derived-type-stmt [type-param-def-stmt]... diff --git a/flang/test/Parser/bad-space.f90 b/flang/test/Parser/bad-space.f90 new file mode 100644 index 000000000000..3b086b070db6 --- /dev/null +++ b/flang/test/Parser/bad-space.f90 @@ -0,0 +1,4 @@ +! RUN: not %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck %s +! CHECK: 3:8: error: invalid space +x = 1._ 4 +end