aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Pinski <quic_apinski@quicinc.com>2025-01-13 10:14:45 -0800
committerAndrew Pinski <quic_apinski@quicinc.com>2025-01-13 16:41:41 -0800
commitf7b7fe16579ac13d7fd48e7f9a6082778a0a99f7 (patch)
treecea48f7ecd61e95a86c81bb05b79166f86d78292
parentc864ffe615424de08abfe271fee7dc815c93bd21 (diff)
downloadgcc-f7b7fe16579ac13d7fd48e7f9a6082778a0a99f7.zip
gcc-f7b7fe16579ac13d7fd48e7f9a6082778a0a99f7.tar.gz
gcc-f7b7fe16579ac13d7fd48e7f9a6082778a0a99f7.tar.bz2
c++: Add support for vec_dup to constexpr [PR118445]
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>
-rw-r--r--gcc/cp/constexpr.cc2
-rw-r--r--gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C16
2 files changed, 18 insertions, 0 deletions
diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 1345bc1..0896576 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -8005,6 +8005,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
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;
@@ -10344,6 +10345,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
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);
diff --git a/gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C b/gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C
new file mode 100644
index 0000000..4348956
--- /dev/null
+++ b/gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C
@@ -0,0 +1,16 @@
+/* { 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);
+}