From: peter klausler Date: Thu, 28 Feb 2019 01:03:40 +0000 (-0800) Subject: [flang] fix flang-compiler/f18#303, better error recovery for misplaced type paramete... X-Git-Tag: llvmorg-12-init~9537^2~1714 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6a56782b2f9598e4e402f01c61d0b619812162f9;p=platform%2Fupstream%2Fllvm.git [flang] fix flang-compiler/f18#303, better error recovery for misplaced type parameter declarations Original-commit: flang-compiler/f18@ebaa23cbcd91ba83b65b8dd174baffab1395bc65 Reviewed-on: https://github.com/flang-compiler/f18/pull/307 --- diff --git a/flang/lib/parser/grammar.h b/flang/lib/parser/grammar.h index 79e4365..6d99f4a 100644 --- a/flang/lib/parser/grammar.h +++ b/flang/lib/parser/grammar.h @@ -745,9 +745,9 @@ TYPE_PARSER(construct("SEQUENCE"_tok)) // R732 type-param-def-stmt -> // integer-type-spec , type-param-attr-spec :: type-param-decl-list // R734 type-param-attr-spec -> KIND | LEN -TYPE_PARSER(construct(integerTypeSpec / ",", - "KIND" >> pure(common::TypeParamAttr::Kind) || - "LEN" >> pure(common::TypeParamAttr::Len), +constexpr auto kindOrLen{"KIND" >> pure(common::TypeParamAttr::Kind) || + "LEN" >> pure(common::TypeParamAttr::Len)}; +TYPE_PARSER(construct(integerTypeSpec / ",", kindOrLen, "::" >> nonemptyList("expected type parameter declarations"_err_en_US, Parser{}))) @@ -784,7 +784,11 @@ TYPE_PARSER(construct(accessSpec) || construct("CODIMENSION" >> coarraySpec) || construct(contiguous) || construct("DIMENSION" >> Parser{}) || - construct(pointer)) + construct(pointer) || + construct(recovery( + fail( + "type parameter definitions must appear before component declarations"_err_en_US), + kindOrLen >> construct()))) // R739 component-decl -> // component-name [( component-array-spec )] diff --git a/flang/lib/parser/parse-tree.h b/flang/lib/parser/parse-tree.h index 3f2020e..eabc7bb 100644 --- a/flang/lib/parser/parse-tree.h +++ b/flang/lib/parser/parse-tree.h @@ -954,7 +954,7 @@ EMPTY_CLASS(Contiguous); struct ComponentAttrSpec { UNION_CLASS_BOILERPLATE(ComponentAttrSpec); std::variant + ComponentArraySpec, Pointer, ErrorRecovery> u; };