From 114bf2605dcfede47ab18e44c28751b221de4bb5 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 24 Jan 2014 11:47:54 -0500 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 7 +++ gcc/cp/typeck2.c | 70 +++++++++++++++--------------- gcc/testsuite/g++.dg/init/aggr10.C | 6 +++ 3 files changed, 47 insertions(+), 36 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/aggr10.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d9f023a7290..4485108ac08 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2014-01-24 Jason Merrill + + PR c++/59886 + PR c++/59659 + * typeck2.c (process_init_constructor_array): Don't create + RANGE_EXPR yet. + 2014-01-24 Jakub Jelinek * typeck2.c (split_nonconstant_init_1): Fix num_split_elts diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 897570ad3a2..a3fe2e39820 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1201,42 +1201,40 @@ process_init_constructor_array (tree type, tree init, flags |= picflag_from_initializer (ce->value); } - /* No more initializers. If the array is unbounded, or we've initialized - all the elements, we are done. Otherwise, we must add initializers - ourselves. */ - if (!unbounded && i < len) - { - tree next; - - if (type_build_ctor_call (TREE_TYPE (type))) - { - /* 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 - initialization explicit by list-initializing from {}. */ - next = build_constructor (init_list_type_node, NULL); - next = massage_init_elt (TREE_TYPE (type), next, complain); - if (initializer_zerop (next)) - /* The default zero-initialization is fine for us; don't - add anything to the CONSTRUCTOR. */ - next = NULL_TREE; - } - else if (!zero_init_p (TREE_TYPE (type))) - next = build_zero_init (TREE_TYPE (type), - /*nelts=*/NULL_TREE, - /*static_storage_p=*/false); - else - /* The default zero-initialization is fine for us; don't - add anything to the CONSTRUCTOR. */ - next = NULL_TREE; - - if (next) - { - flags |= picflag_from_initializer (next); - tree index = build2 (RANGE_EXPR, sizetype, size_int (i), - size_int (len - 1)); - CONSTRUCTOR_APPEND_ELT (v, index, next); - } - } + /* No more initializers. If the array is unbounded, we are done. Otherwise, + we must add initializers ourselves. */ + if (!unbounded) + for (; i < len; ++i) + { + tree next; + + if (type_build_ctor_call (TREE_TYPE (type))) + { + /* 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 + initialization explicit by list-initializing from {}. */ + next = build_constructor (init_list_type_node, NULL); + next = massage_init_elt (TREE_TYPE (type), next, complain); + if (initializer_zerop (next)) + /* The default zero-initialization is fine for us; don't + add anything to the CONSTRUCTOR. */ + next = NULL_TREE; + } + else if (!zero_init_p (TREE_TYPE (type))) + next = build_zero_init (TREE_TYPE (type), + /*nelts=*/NULL_TREE, + /*static_storage_p=*/false); + else + /* The default zero-initialization is fine for us; don't + add anything to the CONSTRUCTOR. */ + next = NULL_TREE; + + if (next) + { + flags |= picflag_from_initializer (next); + CONSTRUCTOR_APPEND_ELT (v, size_int (i), next); + } + } CONSTRUCTOR_ELTS (init) = v; return flags; diff --git a/gcc/testsuite/g++.dg/init/aggr10.C b/gcc/testsuite/g++.dg/init/aggr10.C new file mode 100644 index 00000000000..e494e20a3bf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr10.C @@ -0,0 +1,6 @@ +// PR c++/59886 + +struct A { A (); ~A (); }; +struct B { A b[4]; }; +struct C { B c[5]; }; +const C e = {}; -- 2.30.2