Commit 5a4d8044 by Jason Merrill Committed by Jason Merrill

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
parent a9717079
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> 2009-08-05 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR c++/36069 PR c++/36069
......
...@@ -2698,7 +2698,8 @@ build_vec_init (tree base, tree maxindex, tree init, ...@@ -2698,7 +2698,8 @@ build_vec_init (tree base, tree maxindex, tree init,
/* Look through the TARGET_EXPR around a compound literal. */ /* Look through the TARGET_EXPR around a compound literal. */
if (init && TREE_CODE (init) == TARGET_EXPR 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); init = TARGET_EXPR_INITIAL (init);
if (init if (init
...@@ -2769,6 +2770,17 @@ build_vec_init (tree base, tree maxindex, tree init, ...@@ -2769,6 +2770,17 @@ build_vec_init (tree base, tree maxindex, tree init,
base = get_temp_regvar (ptype, rval); base = get_temp_regvar (ptype, rval);
iterator = get_temp_regvar (ptrdiff_type_node, maxindex); 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 /* Protect the entire array initialization so that we can destroy
the partially constructed array if an exception is thrown. the partially constructed array if an exception is thrown.
But don't do this if we're assigning. */ But don't do this if we're assigning. */
...@@ -2811,16 +2823,8 @@ build_vec_init (tree base, tree maxindex, tree init, ...@@ -2811,16 +2823,8 @@ build_vec_init (tree base, tree maxindex, tree init,
} }
else if (from_array) 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) if (init)
{ /* OK, we set base2 above. */;
base2 = decay_conversion (init);
itype = TREE_TYPE (base2);
base2 = get_temp_regvar (itype, base2);
itype = TREE_TYPE (itype);
}
else if (TYPE_LANG_SPECIFIC (type) else if (TYPE_LANG_SPECIFIC (type)
&& TYPE_NEEDS_CONSTRUCTING (type) && TYPE_NEEDS_CONSTRUCTING (type)
&& ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type)) && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
......
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> 2009-08-05 Richard Earnshaw <rearnsha@arm.com>
Merge ARM/hard_vfp_branch to trunk. Merge ARM/hard_vfp_branch to trunk.
......
...@@ -30,6 +30,11 @@ T::T () : m ((M[4]) { M (), M (), M (), M () }) ...@@ -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 () int main ()
{ {
{ {
...@@ -48,6 +53,12 @@ int main () ...@@ -48,6 +53,12 @@ int main ()
T t; T t;
if (c != 11) if (c != 11)
return 5; 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) if (c != 0)
return 6; return 6;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment