This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [C++ PATCH #3] Fix up array initializations from compound literal (PR c++/40948)


On 08/05/2009 10:03 AM, Jason Merrill wrote:
Yes. In build_vec_init, we ought to set up base2 before starting the try
block.

Thus. Tested x86_64-pc-linux-gnu, applying to trunk and 4.4.


Jason
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.

diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 4462428..ef18a6c 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -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))
diff --git a/gcc/testsuite/g++.dg/ext/complit12.C b/gcc/testsuite/g++.dg/ext/complit12.C
index 8105621..29c9af1 100644
--- a/gcc/testsuite/g++.dg/ext/complit12.C
+++ b/gcc/testsuite/g++.dg/ext/complit12.C
@@ -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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]