+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
{
tree late_attrs = splice_template_attributes (attr_p, *decl_p);
tree *q;
+ tree old_attrs = NULL_TREE;
if (!late_attrs)
return;
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. */
--- /dev/null
+// { 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 {}