https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99186
--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> --- And it doesn't matter whether enums are used: template<int N, typename T, typename... U> struct tuple_impl : tuple_impl<N + 1, U...> { }; template<int N, typename T> struct tuple_impl<N, T> { }; template<typename T, typename U> struct tuple : tuple_impl<0, T, U> { }; template<typename T, int N, typename... U> void get(const tuple_impl<N, T, U...>&) { } template < auto > struct S { int i; }; int main() { tuple<S<1>,S<1U>> x; get<S<1U>>(x); // does not compile } The compiler doesn't correctly distinguish S<1> and S<1L>.