PR c++/84424 - ICE with constexpr and __builtin_shuffle.
authorJason Merrill <jason@redhat.com>
Thu, 22 Feb 2018 22:50:37 +0000 (17:50 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 22 Feb 2018 22:50:37 +0000 (17:50 -0500)
* constexpr.c (reduced_constant_expression_p): Handle CONSTRUCTOR of
VECTOR_TYPE.

From-SVN: r257924

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

index f38f662f8f5c196940468bea5461a2b799e2c323..79b7f00644dc2e9613919d47162e68c2fcde1808 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-22  Jason Merrill  <jason@redhat.com>
+
+       PR c++/84424 - ICE with constexpr and __builtin_shuffle.
+       * constexpr.c (reduced_constant_expression_p): Handle CONSTRUCTOR of
+       VECTOR_TYPE.
+
 2018-02-22  Marek Polacek  <polacek@redhat.com>
 
        PR c++/84493
index f095b038d323ca326cb38e3b839e65c5b93e48ca..47ff90cb05561193fa270ff66556bead9aad0b90 100644 (file)
@@ -1763,7 +1763,13 @@ reduced_constant_expression_p (tree t)
       /* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR.  */
       tree idx, val, field; unsigned HOST_WIDE_INT i;
       if (CONSTRUCTOR_NO_IMPLICIT_ZERO (t))
-       field = next_initializable_field (TYPE_FIELDS (TREE_TYPE (t)));
+       {
+         if (TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
+           /* An initialized vector would have a VECTOR_CST.  */
+           return false;
+         else
+           field = next_initializable_field (TYPE_FIELDS (TREE_TYPE (t)));
+       }
       else
        field = NULL_TREE;
       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, idx, val)
diff --git a/gcc/testsuite/g++.dg/ext/vector34.C b/gcc/testsuite/g++.dg/ext/vector34.C
new file mode 100644 (file)
index 0000000..5cca530
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/84424
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+typedef int vec __attribute__ ((vector_size (2 * sizeof (int))));
+
+constexpr vec u = { 1, 2 };
+constexpr vec v = __builtin_shuffle (v, u); // { dg-error "" }