Hi!

As mentioned in the PR, for use in headers for the same reason like we
support __aligned__ form next to aligned (user defining such a macro) this
patch allows to mangle the scope the same way.

In addition to that, it fixes an ICE, where because we didn't canonicalize
the attribute name in [[using gnu : __aligned__(4)]] we'd ICE on some of the
GNU attributes.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Is a partial backport (just add
      attr_id = canonicalize_attr_name (attr_id);
in the else if (attr_ns) case plus the non-__gnu__ lines from the testcase)
ok for 7/8 release branches where it ICEs?

2018-10-18  Jakub Jelinek  <ja...@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.

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

--- gcc/cp/parser.c.jj  2018-10-15 18:05:42.562236914 +0200
+++ gcc/cp/parser.c     2018-10-17 14:45:25.205543993 +0200
@@ -25327,14 +25327,19 @@ cp_parser_std_attribute (cp_parser *pars
          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
          || !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);
     }
--- gcc/testsuite/g++.dg/cpp0x/gen-attrs-66.C.jj        2018-10-17 
14:47:15.493686357 +0200
+++ gcc/testsuite/g++.dg/cpp0x/gen-attrs-66.C   2018-10-17 15:00:30.450240982 
+0200
@@ -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 } }

        Jakub

Reply via email to