https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113272
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Ok, this behavior is interesting: ``` int g = 0; int g1 = 0; template <auto *a> struct A { void f() { g++; } }; template < const auto * a> struct A<a>{ void f(){ g1++; } }; int x = 0; const int x1 = 0; int main() { { int t = 0; A<&x> a; t++; a.f(); if (g != t) return 1; } int t = 0; if (0){ A<(const int *)&x> a1; a1.f(); t++; if (g1 != t) return 1; } { A<&x1> a1; a1.f(); t++; if (g1 != t) return 1; } return 0; } ``` The above passes like expected but if we enable the case for `A<(const int *)&x>`, we get a failure in that g is incremented and not g1. Note MSVC has the same behavior for the above testcase. Though clang rejects it with an error: ``` <source>:9:8: error: class template partial specialization is not more specialized than the primary template [-Winvalid-partial-specialization] 9 | struct A<a>{ | ^ <source>:4:8: note: template is declared here 4 | struct A { | ^ ``` Which I find even more interesting ...