On 2/20/24 19:06, Andrew Pinski wrote:
After r7-987-gf17a223de829cb, the access for the elements of a vector type 
would lose the qualifiers.
So if we had `constvector[0]`, the type of the element of the array would not 
have const on it.
This was due to a missing build_qualified_type for the inner type of the vector 
when building the array type.
We need to add back the call to build_qualified_type and now the access has the 
correct qualifiers. So the
overloads and even if it is a lvalue or rvalue is correctly done.

Note we correctly now reject the testcase gcc.dg/pr83415.c which was 
incorrectly accepted after r7-987-gf17a223de829cb.

Built and tested for aarch64-linux-gnu.

        PR c++/89224

gcc/c-family/ChangeLog:

        * c-common.cc (convert_vector_to_array_for_subscript): Call 
build_qualified_type
        for the inner type.

gcc/cp/ChangeLog:

        * constexpr.cc (cxx_eval_array_reference): Compare main variants
        for the vector/array types instead of the types directly.

gcc/testsuite/ChangeLog:

        * g++.dg/torture/vector-subaccess-1.C: New test.
        * gcc.dg/pr83415.c: Change warning to error.

Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
---
  gcc/c-family/c-common.cc                      |  7 +++++-
  gcc/cp/constexpr.cc                           |  3 ++-
  .../g++.dg/torture/vector-subaccess-1.C       | 23 +++++++++++++++++++
  gcc/testsuite/gcc.dg/pr83415.c                |  2 +-
  4 files changed, 32 insertions(+), 3 deletions(-)
  create mode 100644 gcc/testsuite/g++.dg/torture/vector-subaccess-1.C

diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc
index e15eff698df..884dd9043f9 100644
--- a/gcc/c-family/c-common.cc
+++ b/gcc/c-family/c-common.cc
@@ -8936,6 +8936,7 @@ convert_vector_to_array_for_subscript (location_t loc,
    if (gnu_vector_type_p (TREE_TYPE (*vecp)))
      {
        tree type = TREE_TYPE (*vecp);
+      tree newitype;
ret = !lvalue_p (*vecp); @@ -8950,8 +8951,12 @@ convert_vector_to_array_for_subscript (location_t loc,
         for function parameters.  */
        c_common_mark_addressable_vec (*vecp);
+ /* Make sure qualifiers are copied from the vector type to the new element
+        of the array type.  */
+      newitype = build_qualified_type (TREE_TYPE (type), TYPE_QUALS (type));
+
        *vecp = build1 (VIEW_CONVERT_EXPR,
-                     build_array_type_nelts (TREE_TYPE (type),
+                     build_array_type_nelts (newitype,
                                              TYPE_VECTOR_SUBPARTS (type)),
                      *vecp);
      }
diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index fa346fe01c9..1fe91d16e8e 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -4421,7 +4421,8 @@ cxx_eval_array_reference (const constexpr_ctx *ctx, tree 
t,
    if (!lval
        && TREE_CODE (ary) == VIEW_CONVERT_EXPR
        && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (ary, 0)))
-      && TREE_TYPE (t) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (ary, 0))))
+      && TYPE_MAIN_VARIANT (TREE_TYPE (t))
+         == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (TREE_OPERAND (ary, 0)))))

Please add parens around the == expression so the formatting is stable.

With that change, OK for trunk and release branches.

Jason

Reply via email to