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:
parent
a9717079fc
commit
5a4d80443f
4 changed files with 36 additions and 10 deletions
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue