diff options
author | Eric Fiselier <eric@efcs.ca> | 2015-02-10 16:48:45 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2015-02-10 16:48:45 +0000 |
commit | 54519a6be9296fb115b949f1f0785d9cbfacc7c5 (patch) | |
tree | d99921a0bd8162f333fba7fe5ecd741c09e89805 /libcxx/include/__functional_03 | |
parent | 51544023a955929cbb3d105421b2e59f6be43964 (diff) | |
download | bcm5719-llvm-54519a6be9296fb115b949f1f0785d9cbfacc7c5.tar.gz bcm5719-llvm-54519a6be9296fb115b949f1f0785d9cbfacc7c5.zip |
[libcxx] Fix PR 22468 - std::function<void()> does not accept non-void-returning functions
Summary:
The bug can be found here: http://llvm.org/bugs/show_bug.cgi?id=22468
`__invoke_void_return_wrapper` is needed to properly handle calling a function that returns a value but where the std::function return type is void. Without this '-Wsystem-headers' will cause `function::operator()(...)` to not compile.
Reviewers: eugenis, K-ballo, mclow.lists
Reviewed By: mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D7444
llvm-svn: 228705
Diffstat (limited to 'libcxx/include/__functional_03')
-rw-r--r-- | libcxx/include/__functional_03 | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/libcxx/include/__functional_03 b/libcxx/include/__functional_03 index d8a9f05fa12..157d6bf8932 100644 --- a/libcxx/include/__functional_03 +++ b/libcxx/include/__functional_03 @@ -369,7 +369,8 @@ template<class _Fp, class _Alloc, class _Rp> _Rp __func<_Fp, _Alloc, _Rp()>::operator()() { - return __invoke(__f_.first()); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(__f_.first()); } #ifndef _LIBCPP_NO_RTTI @@ -452,7 +453,8 @@ template<class _Fp, class _Alloc, class _Rp, class _A0> _Rp __func<_Fp, _Alloc, _Rp(_A0)>::operator()(_A0 __a0) { - return __invoke(__f_.first(), __a0); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(__f_.first(), __a0); } #ifndef _LIBCPP_NO_RTTI @@ -535,7 +537,8 @@ template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> _Rp __func<_Fp, _Alloc, _Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) { - return __invoke(__f_.first(), __a0, __a1); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(__f_.first(), __a0, __a1); } #ifndef _LIBCPP_NO_RTTI @@ -618,7 +621,8 @@ template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> _Rp __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) { - return __invoke(__f_.first(), __a0, __a1, __a2); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(__f_.first(), __a0, __a1, __a2); } #ifndef _LIBCPP_NO_RTTI |