From: Jakub Jelinek Date: Tue, 26 Nov 2019 21:58:22 +0000 (+0100) Subject: re PR c++/92648 (Handling of unknown attributes) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4e4a8c28f3da0264eb76dff0efe21b4b5ce63b84;p=gcc.git re PR c++/92648 (Handling of unknown attributes) PR c++/92648 * parser.c (cp_parser_std_attribute): For unknown attributes, skip balanced token seq instead of trying to parse attribute-argument-clause as expression list. Formatting fix. * g++.dg/cpp0x/gen-attrs-71.C: New test. From-SVN: r278737 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index be36daaa516..a7c0bca9e31 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2019-11-26 Jakub Jelinek + PR c++/92648 + * parser.c (cp_parser_std_attribute): For unknown attributes, + skip balanced token seq instead of trying to parse + attribute-argument-clause as expression list. Formatting fix. + PR c++/61414 * class.c (enum_to_min_precision): New hash_map. (enum_min_precision): New function. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index be3128634b1..d0c9ff01d9e 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -26629,6 +26629,15 @@ cp_parser_std_attribute (cp_parser *parser, tree attr_ns) /* A GNU attribute that takes an identifier in parameter. */ attr_flag = id_attr; + if (as == NULL) + { + /* For unknown attributes, just skip balanced tokens instead of + trying to parse the arguments. */ + for (size_t n = cp_parser_skip_balanced_tokens (parser, 1) - 1; n; --n) + cp_lexer_consume_token (parser->lexer); + return attribute; + } + vec = cp_parser_parenthesized_expression_list (parser, attr_flag, /*cast_p=*/false, /*allow_expansion_p=*/true, @@ -26637,7 +26646,7 @@ cp_parser_std_attribute (cp_parser *parser, tree attr_ns) arguments = error_mark_node; else { - if (vec->is_empty()) + if (vec->is_empty ()) /* e.g. [[attr()]]. */ error_at (token->location, "parentheses must be omitted if " "%qE attribute argument list is empty", diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6a777328d50..32ba76b21f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2019-11-26 Jakub Jelinek + PR c++/92648 + * g++.dg/cpp0x/gen-attrs-71.C: New test. + PR c++/61414 * g++.dg/cpp0x/enum23.C: Remove xfail. * g++.dg/cpp0x/enum28.C: New test. diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-71.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-71.C new file mode 100644 index 00000000000..7876a2fba30 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-71.C @@ -0,0 +1,7 @@ +// PR c++/92648 +// { dg-do compile { target c++11 } } + +int a [[gnu::no_such_attribute(![!(!)!]!,;;)]]; // { dg-warning "ignored" } +int b [[no_such_namespace::nonexisting_attribute(linear(c, d : 2), reduction(*:e), linear(uval (f)))]]; // { dg-warning "ignored" } +int c [[gnu::nonexisting_attribute()]]; // { dg-warning "ignored" } +int d [[gnu::another_nonexistent_attr(1,"abcd",g+6)]]; // { dg-warning "ignored" }