[PATCH] PR77998 Remove std::thread::_Invoker::result_type

Jonathan Wakely jwakely@redhat.com
Mon Oct 17 12:23:00 GMT 2016


This typedef uses the type before it's complete, which Clang rejects.
It's not necessary anyay, we can just use decltype directly where
needed. The _Invoker type isn't user-facing and doesn't need a
result_type.

	PR libstdc++/77998
	* include/std/future (__future_base::_Deferred_state)
	(__future_base::_Async_state_impl): Use decltype to deduce return
	type, instead of _Invoker::result_type.
	* include/std/thread (thread::_Invoker::operator()): Likewise.
	(thread::_Invoker::result_type): Remove.

Tested powerpc64le-linux, committed to trunk.

-------------- next part --------------
commit dfb18d127220b2a0f338d927253bbc5da4993f15
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Mon Oct 17 13:12:15 2016 +0100

    PR77998 Remove std::thread::_Invoker::result_type
    
    	PR libstdc++/77998
    	* include/std/future (__future_base::_Deferred_state)
    	(__future_base::_Async_state_impl): Use decltype to deduce return
    	type, instead of _Invoker::result_type.
    	* include/std/thread (thread::_Invoker::operator()): Likewise.
    	(thread::_Invoker::result_type): Remove.

diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future
index 31a21f9..5542d49 100644
--- a/libstdc++-v3/include/std/future
+++ b/libstdc++-v3/include/std/future
@@ -561,10 +561,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     class _Async_state_commonV2;
 #endif
 
-    template<typename _BoundFn, typename = typename _BoundFn::result_type>
+    template<typename _BoundFn,
+	     typename _Res = decltype(std::declval<_BoundFn&>()())>
       class _Deferred_state;
 
-    template<typename _BoundFn, typename = typename _BoundFn::result_type>
+    template<typename _BoundFn,
+	     typename _Res = decltype(std::declval<_BoundFn&>()())>
       class _Async_state_impl;
 
     template<typename _Signature>
diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread
index 7a3c407..576e577 100644
--- a/libstdc++-v3/include/std/thread
+++ b/libstdc++-v3/include/std/thread
@@ -235,14 +235,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	using _Indices
 	  = typename _Build_index_tuple<tuple_size<_Tuple>::value>::__type;
 
-	using result_type
-	  = decltype(std::declval<_Invoker>()._M_invoke(_Indices()));
-
-	result_type
+	auto
 	operator()()
-	noexcept(noexcept(std::declval<_Invoker>()._M_invoke(_Indices())))
+	noexcept(noexcept(std::declval<_Invoker&>()._M_invoke(_Indices())))
+	-> decltype(std::declval<_Invoker&>()._M_invoke(_Indices()))
 	{ return _M_invoke(_Indices()); }
-
       };
 
     // Alias for _Invoker<tuple<DECAY_COPY(_Tp)...>>


More information about the Libstdc++ mailing list