]> gcc.gnu.org Git - gcc.git/commit
c++: don't substitute TEMPLATE_PARM_CONSTRAINTS [PR100374]
authorPatrick Palka <ppalka@redhat.com>
Fri, 3 Jun 2022 13:29:12 +0000 (09:29 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 21 Jul 2022 16:38:45 +0000 (12:38 -0400)
commit90655e30130f8f609911335902db3c8354a5e21a
tree64e98e424f14c89891ec3d6acea27597366d8a1f
parent4ebc9fef1ac36f353866c66b398e9bd0f1c2ed3d
c++: don't substitute TEMPLATE_PARM_CONSTRAINTS [PR100374]

This patch makes us avoid substituting into the TEMPLATE_PARM_CONSTRAINTS
of each template parameter except as necessary for declaration matching,
like we already do for the other constituent constraints of a declaration.

This patch also improves the CA104 implementation of explicit
specialization matching of a constrained function template inside a
class template, by considering the function's combined constraints
instead of just its trailing constraints.  This allows us to correctly
handle the first three explicit specializations in concepts-spec2.C
below, but because we compare the constraints as a whole, it means we
incorrectly accept the fourth explicit specialization which writes #3's
constraints in a different way.  For complete correctness here,
determine_specialization should use tsubst_each_template_parm_constraints
and template_parameter_heads_equivalent_p.

PR c++/100374

gcc/cp/ChangeLog:

* pt.cc (determine_specialization): Compare overall constraints
not just the trailing constraints.
(tsubst_each_template_parm_constraints): Define.
(tsubst_friend_function): Use it.
(tsubst_friend_class): Use it.
(tsubst_template_parm): Don't substitute TEMPLATE_PARM_CONSTRAINTS.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/concepts-spec2.C: New test.
* g++.dg/cpp2a/concepts-template-parm11.C: New test.

(cherry picked from commit 43c013df02fdb07f9b7a5e7e6669e6d69769d451)
gcc/cp/pt.cc
gcc/testsuite/g++.dg/cpp2a/concepts-spec2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/concepts-template-parm11.C [new file with mode: 0644]
This page took 0.060177 seconds and 5 git commands to generate.