https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99686
W E Brown <webrown.cpp at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |webrown.cpp at gmail dot com --- Comment #2 from W E Brown <webrown.cpp at gmail dot com> --- Since C++ has no partial specializations of function templates, the test case in Comment 1 is somewhat mischaracterized there. Instead, what we have in that test case are, first, two distinct primary templates that happen to share a common name within a single scope, and hence overload that name. Note that these primary templates are distinguishable because one is more constrained (via its requires-clause) than the other (which is unconstrained): whenever these primary templates produce equally viable candidates during overload resolution, C++ specifies that the more constrained declaration should be selected. Finally, the test case defines a complete specialization, but which of the overloaded primary templates is being specialized? That's the real question for the compiler to determine in its role of language lawyer. Note that if one of the two primary templates were removed from the test case, the compiler's decision would become near-trivial to make, as there would remain only a single candidate. If, instead, the explicit specialization were removed from the test case, such a compiler determination would be no longer needed at all.