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
|
@ -1,5 +1,9 @@
|
||||||
2008-11-19 Jason Merrill <jason@redhat.com>
|
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
|
PR c++/37563
|
||||||
* parser.c (cp_parser_pseudo_destructor_name): A pseudo-destructor
|
* parser.c (cp_parser_pseudo_destructor_name): A pseudo-destructor
|
||||||
name is not a declaration.
|
name is not a declaration.
|
||||||
|
|
|
@ -803,7 +803,17 @@ grokfield (const cp_declarator *declarator,
|
||||||
value = push_template_decl (value);
|
value = push_template_decl (value);
|
||||||
|
|
||||||
if (attrlist)
|
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;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
2008-11-19 Jason Merrill <jason@redhat.com>
|
2008-11-19 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
PR c++/36410
|
||||||
|
* g++.dg/ext/attrib32.C: Add member typedef case.
|
||||||
|
|
||||||
PR c++/37563
|
PR c++/37563
|
||||||
* g++.dg/template/pseudodtor5.C: New test.
|
* g++.dg/template/pseudodtor5.C: New test.
|
||||||
|
|
||||||
|
|
|
@ -20,3 +20,17 @@ void bar2(U1 u1, U2 u2)
|
||||||
foo2(u1);
|
foo2(u1);
|
||||||
foo2(u2);
|
foo2(u2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PR c++/36410
|
||||||
|
struct A
|
||||||
|
{
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
} B __attribute__((transparent_union));
|
||||||
|
};
|
||||||
|
|
||||||
|
void foo(A::B b)
|
||||||
|
{
|
||||||
|
b.i;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue