From eb3490b96c149c8a5559b3f3947257c4ce0df650 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 27 Apr 2005 01:47:06 +0100 Subject: [PATCH] re PR c/21213 (segfault declaring a transparent union) PR c/21213 * c-decl.c (finish_struct): Don't dereference NULL TYPE_FIELDS of transparent union. testsuite: * gcc.dg/transparent-union-3.c: New test. From-SVN: r98808 --- gcc/ChangeLog | 6 ++++++ gcc/c-decl.c | 2 +- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/transparent-union-3.c | 22 ++++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/transparent-union-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 89af6e5f123..f0da7e624b7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-04-27 Joseph S. Myers + + PR c/21213 + * c-decl.c (finish_struct): Don't dereference NULL TYPE_FIELDS of + transparent union. + 2005-04-27 Joseph S. Myers PR c/20740 diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b1309b38d81..3578862269f 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -5329,7 +5329,7 @@ finish_struct (tree t, tree fieldlist, tree attributes) make it one, warn and turn off the flag. */ if (TREE_CODE (t) == UNION_TYPE && TYPE_TRANSPARENT_UNION (t) - && TYPE_MODE (t) != DECL_MODE (TYPE_FIELDS (t))) + && (!TYPE_FIELDS (t) || TYPE_MODE (t) != DECL_MODE (TYPE_FIELDS (t)))) { TYPE_TRANSPARENT_UNION (t) = 0; warning (0, "union cannot be made transparent"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0f6ab3d57ce..bd88d352ed9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-04-27 Joseph S. Myers + + PR c/21213 + * gcc.dg/transparent-union-3.c: New test. + 2005-04-27 Joseph S. Myers PR c/20740 diff --git a/gcc/testsuite/gcc.dg/transparent-union-3.c b/gcc/testsuite/gcc.dg/transparent-union-3.c new file mode 100644 index 00000000000..cebd5f85771 --- /dev/null +++ b/gcc/testsuite/gcc.dg/transparent-union-3.c @@ -0,0 +1,22 @@ +/* Test for ICEs on invalid transparent unions (empty or no named + members). Bug 21213. */ +/* Origin: Joseph Myers */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +enum e { A }; + +union __attribute__((__transparent_union__)) ue1 { enum e; }; /* { dg-warning "warning: declaration does not declare anything" } */ +/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 9 } */ +union ue2 { enum e; } __attribute__((__transparent_union__)); /* { dg-warning "warning: declaration does not declare anything" } */ +/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 11 } */ + +union __attribute__((__transparent_union__)) ui1 { int; }; /* { dg-warning "warning: declaration does not declare anything" } */ +/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 14 } */ +union ui2 { int; } __attribute__((__transparent_union__)); /* { dg-warning "warning: declaration does not declare anything" } */ +/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 16 } */ + +union __attribute__((__transparent_union__)) u1 { }; +/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 19 } */ +union u2 { } __attribute__((__transparent_union__)); +/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 21 } */ -- 2.30.2