On Fri, 9 Aug 2024, Jason Merrill wrote:

> On 8/8/24 1:00 PM, Patrick Palka wrote:
> > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this
> > look OK for trunk/14?
> > 
> > -- >8 --
> > 
> > This implements the inherited vs non-inherited guide tiebreaker
> > specified by P2582R1.  In order to track inherited-ness of a guide
> > it seems natural to reuse the lang_decl_fn::context field that already
> > tracks inherited-ness of a constructor.
> > 
> > This patch also works around CLASSTYPE_CONSTRUCTORS apparently not
> > always containing all inherited constructors, by iterating over
> > TYPE_FIELDS instead.
> > 
> > This patch also makes us recognize another written form of inherited
> > constructor, 'using Base<T>::Base::Base' whose USING_DECL_SCOPE is a
> > TYPENAME_TYPE.
> > 
> >     PR c++/116276
> > 
> > gcc/cp/ChangeLog:
> > 
> >     * call.cc (joust): Implement P2582R1 inherited vs non-inherited
> >     guide tiebreaker.
> >     * cp-tree.h (lang_decl_fn::context): Document usage in
> >     deduction_guide_p FUNCTION_DECLs.
> >     (inherited_guide_p): Declare.
> >     * pt.cc (inherited_guide_p): Define.
> >     (set_inherited_guide_context): Define.
> >     (alias_ctad_tweaks): Use set_inherited_guide_context.
> >     (inherited_ctad_tweaks): Recognize some inherited constructors
> >     whose scope is a TYPENAME_TYPE.
> >     (ctor_deduction_guides_for): For C++23 inherited CTAD, loop
> >     over TYPE_FIELDS instead of using CLASSTYPE_CONSTRUCTORS to
> >     recognize all relevant using-decls.
> > 
> > gcc/testsuite/ChangeLog:
> > 
> >     * g++.dg/cpp23/class-deduction-inherited4.C: Extend test.
> >     * g++.dg/cpp23/class-deduction-inherited5.C: New test.
> > ---
> >   gcc/cp/call.cc                                | 22 +++++++++
> >   gcc/cp/cp-tree.h                              |  8 +++-
> >   gcc/cp/pt.cc                                  | 45 +++++++++++++++----
> >   .../g++.dg/cpp23/class-deduction-inherited4.C | 15 ++++++-
> >   .../g++.dg/cpp23/class-deduction-inherited5.C | 25 +++++++++++
> >   5 files changed, 103 insertions(+), 12 deletions(-)
> >   create mode 100644 gcc/testsuite/g++.dg/cpp23/class-deduction-inherited5.C
> > 
> > diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
> > index a75e2e5e3af..3287f77b59b 100644
> > --- a/gcc/cp/call.cc
> > +++ b/gcc/cp/call.cc
> > @@ -13261,6 +13261,28 @@ joust (struct z_candidate *cand1, struct
> > z_candidate *cand2, bool warn,
> >     else if (cand2->rewritten ())
> >       return 1;
> >   +  /* F1 and F2 are generated from class template argument deduction for a
> > class
> > +     D, and F2 is generated from inheriting constructors from a base class
> > of D
> > +     while F1 is not, and for each explicit function argument, the
> > corresponding
> > +     parameters of F1 and F2 are either both ellipses or have the same type
> > */
> > +  if (deduction_guide_p (cand1->fn))
> > +    {
> > +      bool inherited1 = inherited_guide_p (cand1->fn);
> > +      bool inherited2 = inherited_guide_p (cand2->fn);
> > +      if (int diff = inherited2 - inherited1)
> > +   {
> > +     for (i = 0; i < len; ++i)
> > +       {
> > +         conversion *t1 = cand1->convs[i + off1];
> > +         conversion *t2 = cand2->convs[i + off2];
> > +         if (!same_type_p (t1->type, t2->type))
> 
> I'm not sure this comparison distinguishes between ellipse and non-ellipse?
> There doesn't seem to be a testcase for that.

Unfortunately I haven't been able to come up with a testcase for
the ellipses logic :/  It seems the earlier ICS comparison would always
break the tie first if one parameter is an ellipsis but not the other?

Is there a known example that perhaps motivated the wording?

Relatidely I noticed that unlike the inherited guide tiebreaker, the
inherited ctor tiebreaker doesn't mention ellipses, which seems
surprising: https://eel.is/c++draft/over.match.best#general-2.7

> Jason
> 
> 

Reply via email to