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.

Reply via email to