re PR c++/40948 (ICE in lower_stmt, at gimple-low.c:408)

PR c++/40948
	* init.c (build_vec_init): Evaluate the initializer before
	starting the initialization try block.

From-SVN: r150529
This commit is contained in:
Jason Merrill 2009-08-06 12:25:19 -04:00 committed by Jason Merrill
parent a9717079fc
commit 5a4d80443f
4 changed files with 36 additions and 10 deletions

View 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

View 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))

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

View 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;