aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2004-04-30 18:26:48 -0400
committerJason Merrill <jason@gcc.gnu.org>2004-04-30 18:26:48 -0400
commit672149847fcde1b055ddbcfff7849e3a6a4043aa (patch)
treef4d65d8bd351d2fdf24edc0ee51fdb6998ce6afc /gcc
parent269c559dab0e8ff21c33aae0186c8144d86f3bbe (diff)
downloadgcc-672149847fcde1b055ddbcfff7849e3a6a4043aa.zip
gcc-672149847fcde1b055ddbcfff7849e3a6a4043aa.tar.gz
gcc-672149847fcde1b055ddbcfff7849e3a6a4043aa.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/attribs.c21
-rw-r--r--gcc/config/i386/winnt.c3
3 files changed, 30 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b24e858..311728e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 5d8450f..671528cca 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,
diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c
index b97810a..6196d32 100644
--- a/gcc/config/i386/winnt.c
+++ b/gcc/config/i386/winnt.c
@@ -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')