]> gcc.gnu.org Git - gcc.git/commitdiff
re PR c++/35074 (ICE with attribute "aligned" for template classes)
authorDouglas Gregor <doug.gregor@gmail.com>
Tue, 5 Feb 2008 13:29:43 +0000 (13:29 +0000)
committerDoug Gregor <dgregor@gcc.gnu.org>
Tue, 5 Feb 2008 13:29:43 +0000 (13:29 +0000)
2008-02-05  Douglas Gregor  <doug.gregor@gmail.com>

PR c++/35074
* decl2.c (save_template_attributes): When we're modifying the
TYPE_MAIN_VARIANT to add new attributes, be sure to also modify
all of the other variants to add those same attributes. Otherwise,
the main variant will be inconsistent with those other variants.

2008-02-05  Douglas Gregor  <doug.gregor@gmail.com>

PR c++/35074
* g++.dg/ext/attrib30.C: New.

From-SVN: r132120

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

index 0cd642ba1e12c0bbd62898d7a74d11e530d97a68..5ea0490684cc3d6b15b77f16f9073daae56d4aee 100644 (file)
@@ -1,3 +1,11 @@
+2008-02-05  Douglas Gregor  <doug.gregor@gmail.com>
+
+       PR c++/35074
+       * decl2.c (save_template_attributes): When we're modifying the
+       TYPE_MAIN_VARIANT to add new attributes, be sure to also modify
+       all of the other variants to add those same attributes. Otherwise,
+       the main variant will be inconsistent with those other variants.
+       
 2008-02-04  Richard Guenther  <rguenther@suse.de>
 
        PR java/35035
index 3b20586457c84ad87af29ec9c5f1d75b16efa307..d2d81feae44d3158bc3bb00fde9f7fe0d735767d 100644 (file)
@@ -1068,6 +1068,7 @@ save_template_attributes (tree *attr_p, tree *decl_p)
 {
   tree late_attrs = splice_template_attributes (attr_p, *decl_p);
   tree *q;
+  tree old_attrs = NULL_TREE;
 
   if (!late_attrs)
     return;
@@ -1090,9 +1091,26 @@ save_template_attributes (tree *attr_p, tree *decl_p)
   else
     q = &TYPE_ATTRIBUTES (*decl_p);
 
-  if (*q)
-    q = &TREE_CHAIN (tree_last (*q));
+  old_attrs = *q;
+
+  /* Place the late attributes at the beginning of the attribute
+     list.  */
+  TREE_CHAIN (tree_last (late_attrs)) = *q;
   *q = late_attrs;
+
+  if (!DECL_P (*decl_p) && *decl_p == TYPE_MAIN_VARIANT (*decl_p))
+    {
+      /* We've added new attributes directly to the main variant, so
+        now we need to update all of the other variants to include
+        these new attributes.  */
+      tree variant;
+      for (variant = TYPE_NEXT_VARIANT (*decl_p); variant;
+          variant = TYPE_NEXT_VARIANT (variant))
+       {
+         gcc_assert (TYPE_ATTRIBUTES (variant) == old_attrs);
+         TYPE_ATTRIBUTES (variant) = TYPE_ATTRIBUTES (*decl_p);
+       }
+    }
 }
 
 /* Like decl_attributes, but handle C++ complexity.  */
diff --git a/gcc/testsuite/g++.dg/ext/attrib30.C b/gcc/testsuite/g++.dg/ext/attrib30.C
new file mode 100644 (file)
index 0000000..fd2826a
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// PR c++/35074
+template<typename T> struct A
+{
+  void foo() const;
+} __attribute((aligned(4)));
+
+template<typename T> void A<T>::foo() const {}
This page took 0.077038 seconds and 5 git commands to generate.