On Mon, 16 Sep 2024, Andrew Pinski wrote:

> On Mon, Sep 16, 2024 at 8:12 AM Patrick Palka <ppa...@redhat.com> wrote:
> >
> > Bootstrapped and regtested on x86_64-pc-linuxgnu, does this look
> > OK for trunk?  Sadly the prerequisity patch r15-2331-g523836716137d0
> > probably isn't suitable for backporting, so I reckon this should be
> > trunk-only.
> >
> > -- >8 --
> >
> > Here we're prematurely stripping the decltype(lambda) alias used inside
> > the template-id during ahead of time template argument coercion, which
> > means we treat it as if it were
> >
> >   is_same_v<decltype([]{}), decltype([]{})>
> >
> > which instead yields false since now we're substituting into the lambda
> > twice, and every such substitution yields a unique lambda.  This
> > demonstrates that such aliases should be considered opaque, a notion which
> > coincidentally we recently introduced in r15-2331-g523836716137d0.
> 
> I wonder if this fixes https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106221  
> too.
> While https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107390 looks it
> would be fixed here too.

Ah thanks, seems 107390 gets fixed but not 106221..

> 
> Thanks,
> Andrew
> 
> >
> >         PR c++/116714
> >
> > gcc/cp/ChangeLog:
> >
> >         * pt.cc (dependent_opaque_alias_p): Also return true for a
> >         decltype(lambda) alias.
> >
> > gcc/testsuite/ChangeLog:
> >
> >         * g++.dg/cpp2a/lambda-uneval18.C: New test.
> > ---
> >  gcc/cp/pt.cc                                 |  6 ++++--
> >  gcc/testsuite/g++.dg/cpp2a/lambda-uneval18.C | 20 ++++++++++++++++++++
> >  2 files changed, 24 insertions(+), 2 deletions(-)
> >  create mode 100644 gcc/testsuite/g++.dg/cpp2a/lambda-uneval18.C
> >
> > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> > index 04987f66746..a72a1eadbc7 100644
> > --- a/gcc/cp/pt.cc
> > +++ b/gcc/cp/pt.cc
> > @@ -6764,8 +6764,10 @@ dependent_opaque_alias_p (const_tree t)
> >  {
> >    return (TYPE_P (t)
> >           && typedef_variant_p (t)
> > -         && any_dependent_type_attributes_p (DECL_ATTRIBUTES
> > -                                             (TYPE_NAME (t))));
> > +         && (any_dependent_type_attributes_p (DECL_ATTRIBUTES
> > +                                              (TYPE_NAME (t)))
> > +             || (TREE_CODE (t) == DECLTYPE_TYPE
> > +                 && TREE_CODE (DECLTYPE_TYPE_EXPR (t)) == LAMBDA_EXPR)));
> >  }
> >
> >  /* Return the number of innermost template parameters in TMPL.  */
> > diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-uneval18.C 
> > b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval18.C
> > new file mode 100644
> > index 00000000000..2942f8305c7
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval18.C
> > @@ -0,0 +1,20 @@
> > +// PR c++/116714
> > +// { dg-do compile { target c++20 } }
> > +
> > +template<class T, class U>
> > +inline constexpr bool is_same_v = __is_same(T, U);
> > +
> > +template<class T, class U>
> > +struct is_same { static constexpr bool value = false; };
> > +
> > +template<class T>
> > +struct is_same<T, T> { static constexpr bool value = true; };
> > +
> > +template<class>
> > +void f() {
> > +  using type = decltype([]{});
> > +  static_assert(is_same_v<type, type>);
> > +  static_assert(is_same<type, type>::value);
> > +};
> > +
> > +template void f<int>();
> > --
> > 2.46.1.506.ged155187b4
> >
> 
> 

Reply via email to