]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/81429 - wrong parsing of constructor with C++11 attribute.
authorMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 15 Aug 2019 18:31:16 +0000 (18:31 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 15 Aug 2019 18:31:16 +0000 (18:31 +0000)
* 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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp0x/gen-attrs-68.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/gen-attrs-69.C [new file with mode: 0644]

index 163017f77cddb3b1e4ad02b96f4139ef27cbd9d0..a14a0d6ae0c6cedcc26b4e4984258f3e78b1d856 100644 (file)
@@ -1,5 +1,15 @@
+2019-08-15  Marek Polacek  <polacek@redhat.com>
+
+       Backported from mainline
+       2019-08-07  Marek Polacek  <polacek@redhat.com>
+
+       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  <msebor@redhat.com>
 
+       Backported from mainline
        2019-08-01  Martin Sebor  <msebor@redhat.com>
 
        PR c++/90947
index 24d41600f21509c7e7dd3a68e6c0ef5b5e1992d1..58b44abd1092bfb3123e3c2eef0da4ab29d4dc04 100644 (file)
@@ -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 (file)
index 0000000..6bede06
--- /dev/null
@@ -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 (file)
index 0000000..43173db
--- /dev/null
@@ -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)));
+};