From: Jason Merrill Date: Thu, 19 Aug 2010 17:01:01 +0000 (-0400) Subject: re PR c++/45315 (ICE: tree check: expected aggr_init_expr, have call_expr in build_va... X-Git-Tag: releases/gcc-4.6.0~4928 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=95d7bdaae984895c2b436fbc445eb47d7c9555b0;p=thirdparty%2Fgcc.git re PR c++/45315 (ICE: tree check: expected aggr_init_expr, have call_expr in build_value_init, at cp/init.c:317) PR c++/45315 * init.c (build_new_1): Don't use build_value_init in a template. (build_value_init): Make sure we don't. From-SVN: r163381 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7667bb685b65..bac1182cb764 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2010-08-19 Jason Merrill + PR c++/45315 + * init.c (build_new_1): Don't use build_value_init in a template. + (build_value_init): Make sure we don't. + PR c++/45307 * cp-gimplify.c (cp_gimplify_expr): Also remove assignment of empty class CONSTRUCTOR. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 8555fadfb421..189bcbec9a5e 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -295,6 +295,9 @@ build_value_init (tree type, tsubst_flags_t complain) zero-initializing the object and then calling the default constructor. */ + /* The AGGR_INIT_EXPR tweaking below breaks in templates. */ + gcc_assert (!processing_template_decl); + if (CLASS_TYPE_P (type)) { if (type_has_user_provided_constructor (type)) @@ -2310,7 +2313,8 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, { init_expr = cp_build_indirect_ref (data_addr, RO_NULL, complain); - if (TYPE_NEEDS_CONSTRUCTING (type) && !explicit_value_init_p) + if (TYPE_NEEDS_CONSTRUCTING (type) + && (!explicit_value_init_p || processing_template_decl)) { init_expr = build_special_member_call (init_expr, complete_ctor_identifier, @@ -2320,11 +2324,17 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, } else if (explicit_value_init_p) { - /* Something like `new int()'. */ - tree val = build_value_init (type, complain); - if (val == error_mark_node) - return error_mark_node; - init_expr = build2 (INIT_EXPR, type, init_expr, val); + if (processing_template_decl) + /* Don't worry about it, we'll handle this properly at + instantiation time. */; + else + { + /* Something like `new int()'. */ + tree val = build_value_init (type, complain); + if (val == error_mark_node) + return error_mark_node; + init_expr = build2 (INIT_EXPR, type, init_expr, val); + } } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 289a1246938f..805cd7a8f833 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2010-08-19 Jason Merrill + * g++.dg/init/value8.C: New. + * g++.dg/tree-ssa/empty-2.C: New. * g++.dg/cpp0x/noexcept09.C: New. diff --git a/gcc/testsuite/g++.dg/init/value8.C b/gcc/testsuite/g++.dg/init/value8.C new file mode 100644 index 000000000000..0a9b90b64bf3 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value8.C @@ -0,0 +1,19 @@ +// PR c++/45315 + +struct A +{ + A (); +}; + +template < int > struct B : A +{ + void foo () + { + new B < 0 > (); + } +}; + +int main() +{ + B<1>().foo(); +}