aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-01-24 11:47:54 -0500
committerJason Merrill <jason@gcc.gnu.org>2014-01-24 11:47:54 -0500
commit114bf2605dcfede47ab18e44c28751b221de4bb5 (patch)
treea2b31f389d0c4d5298d361cf9f0f4e021634cfcf
parent2cbf3dd796900d4e1af4678842d9347da1766176 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cp/typeck2.c70
-rw-r--r--gcc/testsuite/g++.dg/init/aggr10.C6
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 = {};