https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71534
--- Comment #2 from Michele Caini <michele.caini at gmail dot com> --- The fact that it compiles it is misleading at least. Consider the following code: #include<type_traits> template<typename...> using void_t = void; template<typename, typename = void_t<>> struct has_foo: std::false_type { }; template<typename T> struct has_foo<T, decltype(T::foo)>: std::true_type { }; struct S: has_foo<S> { static constexpr int foo = 42; }; int main() { // S does not have foo... static_assert(not S::value, "!"); // ... really? static_assert(S::foo == 42, "!"); } The result is unexpected indeed. So subtle an issue to find, that one.