re PR c++/36410 (ICE with transparent union)

PR c++/36410
        * decl2.c (grokfield): Pass ATTR_FLAG_TYPE_IN_PLACE for a typedef
        that names a class for linkage purposes.

From-SVN: r142019
This commit is contained in:
Jason Merrill 2008-11-19 16:35:27 -05:00 committed by Jason Merrill
parent ea1c67e6e3
commit 01d685ccfd
4 changed files with 32 additions and 1 deletions

View File

@ -1,5 +1,9 @@
2008-11-19 Jason Merrill <jason@redhat.com>
PR c++/36410
* decl2.c (grokfield): Pass ATTR_FLAG_TYPE_IN_PLACE for a typedef
that names a class for linkage purposes.
PR c++/37563
* parser.c (cp_parser_pseudo_destructor_name): A pseudo-destructor
name is not a declaration.

View File

@ -803,7 +803,17 @@ grokfield (const cp_declarator *declarator,
value = push_template_decl (value);
if (attrlist)
cplus_decl_attributes (&value, attrlist, 0);
{
int attrflags = 0;
/* If this is a typedef that names the class for linkage purposes
(7.1.3p8), apply any attributes directly to the type. */
if (TAGGED_TYPE_P (TREE_TYPE (value))
&& value == TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (value))))
attrflags = ATTR_FLAG_TYPE_IN_PLACE;
cplus_decl_attributes (&value, attrlist, attrflags);
}
return value;
}

View File

@ -1,5 +1,8 @@
2008-11-19 Jason Merrill <jason@redhat.com>
PR c++/36410
* g++.dg/ext/attrib32.C: Add member typedef case.
PR c++/37563
* g++.dg/template/pseudodtor5.C: New test.

View File

@ -20,3 +20,17 @@ void bar2(U1 u1, U2 u2)
foo2(u1);
foo2(u2);
}
// PR c++/36410
struct A
{
typedef union
{
int i;
} B __attribute__((transparent_union));
};
void foo(A::B b)
{
b.i;
}