Commit 114bf260 by Jason Merrill Committed by Jason Merrill

re PR c++/59886 (C++ array init optimization results in RANGE_EXPRs in assignments)

	PR c++/59886
	PR c++/59659
	* typeck2.c (process_init_constructor_array): Don't create
	RANGE_EXPR yet.

From-SVN: r207051
parent 2cbf3dd7
2014-01-24 Jason Merrill <jason@redhat.com>
PR c++/59886
PR c++/59659
* typeck2.c (process_init_constructor_array): Don't create
RANGE_EXPR yet.
2014-01-24 Jakub Jelinek <jakub@redhat.com> 2014-01-24 Jakub Jelinek <jakub@redhat.com>
* typeck2.c (split_nonconstant_init_1): Fix num_split_elts * typeck2.c (split_nonconstant_init_1): Fix num_split_elts
......
...@@ -1201,42 +1201,40 @@ process_init_constructor_array (tree type, tree init, ...@@ -1201,42 +1201,40 @@ process_init_constructor_array (tree type, tree init,
flags |= picflag_from_initializer (ce->value); flags |= picflag_from_initializer (ce->value);
} }
/* No more initializers. If the array is unbounded, or we've initialized /* No more initializers. If the array is unbounded, we are done. Otherwise,
all the elements, we are done. Otherwise, we must add initializers we must add initializers ourselves. */
ourselves. */ if (!unbounded)
if (!unbounded && i < len) for (; i < len; ++i)
{ {
tree next; tree next;
if (type_build_ctor_call (TREE_TYPE (type))) if (type_build_ctor_call (TREE_TYPE (type)))
{ {
/* If this type needs constructors run for default-initialization, /* If this type needs constructors run for default-initialization,
we can't rely on the back end to do it for us, so make the we can't rely on the back end to do it for us, so make the
initialization explicit by list-initializing from {}. */ initialization explicit by list-initializing from {}. */
next = build_constructor (init_list_type_node, NULL); next = build_constructor (init_list_type_node, NULL);
next = massage_init_elt (TREE_TYPE (type), next, complain); next = massage_init_elt (TREE_TYPE (type), next, complain);
if (initializer_zerop (next)) if (initializer_zerop (next))
/* The default zero-initialization is fine for us; don't /* The default zero-initialization is fine for us; don't
add anything to the CONSTRUCTOR. */ add anything to the CONSTRUCTOR. */
next = NULL_TREE; next = NULL_TREE;
} }
else if (!zero_init_p (TREE_TYPE (type))) else if (!zero_init_p (TREE_TYPE (type)))
next = build_zero_init (TREE_TYPE (type), next = build_zero_init (TREE_TYPE (type),
/*nelts=*/NULL_TREE, /*nelts=*/NULL_TREE,
/*static_storage_p=*/false); /*static_storage_p=*/false);
else else
/* The default zero-initialization is fine for us; don't /* The default zero-initialization is fine for us; don't
add anything to the CONSTRUCTOR. */ add anything to the CONSTRUCTOR. */
next = NULL_TREE; next = NULL_TREE;
if (next) if (next)
{ {
flags |= picflag_from_initializer (next); flags |= picflag_from_initializer (next);
tree index = build2 (RANGE_EXPR, sizetype, size_int (i), CONSTRUCTOR_APPEND_ELT (v, size_int (i), next);
size_int (len - 1)); }
CONSTRUCTOR_APPEND_ELT (v, index, next); }
}
}
CONSTRUCTOR_ELTS (init) = v; CONSTRUCTOR_ELTS (init) = v;
return flags; return flags;
......
// PR c++/59886
struct A { A (); ~A (); };
struct B { A b[4]; };
struct C { B c[5]; };
const C e = {};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment