https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71794
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- VC++ accepts it too, so it's two for and two against. Reduced: template<unsigned N> struct X { }; template<typename T> struct Y; template<int N> struct Y<X<N>> { }; template<typename T> Y<T> f() { return {}; } auto x = f< X<1> >();