summaryrefslogtreecommitdiff
path: root/gcc/attribs.c
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2004-04-30 22:26:48 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2004-04-30 22:26:48 +0000
commit316e17aef38913850104bf635ecbda834f7584ea (patch)
treef4d65d8bd351d2fdf24edc0ee51fdb6998ce6afc /gcc/attribs.c
parent01142df59a6d0394291b5efcac73e79480993f08 (diff)
downloadgcc-316e17aef38913850104bf635ecbda834f7584ea.tar.gz
PR c++/14587
* config/i386/winnt.c (associated_type): Look for attributes on the TYPE_MAIN_VARIANT of *this. * attribs.c (decl_attributes): If ATTR_FLAG_TYPE_IN_PLACE, also apply the attributes to the variants. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@81369 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/attribs.c')
-rw-r--r--gcc/attribs.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 5d8450ff601..671528ccacd 100644
--- a/gcc/attribs.c
+++ b/gcc/attribs.c
@@ -294,7 +294,26 @@ decl_attributes (tree *node, tree attributes, int flags)
if (DECL_P (*anode))
DECL_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
- TYPE_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
+ {
+ TYPE_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
+ /* If this is the main variant, also push the attributes
+ out to the other variants. */
+ if (*anode == TYPE_MAIN_VARIANT (*anode))
+ {
+ tree variant;
+ for (variant = *anode; variant;
+ variant = TYPE_NEXT_VARIANT (variant))
+ {
+ if (TYPE_ATTRIBUTES (variant) == old_attrs)
+ TYPE_ATTRIBUTES (variant)
+ = TYPE_ATTRIBUTES (*anode);
+ else if (!lookup_attribute
+ (spec->name, TYPE_ATTRIBUTES (variant)))
+ TYPE_ATTRIBUTES (variant) = tree_cons
+ (name, args, TYPE_ATTRIBUTES (variant));
+ }
+ }
+ }
else
*anode = build_type_attribute_variant (*anode,
tree_cons (name, args,