From: Jason Merrill Date: Mon, 19 Dec 2011 20:10:25 +0000 (-0500) Subject: re PR c++/51228 (ICE with transparent union) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d58d6eb5eca0451638d50752f3cbcc40084c4116;p=gcc.git re PR c++/51228 (ICE with transparent union) PR c++/51228 * c-common.c (handle_transparent_union_attribute): Check the first field if the type is complete. From-SVN: r182494 --- diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 78854e2f81b..2b8f3257861 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2011-12-19 Jason Merrill + + PR c++/51228 + * c-common.c (handle_transparent_union_attribute): Check the first + field if the type is complete. + 2011-12-15 Jonathan Wakely PR libstdc++/51365 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 3e50dcf924f..0562f2624f3 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -6287,13 +6287,27 @@ handle_transparent_union_attribute (tree *node, tree name, if (TREE_CODE (type) == UNION_TYPE) { - /* When IN_PLACE is set, leave the check for FIELDS and MODE to - the code in finish_struct. */ + /* Make sure that the first field will work for a transparent union. + If the type isn't complete yet, leave the check to the code in + finish_struct. */ + if (TYPE_SIZE (type)) + { + tree first = first_field (type); + if (first == NULL_TREE + || DECL_ARTIFICIAL (first) + || TYPE_MODE (type) != DECL_MODE (first)) + goto ignored; + } + if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) { - if (TYPE_FIELDS (type) == NULL_TREE - || c_dialect_cxx () - || TYPE_MODE (type) != DECL_MODE (TYPE_FIELDS (type))) + /* If the type isn't complete yet, setting the flag + on a variant wouldn't ever be checked. */ + if (!TYPE_SIZE (type)) + goto ignored; + + /* build_duplicate_type doesn't work for C++. */ + if (c_dialect_cxx ()) goto ignored; /* A type variant isn't good enough, since we don't a cast diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f74bad768cf..70c33155832 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-12-19 Jason Merrill + + PR c++/51228 + * c-c++-common/transparent-union-1.c: New. + 2011-12-19 Eric Botcazou PR tree-optimization/51580 diff --git a/gcc/testsuite/c-c++-common/transparent-union-1.c b/gcc/testsuite/c-c++-common/transparent-union-1.c new file mode 100644 index 00000000000..3fb6e782a14 --- /dev/null +++ b/gcc/testsuite/c-c++-common/transparent-union-1.c @@ -0,0 +1,5 @@ +/* PR c++/51228 */ + +typedef union {} U __attribute__((transparent_union)); /* { dg-warning "ignored" } */ + +void foo(U u) {}