diff options
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C | 26 |
3 files changed, 34 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 75286d5..c5072d5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index aa33319..fdea769 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 0000000..1f15bef --- /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 <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); |