From: Jason Merrill Date: Fri, 9 Jul 2021 17:50:01 +0000 (-0400) Subject: c++: concepts TS and explicit specialization [PR101098] X-Git-Tag: releases/gcc-11.2.0~86 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8b273a8566e7806e9498c78b16c30c9d81d6e81b;p=thirdparty%2Fgcc.git c++: concepts TS and explicit specialization [PR101098] duplicate_decls was not recognizing the explicit specialization as matching the implicit specialization of g because function_requirements_equivalent_p was seeing the C constraint on the implicit one and not on the explicit. PR c++/101098 gcc/cp/ChangeLog: * decl.c (function_requirements_equivalent_p): Only compare trailing requirements on a specialization. gcc/testsuite/ChangeLog: * g++.dg/concepts/explicit-spec1.C: New test. --- diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 9cfe62a98eeb..5e101ffb8437 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -944,7 +944,9 @@ static bool function_requirements_equivalent_p (tree newfn, tree oldfn) { /* In the concepts TS, the combined constraints are compared. */ - if (cxx_dialect < cxx20) + if (cxx_dialect < cxx20 + && (DECL_TEMPLATE_SPECIALIZATION (newfn) + <= DECL_TEMPLATE_SPECIALIZATION (oldfn))) { tree ci1 = get_constraints (oldfn); tree ci2 = get_constraints (newfn); diff --git a/gcc/testsuite/g++.dg/concepts/explicit-spec1.C b/gcc/testsuite/g++.dg/concepts/explicit-spec1.C new file mode 100644 index 000000000000..d9b6b3d1741d --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/explicit-spec1.C @@ -0,0 +1,9 @@ +// PR c++/101098 +// { dg-do compile { target concepts } } + +template concept C = __is_class(T); +struct Y { int n; } y; +template void g(T) { } +int called; +template<> void g(Y) { called = 3; } +int main() { g(y); }