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:
parent
8850966e26
commit
3ee378fb55
3 changed files with 34 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
26
gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C
Normal file
26
gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C
Normal 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);
|
Loading…
Add table
Reference in a new issue