Commit 95d7bdaa by Jason Merrill Committed by Jason Merrill

re PR c++/45315 (ICE: tree check: expected aggr_init_expr, have call_expr in…

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
parent ce3beba3
2010-08-19 Jason Merrill <jason@redhat.com>
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.
......
......@@ -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
{
......
2010-08-19 Jason Merrill <jason@redhat.com>
* g++.dg/init/value8.C: New.
* g++.dg/tree-ssa/empty-2.C: New.
* g++.dg/cpp0x/noexcept09.C: New.
......
// PR c++/45315
struct A
{
A ();
};
template < int > struct B : A
{
void foo ()
{
new B < 0 > ();
}
};
int main()
{
B<1>().foo();
}
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