K-ballo added reviewers: mclow.lists, EricWF.
K-ballo added a subscriber: cfe-commits.

Implemented LWG2420 bits for `bind<void>`

http://reviews.llvm.org/D10997

Files:
  include/__functional_03
  include/functional
  
test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp

Index: test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp
===================================================================
--- test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp
+++ test/std/utilities/function.objects/bind/func.bind/func.bind.bind/invoke_void_0.pass.cpp
@@ -39,21 +39,34 @@
 
 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()));
 }
Index: include/functional
===================================================================
--- include/functional
+++ include/functional
@@ -2186,25 +2186,27 @@
         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>
         _LIBCPP_INLINE_VISIBILITY
         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)...);
         }
 };
 
Index: include/__functional_03
===================================================================
--- include/__functional_03
+++ include/__functional_03
@@ -2091,14 +2091,16 @@
         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)...);
         }
 };
 
_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to