https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80690
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- Our std::is_function is not compatible with Clang: struct true_type { static constexpr bool value = true; }; struct false_type { static constexpr bool value = false; }; template<typename> struct is_function : public false_type { }; #if __cpp_noexcept_function_type template<typename _Res, typename... _ArgTypes, bool ne> struct is_function<_Res(_ArgTypes...) noexcept(ne)> : public true_type { }; #else template<typename _Res, typename... _ArgTypes> struct is_function<_Res(_ArgTypes...)> : public true_type { }; #endif template<typename T> struct remove_reference { using type = T; }; template<typename T> struct remove_reference<T&> { using type = T; }; template<typename T> struct remove_reference<T&&> { using type = T; }; static_assert( is_function<void()>::value, "" ); prog.cc:10:10: error: class template partial specialization contains a template parameter that cannot be deduced; this partial specialization will never be used [-Wunusable-partial-specialization] struct is_function<_Res(_ArgTypes...) noexcept(ne)> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ prog.cc:9:53: note: non-deducible template parameter 'ne' template<typename _Res, typename... _ArgTypes, bool ne> ^ prog.cc:22:1: error: static_assert failed "" static_assert( is_function<void()>::value, "" ); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 errors generated. I think it's a Clang bug, that should be deducible.