On Wed, 29 Jan 2025 at 18:55, Patrick Palka wrote: > > Tested on x86_64-pc-linux-gnu, I suppose this is stage 1 material?
Yes, I think so, since it could impact C++17 programs. OK for trunk as soon as stage 1 opens though, thanks. > > -- >8 -- > > As a follow-up to r15-1253 and r15-1254. > > libstdc++-v3/ChangeLog: > > * include/std/type_traits (__is_invocable): Define in terms of > corresponding builtin if available. > (__is_nothrow_invocable): Likewise. > (is_invocable_v): Likewise. > (is_nothrow_invocable_v): Likewise. > --- > libstdc++-v3/include/std/type_traits | 19 ++++++++++++++++++- > 1 file changed, 18 insertions(+), 1 deletion(-) > > diff --git a/libstdc++-v3/include/std/type_traits > b/libstdc++-v3/include/std/type_traits > index 33892818257..f576d5b1426 100644 > --- a/libstdc++-v3/include/std/type_traits > +++ b/libstdc++-v3/include/std/type_traits > @@ -3211,7 +3211,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > template<typename _Fn, typename... _ArgTypes> > struct __is_invocable > +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_invocable) > + : __bool_constant<__is_invocable(_Fn, _ArgTypes...)> > +#else > : __is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, void>::type > +#endif > { }; > > template<typename _Fn, typename _Tp, typename... _Args> > @@ -3262,8 +3266,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > // __is_nothrow_invocable (std::is_nothrow_invocable for C++11) > template<typename _Fn, typename... _Args> > struct __is_nothrow_invocable > +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_nothrow_invocable) > + : __bool_constant<__is_nothrow_invocable(_Fn, _Args...)> > +#else > : __and_<__is_invocable<_Fn, _Args...>, > __call_is_nothrow_<_Fn, _Args...>>::type > +#endif > { }; > > #pragma GCC diagnostic push > @@ -3702,10 +3710,19 @@ template <typename _From, typename _To> > inline constexpr bool is_convertible_v = is_convertible<_From, _To>::value; > #endif > template<typename _Fn, typename... _Args> > - inline constexpr bool is_invocable_v = is_invocable<_Fn, _Args...>::value; > + inline constexpr bool is_invocable_v > +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_invocable) > + = __is_invocable(_Fn, _Args...); > +#else > + = is_invocable<_Fn, _Args...>::value; > +#endif > template<typename _Fn, typename... _Args> > inline constexpr bool is_nothrow_invocable_v > +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_nothrow_invocable) > + = __is_nothrow_invocable(_Fn, _Args...); > +#else > = is_nothrow_invocable<_Fn, _Args...>::value; > +#endif > template<typename _Ret, typename _Fn, typename... _Args> > inline constexpr bool is_invocable_r_v > = is_invocable_r<_Ret, _Fn, _Args...>::value; > -- > 2.48.1.131.gda898a5c64 >