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> 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 PR c++/45307
* cp-gimplify.c (cp_gimplify_expr): Also remove assignment * cp-gimplify.c (cp_gimplify_expr): Also remove assignment
of empty class CONSTRUCTOR. of empty class CONSTRUCTOR.
......
...@@ -295,6 +295,9 @@ build_value_init (tree type, tsubst_flags_t complain) ...@@ -295,6 +295,9 @@ build_value_init (tree type, tsubst_flags_t complain)
zero-initializing the object and then calling the default zero-initializing the object and then calling the default
constructor. */ constructor. */
/* The AGGR_INIT_EXPR tweaking below breaks in templates. */
gcc_assert (!processing_template_decl);
if (CLASS_TYPE_P (type)) if (CLASS_TYPE_P (type))
{ {
if (type_has_user_provided_constructor (type)) if (type_has_user_provided_constructor (type))
...@@ -2310,7 +2313,8 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, ...@@ -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); 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, init_expr = build_special_member_call (init_expr,
complete_ctor_identifier, complete_ctor_identifier,
...@@ -2320,12 +2324,18 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, ...@@ -2320,12 +2324,18 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts,
} }
else if (explicit_value_init_p) else if (explicit_value_init_p)
{ {
if (processing_template_decl)
/* Don't worry about it, we'll handle this properly at
instantiation time. */;
else
{
/* Something like `new int()'. */ /* Something like `new int()'. */
tree val = build_value_init (type, complain); tree val = build_value_init (type, complain);
if (val == error_mark_node) if (val == error_mark_node)
return error_mark_node; return error_mark_node;
init_expr = build2 (INIT_EXPR, type, init_expr, val); init_expr = build2 (INIT_EXPR, type, init_expr, val);
} }
}
else else
{ {
tree ie; tree ie;
......
2010-08-19 Jason Merrill <jason@redhat.com> 2010-08-19 Jason Merrill <jason@redhat.com>
* g++.dg/init/value8.C: New.
* g++.dg/tree-ssa/empty-2.C: New. * g++.dg/tree-ssa/empty-2.C: New.
* g++.dg/cpp0x/noexcept09.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