[libcxx] r241967 - [libcxx] LWG2420 bits for bind<void> - Patch from K-Ballo
Eric Fiselier
eric at efcs.ca
Fri Jul 10 16:29:19 PDT 2015
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()));
}
More information about the cfe-commits
mailing list