With the addition of supporting operations on the SVE scalable vector types,
the vec_duplicate tree will show up in expressions and the constexpr handling
was not done for this tree code.
This is a simple fix to treat VEC_DUPLICATE like any other unary operator and allows
the constexpr-add-1.C testcase to work.
Built and tested for aarch64-linux-gnu.
PR c++/118445
gcc/cp/ChangeLog:
* constexpr.cc (cxx_eval_constant_expression): Handle VEC_DUPLICATE like
a "normal" unary operator.
(potential_constant_expression_1): Likewise.
gcc/testsuite/ChangeLog:
* g++.target/aarch64/sve/constexpr-add-1.C: New test.
Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
case BIT_NOT_EXPR:
case TRUTH_NOT_EXPR:
case FIXED_CONVERT_EXPR:
+ case VEC_DUPLICATE_EXPR:
r = cxx_eval_unary_expression (ctx, t, lval,
non_constant_p, overflow_p);
break;
case UNARY_PLUS_EXPR:
case UNARY_LEFT_FOLD_EXPR:
case UNARY_RIGHT_FOLD_EXPR:
+ case VEC_DUPLICATE_EXPR:
unary:
return RECUR (TREE_OPERAND (t, 0), rval);
--- /dev/null
+/* { dg-do compile } */
+
+/* PR C++/118445 */
+
+#include <arm_sve.h>
+
+/* See if constexpr handles VEC_DUPLICATE and SVE. */
+constexpr svfloat32_t f(svfloat32_t b, float a)
+{
+ return b + a;
+}
+
+svfloat32_t g(void)
+{
+ return f((svfloat32_t){1.0}, 2.0);
+}