re PR c++/86288 (Recognize __gnu and/or __gnu__ as attribute-namespace)
authorJakub Jelinek <jakub@redhat.com>
Wed, 24 Oct 2018 19:39:23 +0000 (21:39 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 24 Oct 2018 19:39:23 +0000 (21:39 +0200)
PR c++/86288
* parser.c (cp_parser_std_attribute): Canonicalize attr_ns, and when
:: is not present and attr_ns non-NULL, canonicalize also attr_id.
(cp_parser_attribute_spec): Fix comment typo.

* g++.dg/cpp0x/gen-attrs-66.C: New test.

From-SVN: r265470

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

index fad8690810265c3a0f698e22a98155b48cb412c4..c90d91b7b8240d2aff112519ceda927ab565a8da 100644 (file)
@@ -1,3 +1,10 @@
+2018-10-24  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/86288
+       * parser.c (cp_parser_std_attribute): Canonicalize attr_ns, and when
+       :: is not present and attr_ns non-NULL, canonicalize also attr_id.
+       (cp_parser_attribute_spec): Fix comment typo.
+
 2018-10-24  Martin Sebor  <msebor@redhat.com>
 
        PR c++/84851
index c46b77608b21fe332565a6ecd5e90b2318948abe..2533871fb28afaa1d9b01e87ba15ced832d6274a 100644 (file)
@@ -25327,14 +25327,19 @@ cp_parser_std_attribute (cp_parser *parser, tree attr_ns)
          return error_mark_node;
        }
 
+      attr_ns = canonicalize_attr_name (attr_ns);
       attr_id = canonicalize_attr_name (attr_id);
       attribute = build_tree_list (build_tree_list (attr_ns, attr_id),
                                   NULL_TREE);
       token = cp_lexer_peek_token (parser->lexer);
     }
   else if (attr_ns)
-    attribute = build_tree_list (build_tree_list (attr_ns, attr_id),
-                                NULL_TREE);
+    {
+      attr_ns = canonicalize_attr_name (attr_ns);
+      attr_id = canonicalize_attr_name (attr_id);
+      attribute = build_tree_list (build_tree_list (attr_ns, attr_id),
+                                  NULL_TREE);
+    }
   else
     {
       attr_id = canonicalize_attr_name (attr_id);
@@ -25526,7 +25531,7 @@ cp_parser_std_attribute_spec (cp_parser *parser)
          || !cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
        cp_parser_skip_to_end_of_statement (parser);
       else
-       /* Warn about parsing c++11 attribute in non-c++1 mode, only
+       /* Warn about parsing c++11 attribute in non-c++11 mode, only
           when we are sure that we have actually parsed them.  */
        maybe_warn_cpp0x (CPP0X_ATTRIBUTES);
     }
index 6f9ba884e04afbf83cf0ce38e564b5fd435a6dac..96ef4b999bc554425d8b311aa7fabbd3cca41655 100644 (file)
@@ -1,3 +1,8 @@
+2018-10-24  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/86288
+       * g++.dg/cpp0x/gen-attrs-66.C: New test.
+
 2018-10-24  Martin Sebor  <msebor@redhat.com>
 
        PR c++/84851
diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-66.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-66.C
new file mode 100644 (file)
index 0000000..de81dbb
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/86288
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wattributes" }
+
+int a [[gnu::aligned(alignof(int))]];
+int b [[gnu::__aligned__(alignof(int))]];
+int c [[__gnu__::aligned(alignof(int))]];
+int d [[__gnu__::__aligned__(alignof(int))]];
+int e [[using gnu : aligned(alignof(int))]];           // { dg-warning "attribute using prefix only available" "" { target c++14_down } }
+int f [[using gnu : __aligned__(alignof(int))]];       // { dg-warning "attribute using prefix only available" "" { target c++14_down } }
+int g [[using __gnu__ : aligned(alignof(int))]];       // { dg-warning "attribute using prefix only available" "" { target c++14_down } }
+int h [[using __gnu__ : __aligned__(alignof(int))]];   // { dg-warning "attribute using prefix only available" "" { target c++14_down } }