https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107124
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Here is one which GCC/clang agree and accepts but MSVC/ICC reject (even before the static assert): template<int> struct A {}; template<const int & I> constexpr int f(A<I>) { return 0; } template<class T> constexpr int f(T) { return 1; } const int tt = 0; static_assert( f<tt>(A<tt>{}) == 0, "" ); ---- CUT ---- So it looks like it is more complex than what I even orginally though.