diff options
| author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-04-19 13:26:08 +0000 |
|---|---|---|
| committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-04-19 13:26:08 +0000 |
| commit | 409e2405e2f298311e26857cfe610a0865d5d763 (patch) | |
| tree | 46bddda6e0625793f71e6f9abbe316c4f086c355 /libstdc++-v3/include/std/future | |
| parent | e400b89a267e84f9753ba212b8ec2ce36a5328de (diff) | |
| download | ppe42-gcc-409e2405e2f298311e26857cfe610a0865d5d763.tar.gz ppe42-gcc-409e2405e2f298311e26857cfe610a0865d5d763.zip | |
2011-04-19 Jonathan Wakely <jwakely.gcc@gmail.com>
PR libstdc++/48521
* include/std/type_traits (result_of): Handle pointer to member.
* include/std/functional (__invoke): Likewise.
(_Function_to_function_pointer): Remove.
(_Reference_wrapper_base): Provide nested types independent of
unary_function and binary_function.
(reference_wrapper::operator()): DR 2017.
(ref(const A&&), cref(const A&&): Define as deleted.
* include/std/future (async): Simplify SFINAE and use result_of to
support pointer to member.
* testsuite/20_util/reference_wrapper/invoke.cc: Test pointer to
member.
* testsuite/20_util/reference_wrapper/24803.cc: Likewise.
* testsuite/20_util/reference_wrapper/typedefs.cc: Test for types
instead of derivation from unary_function and binary_function.
* testsuite/20_util/declval/requirements/1_neg.cc: Adjust.
* testsuite/20_util/reference_wrapper/invoke-2.cc: New.
* testsuite/20_util/reference_wrapper/ref_neg.c: New.
* testsuite/20_util/reference_wrapper/typedefs-3.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@172709 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/std/future')
| -rw-r--r-- | libstdc++-v3/include/std/future | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index 7a62d5ecf28..f7035a9109a 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -142,11 +142,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION future<typename result_of<_Fn(_Args...)>::type> async(launch __policy, _Fn&& __fn, _Args&&... __args); + template<typename _FnCheck, typename _Fn, typename... _Args> + struct __async_sfinae_helper + { + typedef future<typename result_of<_Fn(_Args...)>::type> type; + }; + + template<typename _Fn, typename... _Args> + struct __async_sfinae_helper<launch, _Fn, _Args...> + { }; + template<typename _Fn, typename... _Args> typename - enable_if<!is_same<typename decay<_Fn>::type, launch>::value, - future<decltype(std::declval<_Fn>()(std::declval<_Args>()...))> - >::type + __async_sfinae_helper<typename decay<_Fn>::type, _Fn, _Args...>::type async(_Fn&& __fn, _Args&&... __args); #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) \ @@ -1373,9 +1381,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// async, potential overload template<typename _Fn, typename... _Args> inline typename - enable_if<!is_same<typename decay<_Fn>::type, launch>::value, - future<decltype(std::declval<_Fn>()(std::declval<_Args>()...))> - >::type + __async_sfinae_helper<typename decay<_Fn>::type, _Fn, _Args...>::type async(_Fn&& __fn, _Args&&... __args) { return async(launch::any, std::forward<_Fn>(__fn), |

