diff options
author | Jason Merrill <jason@redhat.com> | 2014-01-24 11:47:54 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-01-24 11:47:54 -0500 |
commit | 114bf2605dcfede47ab18e44c28751b221de4bb5 (patch) | |
tree | a2b31f389d0c4d5298d361cf9f0f4e021634cfcf | |
parent | 2cbf3dd796900d4e1af4678842d9347da1766176 (diff) | |
download | gcc-114bf2605dcfede47ab18e44c28751b221de4bb5.zip gcc-114bf2605dcfede47ab18e44c28751b221de4bb5.tar.gz gcc-114bf2605dcfede47ab18e44c28751b221de4bb5.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 70 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/aggr10.C | 6 |
3 files changed, 47 insertions, 36 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d9f023a..4485108 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +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> * typeck2.c (split_nonconstant_init_1): Fix num_split_elts diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 897570a..a3fe2e3 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 0000000..e494e20 --- /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 = {}; |