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:
parent
ea1c67e6e3
commit
01d685ccfd
4 changed files with 32 additions and 1 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue