On Wed, 2024-05-22 at 16:30 -0400, Jason Merrill wrote:
> OK, on the right patch this time I hope.
> 
> Looks like you still need either FSF copyright assignment or DCO 
> certification per https://gcc.gnu.org/contribute.html#legal
> 

Hi. Thanks for your patience. I now have the FSF copyright assignment.

> On 5/15/24 13:27, Seyed Sajad Kahani wrote:
> > This patch resolves PR114915 by replacing the logic that fills in
> > the
> > missing levels in do_auto_deduction in cp/pt.cc.
> 
> I miss the text in your original patch that explained the problem
> more.
> 

The patch that I will send in the upcoming email contains the
explanation from the v1 patch as well.

> > The new approach now trims targs if the depth of targs is deeper
> > than desired
> > (this will only happen in specific contexts), and still fills targs
> > with empty
> > layers if it has fewer depths than expected.
> > 
> > PR c++/114915
> 
> This line needs to start with a tab.
> 
> > gcc/cp/ChangeLog:
> > 
> >     * pt.cc (do_auto_deduction): Handle excess outer template
> > arguments during constrained auto satisfaction.
> 
> This one, too.  These issues are flagged by git gcc-verify, and are 
> easier to avoid with git gcc-commit-mklog.
> 

Thanks for guiding me. The commit is now verified.

> > gcc/testsuite/ChangeLog:
> > 
> >     * g++.dg/cpp2a/concepts-placeholder14.C: New test.
> >     * g++.dg/cpp2a/concepts-placeholder15.C: New test.
> 
> This test still needs a variable template partial specialization.
> 

Regarding this, I have added a simple variable template parameter
specialization to the test, but due to PR c++/115030, which I will be
working on right after this patch, a more complex test will fail.

> A few coding style nits below.
> 
> >     * g++.dg/cpp2a/concepts-placeholder16.C: New test.
> > ---
> >   gcc/cp/pt.cc                                  | 20 ++++++++---
> >   .../g++.dg/cpp2a/concepts-placeholder14.C     | 19 +++++++++++
> >   .../g++.dg/cpp2a/concepts-placeholder15.C     | 15 +++++++++
> >   .../g++.dg/cpp2a/concepts-placeholder16.C     | 33
> > +++++++++++++++++++
> >   4 files changed, 83 insertions(+), 4 deletions(-)
> >   create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-
> > placeholder14.C
> >   create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-
> > placeholder15.C
> >   create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-
> > placeholder16.C
> > 
> > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> > index 32640f8e9..ecfda67aa 100644
> > --- a/gcc/cp/pt.cc
> > +++ b/gcc/cp/pt.cc
> > @@ -31253,6 +31253,19 @@ do_auto_deduction (tree type, tree init,
> > tree auto_node,
> >     full_targs = add_outermost_template_args (tmpl,
> > full_targs);
> >         full_targs = add_to_template_args (full_targs, targs);
> >   
> > +      int want = TEMPLATE_TYPE_ORIG_LEVEL (auto_node);
> > +      int have = TMPL_ARGS_DEPTH (full_targs);
> > +
> > +      if (want < have)
> > +   {
> > +     // if a constrained auto is declared in an explicit
> > specialization
> 
> We generally use C-style /* */ comments, that start with a capital 
> letter and end with a period.
> 
> > +     gcc_assert (context == adc_variable_type || context ==
> > adc_return_type
> > +                     || context == adc_decomp_type);
> 
> The || should line up with the 'c' on the previous line.
> 
> > +     tree trimmed_full_args = get_innermost_template_args
> > +       (full_targs, want);
> 
> We try to avoid having arguments to the left of the function name;
> here 
> I'd start the new line with the = instead.
> 
> > +     full_targs = trimmed_full_args;
> > +   }
> > +
> 
> Unnecessary tab on this line.
> 
> >         /* HACK: Compensate for callers not always communicating
> > all levels of
> >      outer template arguments by filling in the outermost
> > missing levels
> >      with dummy levels before checking satisfaction.  We'll
> > still crash
> > @@ -31260,11 +31273,10 @@ do_auto_deduction (tree type, tree init,
> > tree auto_node,
> >      these missing levels, but this hack otherwise allows us
> > to handle a
> >      large subset of possible constraints (including all non-
> > dependent
> >      constraints).  */
> > -      if (int missing_levels = (TEMPLATE_TYPE_ORIG_LEVEL
> > (auto_node)
> > -                           - TMPL_ARGS_DEPTH (full_targs)))
> > +      if (want > have)
> >     {
> > -     tree dummy_levels = make_tree_vec (missing_levels);
> > -     for (int i = 0; i < missing_levels; ++i)
> > +     tree dummy_levels = make_tree_vec (want - have);
> > +     for (int i = 0; i < want - have; ++i)
> >         TREE_VEC_ELT (dummy_levels, i) = make_tree_vec (0);
> >       full_targs = add_to_template_args (dummy_levels,
> > full_targs);
> >     }
> > diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder14.C
> > b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder14.C
> > new file mode 100644
> > index 000000000..fcdbd7608
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder14.C
> > @@ -0,0 +1,19 @@
> > +// PR c++/114915
> > +// { dg-do compile { target c++20 } }
> > +
> > +template<typename T>
> > +concept C = __is_same(T, int);
> > +
> > +template<typename T>
> > +void f() {
> > +}
> > +
> > +template<>
> > +void f<int>() {
> > +  C auto x = 1;
> > +}
> > +
> > +int main() {
> > +  f<int>();
> > +  return 0;
> > +}
> > diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder15.C
> > b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder15.C
> > new file mode 100644
> > index 000000000..b4f73f407
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder15.C
> > @@ -0,0 +1,15 @@
> > +// PR c++/114915
> > +// { dg-do compile { target c++20 } }
> > +
> > +template<typename T, typename U>
> > +concept C = __is_same(T, U);
> > +
> > +template<typename T>
> > +int x = 0;
> > +
> > +template<>
> > +C<double> auto x<double> = 1.0;
> > +
> > +int main() {
> > +  return 0;
> > +}
> > diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder16.C
> > b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder16.C
> > new file mode 100644
> > index 000000000..f808ef1b6
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder16.C
> > @@ -0,0 +1,33 @@
> > +// PR c++/114915
> > +// { dg-do compile { target c++20 } }
> > +
> > +template<typename T, typename U>
> > +concept C = __is_same(T, U);
> > +
> > +template<typename T>
> > +struct A
> > +{
> > +    template<typename U>
> > +    void f() {
> > +    }
> > +};
> > +
> > +template<>
> > +template<>
> > +void A<int>::f<int>() {
> > +  C<int> auto x = 1;
> > +}
> > +
> > +template<>
> > +template<typename U>
> > +void A<bool>::f() {
> > +  C<int> auto x = 1;
> > +}
> > +
> > +int main() {
> > +  A<bool> a;
> > +  a.f<char>();
> > +  A<int> b;
> > +  b.f<int>();
> > +  return 0;
> > +}
> 

Thank you so much for your comments. They are all fixed now.

Reply via email to