]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/87075 - ICE with constexpr array initialization.
authorJason Merrill <jason@redhat.com>
Mon, 26 Nov 2018 15:53:43 +0000 (10:53 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 26 Nov 2018 15:53:43 +0000 (10:53 -0500)
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: r266468

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/testsuite/g++.dg/cpp1y/constexpr-array6.C [new file with mode: 0644]

index 854e0b59e75a9832425a785c24701b10296b26f0..3392176ce26dacbc0a13878ec6c82ed600b393f2 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-26  Jason Merrill  <jason@redhat.com>
+
+       PR c++/87075 - ICE with constexpr array initialization.
+       * constexpr.c (cxx_eval_vec_init_1): Handle trivial initialization.
+
 2018-10-23  Tom de Vries  <tdevries@suse.de>
 
        backport from trunk:
index 361a955ba01866fc907cb1bf532aac6c276e8cfb..48e821903ac02c99b5c754b43218bc2f67a305b7 100644 (file)
@@ -2898,6 +2898,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 (file)
index 0000000..1f15bef
--- /dev/null
@@ -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);