c++: array cv-quals and template specialization [PR101402]
authorJason Merrill <jason@redhat.com>
Tue, 28 Sep 2021 14:02:04 +0000 (10:02 -0400)
committerJason Merrill <jason@redhat.com>
Fri, 15 Oct 2021 20:12:56 +0000 (16:12 -0400)
commit79802c5dcc043a515f429bb2bec7573b8537c32a
tree71072d90ddd7604362cfd0deecab92e1093116f4
parent1e819bd95ebeefc1dc469daa1855ce005cb77822
c++: array cv-quals and template specialization [PR101402]

PRs 101402, 102033, etc. demonstrated that the fix for PR92010 wasn't
handling all cases of the CWG1001/1322 issue with parameter type qual
stripping and arrays with templates.  The problem turned out to be in
determine_specialization, which did an extra substitution without the 92010
fix and then complained that the result didn't match.

But just removing that wrong/redundant code meant that we were accepting
specializations with different numbers of parameters, because the code in
fn_type_unification that compares types in this case wasn't checking for
length mismatch.

After fixing that, I realized that fn_type_unification couldn't tell the
difference between variadic and non-variadic function types, because the
args array doesn't include the terminal void we use to indicate non-variadic
function type.  So I added it, and made the necessary adjustments.

Thanks to qingzhe "nick" huang <nickhuang99@hotmail.com> for the patch that
led me to dig more into this, and the extensive testcases.

PR c++/51851
PR c++/101402
PR c++/102033
PR c++/102034
PR c++/102039
PR c++/102044

gcc/cp/ChangeLog:

* pt.c (determine_specialization): Remove redundant code.
(fn_type_unification): Check for mismatched length.
(type_unification_real): Ignore terminal void.
(get_bindings): Don't stop at void_list_node.
* class.c (resolve_address_of_overloaded_function): Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/template/fnspec2.C: New test.
* g++.dg/template/parm-cv1.C: New test.
* g++.dg/template/parm-cv2.C: New test.
* g++.dg/template/parm-cv3.C: New test.
gcc/cp/class.c
gcc/cp/pt.c
gcc/testsuite/g++.dg/template/fnspec2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/parm-cv1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/parm-cv2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/parm-cv3.C [new file with mode: 0644]