On Fri, Jul 5, 2024 at 12:18 PM Patrick Palka <ppa...@redhat.com> wrote: > > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK > for trunk/14 and perhaps 13? > > Alternatively we can set current_template_parms from weakly_subsumes > instead, who has only one caller anyway.
Ping. > > -- >8 -- > > Here we normalize the constraint same_as<auto, bool> for the first > time during constraint subsumption checking of B / TT as part of ttp > coercion. During this normalization the set of in-scope template > parameters i.e. current_template_parms is empty, which tricks the > satisfaction cache into thinking that the satisfaction value of the > constraint is independent of its template parameters, and we incorrectly > conflate the satisfaction value with auto = bool vs auto = long and > accept the specialization A<long, B>. > > This patch fixes this by setting current_template_parms appropirately > during subsumption checking. > > PR c++/115656 > > gcc/cp/ChangeLog: > > * pt.cc (is_compatible_template_arg): Set current_template_parms > around the call to weakly_subsumes. > > gcc/testsuite/ChangeLog: > > * g++.dg/cpp2a/concepts-ttp7.C: New test. > --- > gcc/cp/pt.cc | 4 ++++ > gcc/testsuite/g++.dg/cpp2a/concepts-ttp7.C | 12 ++++++++++++ > 2 files changed, 16 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-ttp7.C > > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc > index 017cc7fd0ab..1f6553790a5 100644 > --- a/gcc/cp/pt.cc > +++ b/gcc/cp/pt.cc > @@ -8493,6 +8493,10 @@ is_compatible_template_arg (tree parm, tree arg, tree > args) > return false; > } > > + /* Normalization needs to know the effective set of in-scope > + template parameters. */ > + auto ctp = make_temp_override (current_template_parms, > + DECL_TEMPLATE_PARMS (arg)); > return weakly_subsumes (parm_cons, arg); > } > > diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-ttp7.C > b/gcc/testsuite/g++.dg/cpp2a/concepts-ttp7.C > new file mode 100644 > index 00000000000..bc123ecf75e > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-ttp7.C > @@ -0,0 +1,12 @@ > +// PR c++/115656 > +// { dg-do compile { target c++20 } } > + > +template<class T, class U> concept same_as = __is_same(T, U); > + > +template<same_as<bool> U, template<same_as<bool>> class TT> > +struct A { }; > + > +template<same_as<bool>> class B; > + > +A<bool, B> a1; > +A<long, B> a2; // { dg-error "constraint failure" } > -- > 2.45.2.746.g06e570c0df >