re PR c++/14587 (Multiple inheriance/DLL testcase (g++.dg/ext/dllexport-MI1.C) failures)

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.

From-SVN: r81369
This commit is contained in:
Jason Merrill 2004-04-30 18:26:48 -04:00 committed by Jason Merrill
parent 269c559dab
commit 672149847f
3 changed files with 30 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2004-04-30 Jason Merrill <jason@redhat.com>
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.
2004-04-30 Paul Brook <paul@codesourcery.com>
* config.gcc: Simplify arm --with-{cpu,tune} test.

View File

@ -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,

View File

@ -171,7 +171,8 @@ associated_type (tree decl)
dtor's are not affected by class status but virtual and
non-virtual thunks are. */
if (!DECL_ARTIFICIAL (decl) || DECL_COMDAT (decl))
t = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))));
t = TYPE_MAIN_VARIANT
(TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
}
else if (DECL_CONTEXT (decl)
&& TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (decl))) == 't')