On Fri, Feb 14, 2025 at 09:30:34AM -0500, Patrick Palka wrote:
> On Thu, 13 Feb 2025, Marek Polacek wrote:
> 
> > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
> > 
> > -- >8 --
> > Here we have:
> > 
> >   template<typename T>
> >   struct X{
> >       T val;
> >       decltype(auto) value(){
> >       return (val);
> >       }
> >   };
> > 
> > where the return type of value should be 'int &' since '(val)' is an
> > expression, not a name, and decltype(auto) performs the type deduction
> > using the decltype rules.
> > 
> > The problem is that we weren't propagating REF_PARENTHESIZED_P
> > correctly: the return value of finish_non_static_data_member in this
> > test was a REFERENCE_REF_P, so we didn't set the flag.  We should
> > use force_paren_expr like below.
> > 
> >     PR c++/116379
> > 
> > gcc/cp/ChangeLog:
> > 
> >     * pt.cc (tsubst_expr) <COMPONENT_REF>: Use force_paren_expr to set
> >     REF_PARENTHESIZED_P.
> > 
> > gcc/testsuite/ChangeLog:
> > 
> >     * g++.dg/cpp1y/decltype-auto9.C: New test.
> > ---
> >  gcc/cp/pt.cc                                |  4 ++--
> >  gcc/testsuite/g++.dg/cpp1y/decltype-auto9.C | 15 +++++++++++++++
> >  2 files changed, 17 insertions(+), 2 deletions(-)
> >  create mode 100644 gcc/testsuite/g++.dg/cpp1y/decltype-auto9.C
> > 
> > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> > index a2fc8813e9d..5706a3987c3 100644
> > --- a/gcc/cp/pt.cc
> > +++ b/gcc/cp/pt.cc
> > @@ -21712,8 +21712,8 @@ tsubst_expr (tree t, tree args, tsubst_flags_t 
> > complain, tree in_decl)
> >       {
> >         r = finish_non_static_data_member (member, object, NULL_TREE,
> >                                            complain);
> > -       if (TREE_CODE (r) == COMPONENT_REF)
> > -         REF_PARENTHESIZED_P (r) = REF_PARENTHESIZED_P (t);
> > +       if (REF_PARENTHESIZED_P (t))
> > +         force_paren_expr (r);
> 
> Looks like this is the first use of force_paren_expr whose result we
> ignore.  If r is a decl then force_paren_expr returns a new tree
> wrapping it, which we'd lose by ignoring the result -- or is that not
> possible at this call site?

I don't see how finish_non_static_data_member would return a DECL.
But I can add "r = " if preferred ;-).

Marek

Reply via email to