re PR c++/83300 (Segmentation fault with template and __attribute__((vector_size...
authorJakub Jelinek <jakub@redhat.com>
Mon, 18 Dec 2017 17:52:13 +0000 (18:52 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 18 Dec 2017 17:52:13 +0000 (18:52 +0100)
PR c++/83300
* decl2.c (save_template_attributes): Add flags argument, if
not ATTR_FLAG_TYPE_IN_PLACE, *decl_p is a type and we want to
modify TYPE_ATTRIBUTES, add them on type attribute variant.

* g++.dg/ext/vector33.C: New test.

From-SVN: r255783

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/vector33.C [new file with mode: 0644]

index 3885e566d0c7ddf3991c6eb0c6692e1d9a25dced..b6e782a389c573f35b90959e613e83b6a1746278 100644 (file)
@@ -1,3 +1,10 @@
+2017-12-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/83300
+       * decl2.c (save_template_attributes): Add flags argument, if
+       not ATTR_FLAG_TYPE_IN_PLACE, *decl_p is a type and we want to
+       modify TYPE_ATTRIBUTES, add them on type attribute variant.
+
 2017-12-18  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/59930
index 89a940ac3309aad13a67753136711ed2bc8147b5..5a87f30fa403bba49c9f0fb6c5afc9ac980bf7c8 100644 (file)
@@ -1244,7 +1244,7 @@ splice_template_attributes (tree *attr_p, tree decl)
    DECL_P.  */
 
 static void
-save_template_attributes (tree *attr_p, tree *decl_p)
+save_template_attributes (tree *attr_p, tree *decl_p, int flags)
 {
   tree *q;
 
@@ -1265,7 +1265,20 @@ save_template_attributes (tree *attr_p, tree *decl_p)
   /* Merge the late attributes at the beginning with the attribute
      list.  */
   late_attrs = merge_attributes (late_attrs, *q);
-  *q = late_attrs;
+  if (*q != late_attrs
+      && !DECL_P (*decl_p)
+      && !(flags & ATTR_FLAG_TYPE_IN_PLACE))
+    {
+      if (!dependent_type_p (*decl_p))
+       *decl_p = cp_build_type_attribute_variant (*decl_p, late_attrs);
+      else
+       {
+         *decl_p = build_variant_type_copy (*decl_p);
+         TYPE_ATTRIBUTES (*decl_p) = late_attrs;
+       }
+    }
+  else
+    *q = late_attrs;
 
   if (!DECL_P (*decl_p) && *decl_p == TYPE_MAIN_VARIANT (*decl_p))
     {
@@ -1466,7 +1479,7 @@ cplus_decl_attributes (tree *decl, tree attributes, int flags)
       if (check_for_bare_parameter_packs (attributes))
        return;
 
-      save_template_attributes (&attributes, decl);
+      save_template_attributes (&attributes, decl, flags);
     }
 
   cp_check_const_attributes (attributes);
index 57ef599565c8765d618050dbf64e53c0f8732f87..0963f4ec9618f93c2b9e4c36d92932d0b1ccb9f5 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/83300
+       * g++.dg/ext/vector33.C: New test.
+
 2017-12-18  Marek Polacek  <polacek@redhat.com>
 
        PR middle-end/83463
diff --git a/gcc/testsuite/g++.dg/ext/vector33.C b/gcc/testsuite/g++.dg/ext/vector33.C
new file mode 100644 (file)
index 0000000..f502532
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/83300
+// { dg-do compile { target c++11 } }
+
+template<int N>
+using T = int __attribute__((vector_size (sizeof(int) * N)));
+
+void
+f (T<4>)
+{
+}