PR c++/87075 - ICE with constexpr array initialization.

My patch of 2016-08-26 to avoid calling a trivial default constructor
introduced TARGET_EXPRs initialized with void_node to express trivial
initialization.  But when this shows up in a VEC_INIT_EXPR, we weren't
prepared to handle it.  Fixed by handling it explicitly in
cxx_eval_vec_init_1.

	* constexpr.c (cxx_eval_vec_init_1): Handle trivial initialization.

From-SVN: r264442
This commit is contained in:
Jason Merrill 2018-09-20 13:09:19 -04:00 committed by Jason Merrill
parent 8850966e26
commit 3ee378fb55
3 changed files with 34 additions and 0 deletions

View file

@ -1,3 +1,8 @@
2018-09-20 Jason Merrill <jason@redhat.com>
PR c++/87075 - ICE with constexpr array initialization.
* constexpr.c (cxx_eval_vec_init_1): Handle trivial initialization.
2018-09-19 Marek Polacek <polacek@redhat.com>
Add -Wclass-conversion.

View file

@ -3034,6 +3034,9 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
{
/* Initializing an element using value or default initialization
we just pre-built above. */
if (init == void_node)
/* Trivial default-init, don't do anything to the CONSTRUCTOR. */
return ctx->ctor;
eltinit = cxx_eval_constant_expression (&new_ctx, init, lval,
non_constant_p, overflow_p);
reuse = i == 0;

View file

@ -0,0 +1,26 @@
// PR c++/87075
// { dg-do compile { target c++14 } }
template <typename T>
struct vec
{
struct { T y; } n;
vec() = default;
};
template <typename T>
struct S
{
vec<T> value[2];
template<typename U>
constexpr S(const U&);
};
template<typename T>
template<typename X>
constexpr S<T>::S(const X&)
{
value[0] = vec<T>();
}
S<float>m(0);