From 3ee378fb554de45f2415cabc7a1a50add5bbe17d Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 20 Sep 2018 13:09:19 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 ++++ gcc/cp/constexpr.c | 3 +++ gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C | 26 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 75286d53fdb..c5072d53334 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-09-20 Jason Merrill + + PR c++/87075 - ICE with constexpr array initialization. + * constexpr.c (cxx_eval_vec_init_1): Handle trivial initialization. + 2018-09-19 Marek Polacek Add -Wclass-conversion. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index aa33319875f..fdea769faa9 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -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; diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C new file mode 100644 index 00000000000..1f15bef8d0c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C @@ -0,0 +1,26 @@ +// PR c++/87075 +// { dg-do compile { target c++14 } } + +template +struct vec +{ + struct { T y; } n; + vec() = default; +}; + +template +struct S +{ + vec value[2]; + template + constexpr S(const U&); +}; + +template +template +constexpr S::S(const X&) +{ + value[0] = vec(); +} + +Sm(0); -- 2.30.2