From: Marek Polacek Date: Thu, 15 Aug 2019 18:31:16 +0000 (+0000) Subject: PR c++/81429 - wrong parsing of constructor with C++11 attribute. X-Git-Tag: releases/gcc-9.3.0~724 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=857f2fe622228bbf85ba56ac1853c01eb0eb6136;p=thirdparty%2Fgcc.git PR c++/81429 - wrong parsing of constructor with C++11 attribute. * parser.c (cp_parser_constructor_declarator_p): Handle the scenario when a parameter declaration begins with [[attribute]]. * g++.dg/cpp0x/gen-attrs-68.C: New test. * g++.dg/cpp0x/gen-attrs-69.C: New test. From-SVN: r274544 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 163017f77cdd..a14a0d6ae0c6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,15 @@ +2019-08-15 Marek Polacek + + Backported from mainline + 2019-08-07 Marek Polacek + + PR c++/81429 - wrong parsing of constructor with C++11 attribute. + * parser.c (cp_parser_constructor_declarator_p): Handle the scenario + when a parameter declaration begins with [[attribute]]. + 2019-08-14 Martin Sebor + Backported from mainline 2019-08-01 Martin Sebor PR c++/90947 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 24d41600f215..58b44abd1092 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -27596,7 +27596,9 @@ cp_parser_constructor_declarator_p (cp_parser *parser, cp_parser_flags flags, /* A parameter declaration begins with a decl-specifier, which is either the "attribute" keyword, a storage class specifier, or (usually) a type-specifier. */ - && !cp_lexer_next_token_is_decl_specifier_keyword (parser->lexer)) + && !cp_lexer_next_token_is_decl_specifier_keyword (parser->lexer) + /* A parameter declaration can also begin with [[attribute]]. */ + && !cp_next_tokens_can_be_std_attribute_p (parser)) { tree type; tree pushed_scope = NULL_TREE; diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-68.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-68.C new file mode 100644 index 000000000000..6bede0659db5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-68.C @@ -0,0 +1,40 @@ +// PR c++/81429 - wrong parsing of constructor with C++11 attribute. +// { dg-do compile { target c++11 } } +// { dg-additional-options "-Wunused-parameter -Wno-pedantic" } + +void fn1([[maybe_unused]] int a) { } +void fn2(int a [[maybe_unused]]) { } +void fn3(__attribute__((unused)) int a) { } +void fn4(int a __attribute__((unused))) { } + +struct S1 { + S1([[maybe_unused]] int a) { } +}; + +struct S2 { + S2([[maybe_unused]] int f, [[maybe_unused]] int a) { } +}; + +struct S3 { + S3(int a [[maybe_unused]]) { } +}; + +struct S4 { + S4(int f [[maybe_unused]], int a [[maybe_unused]]) { } +}; + +struct S5 { + S5(__attribute__((unused)) int a) { } +}; + +struct S6 { + S6(__attribute__((unused)) int f, __attribute__((unused)) int a) { } +}; + +struct S7 { + S7(int a __attribute__((unused))) { } +}; + +struct S8 { + S8(int f __attribute__((unused)), int a __attribute__((unused))) { } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-69.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-69.C new file mode 100644 index 000000000000..43173dbbdf44 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-69.C @@ -0,0 +1,40 @@ +// PR c++/81429 - wrong parsing of constructor with C++11 attribute. +// { dg-do compile { target c++11 } } +// { dg-additional-options "-Wno-pedantic" } + +void fn1([[maybe_unused]] int); +void fn2(int a [[maybe_unused]]); +void fn3(__attribute__((unused)) int); +void fn4(int __attribute__((unused))); + +struct S1 { + S1([[maybe_unused]] int); +}; + +struct S2 { + S2([[maybe_unused]] int, [[maybe_unused]] int); +}; + +struct S3 { + S3(int a [[maybe_unused]]); +}; + +struct S4 { + S4(int a [[maybe_unused]], int b [[maybe_unused]]); +}; + +struct S5 { + S5(__attribute__((unused)) int); +}; + +struct S6 { + S6(__attribute__((unused)) int, __attribute__((unused)) int); +}; + +struct S7 { + S7(int __attribute__((unused))); +}; + +struct S8 { + S8(int __attribute__((unused)), int __attribute__((unused))); +};