]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/40948 (ICE in lower_stmt, at gimple-low.c:408)
authorJason Merrill <jason@redhat.com>
Thu, 6 Aug 2009 16:25:19 +0000 (12:25 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 6 Aug 2009 16:25:19 +0000 (12:25 -0400)
PR c++/40948
* init.c (build_vec_init): Evaluate the initializer before
starting the initialization try block.

From-SVN: r150529

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/complit12.C

index 3e86ab38763536f286008b90d99a88c2f4cfc82c..a7cc6b15d80d9c60e9f8c22bd11fb6b3b073bbc1 100644 (file)
@@ -1,3 +1,9 @@
+2009-08-05  Jason Merrill  <jason@redhat.com>
+
+       PR c++/40948
+       * init.c (build_vec_init): Evaluate the initializer before
+       starting the initialization try block.
+
 2009-08-05  Manuel López-Ibáñez  <manu@gcc.gnu.org>
 
        PR c++/36069
index 4462428321b00f0400f46972ed55c5c04660add0..ef18a6c104158c52a9fb8f80d763049234f7271c 100644 (file)
@@ -2698,7 +2698,8 @@ build_vec_init (tree base, tree maxindex, tree init,
 
   /* Look through the TARGET_EXPR around a compound literal.  */
   if (init && TREE_CODE (init) == TARGET_EXPR
-      && TREE_CODE (TARGET_EXPR_INITIAL (init)) == CONSTRUCTOR)
+      && TREE_CODE (TARGET_EXPR_INITIAL (init)) == CONSTRUCTOR
+      && from_array != 2)
     init = TARGET_EXPR_INITIAL (init);
 
   if (init
@@ -2769,6 +2770,17 @@ build_vec_init (tree base, tree maxindex, tree init,
   base = get_temp_regvar (ptype, rval);
   iterator = get_temp_regvar (ptrdiff_type_node, maxindex);
 
+  /* If initializing one array from another, initialize element by
+     element.  We rely upon the below calls to do the argument
+     checking.  Evaluate the initializer before entering the try block.  */
+  if (from_array && init && TREE_CODE (init) != CONSTRUCTOR)
+    {
+      base2 = decay_conversion (init);
+      itype = TREE_TYPE (base2);
+      base2 = get_temp_regvar (itype, base2);
+      itype = TREE_TYPE (itype);
+    }
+
   /* Protect the entire array initialization so that we can destroy
      the partially constructed array if an exception is thrown.
      But don't do this if we're assigning.  */
@@ -2811,16 +2823,8 @@ build_vec_init (tree base, tree maxindex, tree init,
     }
   else if (from_array)
     {
-      /* If initializing one array from another, initialize element by
-        element.  We rely upon the below calls the do argument
-        checking.  */
       if (init)
-       {
-         base2 = decay_conversion (init);
-         itype = TREE_TYPE (base2);
-         base2 = get_temp_regvar (itype, base2);
-         itype = TREE_TYPE (itype);
-       }
+       /* OK, we set base2 above.  */;
       else if (TYPE_LANG_SPECIFIC (type)
               && TYPE_NEEDS_CONSTRUCTING (type)
               && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
index 98392a5157c0e25d4ea7be5074e4b3d58fa83384..b17d3484fdd458402a9af1f02f16b50c749280b6 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-05  Jason Merrill  <jason@redhat.com>
+
+       PR c++/40948
+       * g++.dg/ext/complit12.C: Expand.
+
 2009-08-05  Richard Earnshaw  <rearnsha@arm.com>
 
        Merge ARM/hard_vfp_branch to trunk.
index 81056214483873f31425e3bdefea0a744a182381..29c9af1864f36fb05241123158a1a561dd45274b 100644 (file)
@@ -30,6 +30,11 @@ T::T () : m ((M[4]) { M (), M (), M (), M () })
 {
 }
 
+typedef M MA[1];
+MA &bar (MA, MA& r) { return r; }
+
+M f(M m) { return m; }
+
 int main ()
 {
   {
@@ -48,6 +53,12 @@ int main ()
     T t;
     if (c != 11)
       return 5;
+    MA ma = bar ((M[2]) { M(), M() }, m);
+    if (c != 12)
+      return 7;
+    M mm[2] = ((M[2]) { f(M()), f(M()) });
+    if (c != 14)
+      return 8;
   }
   if (c != 0)
     return 6;