Commit 38e10026 by Marek Polacek

c++: Fix value-init crash in template [PR93676]

Since <https://gcc.gnu.org/ml/gcc-patches/2015-02/msg00556.html> we
attempt to value-initialize in build_vec_init even when there's no
initializer but the type has a constexpr default constructor.  But
build_value_init doesn't work in templates, and build_vec_init
creates a lot of garbage that would not be used anyway, so don't
call it in a template.

	PR c++/93676 - value-init crash in template.
	* init.c (build_new_1): Don't call build_vec_init in a template.

	* g++.dg/cpp0x/nsdmi-template19.C: New test.
parent 8ce13842
2020-02-26 Marek Polacek <polacek@redhat.com> 2020-02-26 Marek Polacek <polacek@redhat.com>
PR c++/93676 - value-init crash in template.
* init.c (build_new_1): Don't call build_vec_init in a template.
2020-02-26 Marek Polacek <polacek@redhat.com>
PR c++/93862 - ICE with static_cast when converting from int[]. PR c++/93862 - ICE with static_cast when converting from int[].
* call.c (reference_compatible_p): No longer static. * call.c (reference_compatible_p): No longer static.
* cp-tree.h (reference_compatible_p): Declare. * cp-tree.h (reference_compatible_p): Declare.
......
...@@ -3511,13 +3511,17 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts, ...@@ -3511,13 +3511,17 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
explicit_value_init_p = true; explicit_value_init_p = true;
} }
if (processing_template_decl && explicit_value_init_p) if (processing_template_decl)
{ {
/* Avoid an ICE when converting to a base in build_simple_base_path.
We'll throw this all away anyway, and build_new will create
a NEW_EXPR. */
tree t = fold_convert (build_pointer_type (elt_type), data_addr);
/* build_value_init doesn't work in templates, and we don't need /* build_value_init doesn't work in templates, and we don't need
the initializer anyway since we're going to throw it away and the initializer anyway since we're going to throw it away and
rebuild it at instantiation time, so just build up a single rebuild it at instantiation time, so just build up a single
constructor call to get any appropriate diagnostics. */ constructor call to get any appropriate diagnostics. */
init_expr = cp_build_fold_indirect_ref (data_addr); init_expr = cp_build_fold_indirect_ref (t);
if (type_build_ctor_call (elt_type)) if (type_build_ctor_call (elt_type))
init_expr = build_special_member_call (init_expr, init_expr = build_special_member_call (init_expr,
complete_ctor_identifier, complete_ctor_identifier,
......
2020-02-26 Marek Polacek <polacek@redhat.com> 2020-02-26 Marek Polacek <polacek@redhat.com>
PR c++/93676 - value-init crash in template.
* g++.dg/cpp0x/nsdmi-template19.C: New test.
2020-02-26 Marek Polacek <polacek@redhat.com>
PR c++/93862 - ICE with static_cast when converting from int[]. PR c++/93862 - ICE with static_cast when converting from int[].
* g++.dg/cpp0x/rv-cast7.C: New test. * g++.dg/cpp0x/rv-cast7.C: New test.
......
// PR c++/93676 - value-init crash in template.
// { dg-do compile { target c++11 } }
struct P {
int x = 0;
};
template<class T>
struct S {
S() { new P[2][2]; }
};
S<int> s;
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