Tested on x86_64-pc-linux-gnu, I suppose this is stage 1 material?

-- >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

Reply via email to