On Tue, Apr 30, 2024 at 11:54 AM Jason Merrill <ja...@redhat.com> wrote:
>
> 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.
ok, I will make that change.

>
> With that change, OK for trunk and release branches.

For the GCC 14 branch, should I wait until after the release due to
RC1 going out today and I am not sure this counts as a show stopper
issue.

Thanks,
Andrew

>
> Jason
>

Reply via email to