From: Jason Merrill Date: Thu, 6 Aug 2009 16:25:19 +0000 (-0400) Subject: re PR c++/40948 (ICE in lower_stmt, at gimple-low.c:408) X-Git-Tag: releases/gcc-4.5.0~4155 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5a4d80443fcb5521022d4ebe400a6dcaff037cba;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3e86ab387635..a7cc6b15d80d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-08-05 Jason Merrill + + 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 PR c++/36069 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 4462428321b0..ef18a6c10415 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/ChangeLog b/gcc/testsuite/ChangeLog index 98392a5157c0..b17d3484fdd4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-08-05 Jason Merrill + + PR c++/40948 + * g++.dg/ext/complit12.C: Expand. + 2009-08-05 Richard Earnshaw Merge ARM/hard_vfp_branch to trunk. diff --git a/gcc/testsuite/g++.dg/ext/complit12.C b/gcc/testsuite/g++.dg/ext/complit12.C index 810562144838..29c9af1864f3 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;