From: Paolo Carlini Date: Thu, 20 Sep 2007 10:04:19 +0000 (+0000) Subject: re PR c++/33459 (ICE on reference member in union) X-Git-Tag: releases/gcc-4.2.2~65 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ddbe91ab5a6c5febc939a6a2ca2ea90ca4477200;p=thirdparty%2Fgcc.git re PR c++/33459 (ICE on reference member in union) cp/ 2007-09-20 Paolo Carlini PR c++/33459 * init.c (build_zero_init): If, recursively, build_zero_init returns a NULL_TREE, do not append it to the VEC of constructors. testsuite/ 2007-09-20 Paolo Carlini PR c++/33459 * g++.dg/init/ref14.C: New. From-SVN: r128616 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6a1d20d87281..25a776083941 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-09-20 Paolo Carlini + + PR c++/33459 + * init.c (build_zero_init): If, recursively, build_zero_init + returns a NULL_TREE, do not append it to the VEC of constructors. + 2007-09-13 Jason Merrill PR c++/15097 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 3c570c842f37..993b49af9b3d 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -136,11 +136,12 @@ initialize_vtbl_ptrs (tree addr) /* Return an expression for the zero-initialization of an object with type T. This expression will either be a constant (in the case that T is a scalar), or a CONSTRUCTOR (in the case that T is an - aggregate). In either case, the value can be used as DECL_INITIAL - for a decl of the indicated TYPE; it is a valid static initializer. - If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS is the - number of elements in the array. If STATIC_STORAGE_P is TRUE, - initializers are only generated for entities for which + aggregate), or NULL (in the case that T does not require + initialization). In either case, the value can be used as + DECL_INITIAL for a decl of the indicated TYPE; it is a valid static + initializer. If NELTS is non-NULL, and TYPE is an ARRAY_TYPE, NELTS + is the number of elements in the array. If STATIC_STORAGE_P is + TRUE, initializers are only generated for entities for which zero-initialization does not simply mean filling the storage with zero bytes. */ @@ -199,7 +200,8 @@ build_zero_init (tree type, tree nelts, bool static_storage_p) tree value = build_zero_init (TREE_TYPE (field), /*nelts=*/NULL_TREE, static_storage_p); - CONSTRUCTOR_APPEND_ELT(v, field, value); + if (value) + CONSTRUCTOR_APPEND_ELT(v, field, value); } /* For unions, only the first field is initialized. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 86a0d88d6a05..b9b825795fa3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-09-20 Paolo Carlini + + PR c++/33459 + * g++.dg/init/ref14.C: New. + 2007-09-12 John David Anglin PR testsuite/33153 diff --git a/gcc/testsuite/g++.dg/init/ref14.C b/gcc/testsuite/g++.dg/init/ref14.C new file mode 100644 index 000000000000..212e6e95d7ea --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref14.C @@ -0,0 +1,11 @@ +// PR c++/33459 + +union A +{ + int &i; // { dg-error "may not have reference type" } +}; + +void foo() +{ + A(); +}