https://gcc.gnu.org/g:f7b7fe16579ac13d7fd48e7f9a6082778a0a99f7

commit r15-6885-gf7b7fe16579ac13d7fd48e7f9a6082778a0a99f7
Author: Andrew Pinski <quic_apin...@quicinc.com>
Date:   Mon Jan 13 10:14:45 2025 -0800

    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_apin...@quicinc.com>

Diff:
---
 gcc/cp/constexpr.cc                                    |  2 ++
 gcc/testsuite/g++.target/aarch64/sve/constexpr-add-1.C | 16 ++++++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 1345bc124efb..0896576fd28e 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 000000000000..43489560c8a8
--- /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);
+}

Reply via email to