Commit 1db54f4e by Douglas Gregor Committed by Doug Gregor

re PR c++/35074 (ICE with attribute "aligned" for template classes)

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
parent 0f5098ae
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
......
......@@ -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. */
......
// { 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 {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment