]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/59886 (C++ array init optimization results in RANGE_EXPRs in assignments)
authorJason Merrill <jason@redhat.com>
Fri, 24 Jan 2014 16:47:54 +0000 (11:47 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 24 Jan 2014 16:47:54 +0000 (11:47 -0500)
PR c++/59886
PR c++/59659
* typeck2.c (process_init_constructor_array): Don't create
RANGE_EXPR yet.

From-SVN: r207051

gcc/cp/ChangeLog
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/init/aggr10.C [new file with mode: 0644]

index d9f023a7290b655d517240ddbc9ef138f1ddcf33..4485108ac08ea898465bef26102a4b7bff95a65f 100644 (file)
@@ -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
index 897570ad3a2cf2272256b45e85135404ff4bbca9..a3fe2e39820697c0cf46b9670fce24d6b3fc14bc 100644 (file)
@@ -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 (file)
index 0000000..e494e20
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/59886
+
+struct A { A (); ~A (); };
+struct B { A b[4]; };
+struct C { B c[5]; };
+const C e = {};