Author: ericwf Date: Fri Jul 10 18:29:18 2015 New Revision: 241967 URL: http://llvm.org/viewvc/llvm-project?rev=241967&view=rev Log: [libcxx] LWG2420 bits for bind<void> - Patch from K-Ballo
Implemented LWG2420 bits for bind<void> Review: http://reviews.llvm.org/D10997 Modified: libcxx/trunk/include/__functional_03 libcxx/trunk/include/functional libcxx/trunk/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp Modified: libcxx/trunk/include/__functional_03 URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__functional_03?rev=241967&r1=241966&r2=241967&view=diff ============================================================================== --- libcxx/trunk/include/__functional_03 (original) +++ libcxx/trunk/include/__functional_03 Fri Jul 10 18:29:18 2015 @@ -2091,14 +2091,16 @@ public: result_type operator()(_Args&& ...__args) { - return base::operator()(_VSTD::forward<_Args>(__args)...); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...); } template <class ..._Args> result_type operator()(_Args&& ...__args) const { - return base::operator()(_VSTD::forward<_Args>(__args)...); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...); } }; Modified: libcxx/trunk/include/functional URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/functional?rev=241967&r1=241966&r2=241967&view=diff ============================================================================== --- libcxx/trunk/include/functional (original) +++ libcxx/trunk/include/functional Fri Jul 10 18:29:18 2015 @@ -2186,12 +2186,13 @@ public: typename enable_if < is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type, - result_type>::value, + result_type>::value || is_void<_Rp>::value, result_type >::type operator()(_Args&& ...__args) { - return base::operator()(_VSTD::forward<_Args>(__args)...); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast<base&>(*this), _VSTD::forward<_Args>(__args)...); } template <class ..._Args> @@ -2199,12 +2200,13 @@ public: typename enable_if < is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type, - result_type>::value, + result_type>::value || is_void<_Rp>::value, result_type >::type operator()(_Args&& ...__args) const { - return base::operator()(_VSTD::forward<_Args>(__args)...); + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast<base const&>(*this), _VSTD::forward<_Args>(__args)...); } }; Modified: libcxx/trunk/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp?rev=241967&r1=241966&r2=241967&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp Fri Jul 10 18:29:18 2015 @@ -39,21 +39,34 @@ test_const(const F& f) void f() {++count;} -struct A_int_0 +int g() {++count; return 0;} + +struct A_void_0 { void operator()() {++count;} void operator()() const {count += 2;} }; +struct A_int_0 +{ + int operator()() {++count; return 4;} + int operator()() const {count += 2; return 5;} +}; + int main() { test(std::bind(f)); test(std::bind(&f)); - test(std::bind(A_int_0())); - test_const(std::bind(A_int_0())); + test(std::bind(A_void_0())); + test_const(std::bind(A_void_0())); test(std::bind<void>(f)); test(std::bind<void>(&f)); + test(std::bind<void>(A_void_0())); + test_const(std::bind<void>(A_void_0())); + + test(std::bind<void>(g)); + test(std::bind<void>(&g)); test(std::bind<void>(A_int_0())); test_const(std::bind<void>(A_int_0())); } _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits