re PR c++/33459 (ICE on reference member in union)

cp/
2007-09-20  Paolo Carlini  <pcarlini@suse.de>

	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  <pcarlini@suse.de>

	PR c++/33459
	* g++.dg/init/ref14.C: New.

From-SVN: r128615
This commit is contained in:
Paolo Carlini 2007-09-20 09:49:13 +00:00 committed by Paolo Carlini
parent c6f3019a9a
commit b43d1bdea5
4 changed files with 30 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2007-09-20 Paolo Carlini <pcarlini@suse.de>
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-18 Jason Merrill <jason@redhat.com>
PR c++/17743

View File

@ -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. */

View File

@ -1,3 +1,8 @@
2007-09-20 Paolo Carlini <pcarlini@suse.de>
PR c++/33459
* g++.dg/init/ref14.C: New.
2007-09-19 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/slice2.ad[sb]: New testcase.

View File

@ -0,0 +1,11 @@
// PR c++/33459
union A
{
int &i; // { dg-error "may not have reference type" }
};
void foo()
{
A();
}