On Thu, Sep 1, 2022 at 2:40 PM Jason Merrill <ja...@redhat.com> wrote:
>
> On 8/31/22 17:15, Patrick Palka wrote:
> > This introduces an early exit test to most_specialized_partial_spec for
> > the common case where we have no partial specializations, which allows
> > us to avoid some unnecessary work.  In passing, clean the function up a
> > bit.
> >
> > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
> > trunk?
>
> OK.

Thanks.  This patch fell through the cracks for GCC 13, but I pushed
it to trunk just now.

>
> > gcc/cp/ChangeLog:
> >
> >       * pt.cc (most_specialized_partial_spec): Exit early when
> >       DECL_TEMPLATE_SPECIALIZATIONS is empty.  Move local variable
> >       declarations closer to their first use.  Remove redundant
> >       flag_concepts test.  Remove redundant forward declaration.
> > ---
> >   gcc/cp/pt.cc | 45 +++++++++++++++++++--------------------------
> >   1 file changed, 19 insertions(+), 26 deletions(-)
> >
> > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> > index fe7e809fc2d..497a18ef728 100644
> > --- a/gcc/cp/pt.cc
> > +++ b/gcc/cp/pt.cc
> > @@ -187,7 +187,6 @@ static int unify_pack_expansion (tree, tree, tree,
> >   static tree copy_template_args (tree);
> >   static tree tsubst_template_parms (tree, tree, tsubst_flags_t);
> >   static void tsubst_each_template_parm_constraints (tree, tree, 
> > tsubst_flags_t);
> > -tree most_specialized_partial_spec (tree, tsubst_flags_t);
> >   static tree tsubst_aggr_type (tree, tree, tsubst_flags_t, tree, int);
> >   static tree tsubst_arg_types (tree, tree, tree, tsubst_flags_t, tree);
> >   static tree tsubst_function_type (tree, tree, tsubst_flags_t, tree);
> > @@ -25756,15 +25755,7 @@ most_general_template (tree decl)
> >   tree
> >   most_specialized_partial_spec (tree target, tsubst_flags_t complain)
> >   {
> > -  tree list = NULL_TREE;
> > -  tree t;
> > -  tree champ;
> > -  int fate;
> > -  bool ambiguous_p;
> > -  tree outer_args = NULL_TREE;
> > -  tree tmpl, args;
> > -
> > -  tree decl;
> > +  tree tmpl, args, decl;
> >     if (TYPE_P (target))
> >       {
> >         tree tinfo = CLASSTYPE_TEMPLATE_INFO (target);
> > @@ -25788,13 +25779,18 @@ most_specialized_partial_spec (tree target, 
> > tsubst_flags_t complain)
> >     else
> >       gcc_unreachable ();
> >
> > +  tree main_tmpl = most_general_template (tmpl);
> > +  tree specs = DECL_TEMPLATE_SPECIALIZATIONS (main_tmpl);
> > +  if (!specs)
> > +    /* There are no partial specializations of this template.  */
> > +    return NULL_TREE;
> > +
> >     push_access_scope_guard pas (decl);
> >     deferring_access_check_sentinel acs (dk_no_deferred);
> >
> > -  tree main_tmpl = most_general_template (tmpl);
> > -
> >     /* For determining which partial specialization to use, only the
> >        innermost args are interesting.  */
> > +  tree outer_args = NULL_TREE;
> >     if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
> >       {
> >         outer_args = strip_innermost_template_args (args, 1);
> > @@ -25806,7 +25802,8 @@ most_specialized_partial_spec (tree target, 
> > tsubst_flags_t complain)
> >        fully resolve everything.  */
> >     processing_template_decl_sentinel ptds;
> >
> > -  for (t = DECL_TEMPLATE_SPECIALIZATIONS (main_tmpl); t; t = TREE_CHAIN 
> > (t))
> > +  tree list = NULL_TREE;
> > +  for (tree t = specs; t; t = TREE_CHAIN (t))
> >       {
> >         const tree ospec_tmpl = TREE_VALUE (t);
> >
> > @@ -25829,10 +25826,8 @@ most_specialized_partial_spec (tree target, 
> > tsubst_flags_t complain)
> >         if (outer_args)
> >           spec_args = add_to_template_args (outer_args, spec_args);
> >
> > -          /* Keep the candidate only if the constraints are satisfied,
> > -             or if we're not compiling with concepts.  */
> > -          if (!flag_concepts
> > -           || constraints_satisfied_p (ospec_tmpl, spec_args))
> > +       /* Keep the candidate only if the constraints are satisfied.  */
> > +       if (constraints_satisfied_p (ospec_tmpl, spec_args))
> >               {
> >             list = tree_cons (spec_args, ospec_tmpl, list);
> >                 TREE_TYPE (list) = TREE_TYPE (t);
> > @@ -25843,13 +25838,11 @@ most_specialized_partial_spec (tree target, 
> > tsubst_flags_t complain)
> >     if (! list)
> >       return NULL_TREE;
> >
> > -  ambiguous_p = false;
> > -  t = list;
> > -  champ = t;
> > -  t = TREE_CHAIN (t);
> > -  for (; t; t = TREE_CHAIN (t))
> > +  tree champ = list;
> > +  bool ambiguous_p = false;
> > +  for (tree t = TREE_CHAIN (list); t; t = TREE_CHAIN (t))
> >       {
> > -      fate = more_specialized_partial_spec (tmpl, champ, t);
> > +      int fate = more_specialized_partial_spec (tmpl, champ, t);
> >         if (fate == 1)
> >       ;
> >         else
> > @@ -25868,9 +25861,9 @@ most_specialized_partial_spec (tree target, 
> > tsubst_flags_t complain)
> >       }
> >
> >     if (!ambiguous_p)
> > -    for (t = list; t && t != champ; t = TREE_CHAIN (t))
> > +    for (tree t = list; t && t != champ; t = TREE_CHAIN (t))
> >         {
> > -     fate = more_specialized_partial_spec (tmpl, champ, t);
> > +     int fate = more_specialized_partial_spec (tmpl, champ, t);
> >       if (fate != 1)
> >         {
> >           ambiguous_p = true;
> > @@ -25889,7 +25882,7 @@ most_specialized_partial_spec (tree target, 
> > tsubst_flags_t complain)
> >         else
> >       error ("ambiguous template instantiation for %q#D", target);
> >         str = ngettext ("candidate is:", "candidates are:", list_length 
> > (list));
> > -      for (t = list; t; t = TREE_CHAIN (t))
> > +      for (tree t = list; t; t = TREE_CHAIN (t))
> >           {
> >         tree subst = build_tree_list (TREE_VALUE (t), TREE_PURPOSE (t));
> >             inform (DECL_SOURCE_LOCATION (TREE_VALUE (t)),
>

Reply via email to