diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2014-04-07 13:32:26 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2014-04-07 13:32:26 +0000 |
commit | 886c6a645f451ddb56df609c2bb6fe7388045f3e (patch) | |
tree | d6377bd7e73b6f6ec5196121218b2f9fb7bc5314 | |
parent | edc8cbf9a5c929789e88e34fa532204aa235c278 (diff) | |
download | bcm5719-llvm-886c6a645f451ddb56df609c2bb6fe7388045f3e.tar.gz bcm5719-llvm-886c6a645f451ddb56df609c2bb6fe7388045f3e.zip |
Fix PR19819
llvm-svn: 205709
3 files changed, 45 insertions, 3 deletions
diff --git a/libcxx/include/future b/libcxx/include/future index 73d5456d717..de00f25d7fb 100644 --- a/libcxx/include/future +++ b/libcxx/include/future @@ -1872,7 +1872,7 @@ template <class _Fp> __packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f) : __f_(nullptr) { - typedef typename remove_reference<_Fp>::type _FR; + typedef typename remove_reference<typename decay<_Fp>::type>::type _FR; typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF; if (sizeof(_FF) <= sizeof(__buf_)) { @@ -1897,7 +1897,7 @@ __packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function( : __f_(nullptr) { typedef allocator_traits<_Alloc> __alloc_traits; - typedef typename remove_reference<_Fp>::type _FR; + typedef typename remove_reference<typename decay<_Fp>::type>::type _FR; typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF; if (sizeof(_FF) <= sizeof(__buf_)) { diff --git a/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp b/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp index 7009f306d2a..58e9982fcf9 100644 --- a/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp +++ b/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp @@ -35,6 +35,8 @@ public: int A::n_moves = 0; int A::n_copies = 0; +int func(int i) { return i; } + int main() { { @@ -58,4 +60,18 @@ int main() assert(A::n_copies > 0); assert(A::n_moves > 0); } + { + std::packaged_task<int(int)> p(&func); + assert(p.valid()); + std::future<int> f = p.get_future(); + p(4); + assert(f.get() == 4); + } + { + std::packaged_task<int(int)> p(func); + assert(p.valid()); + std::future<int> f = p.get_future(); + p(4); + assert(f.get() == 4); + } } diff --git a/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp b/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp index 2e0cf5d723e..e7070c58313 100644 --- a/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp +++ b/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp @@ -37,6 +37,8 @@ public: int A::n_moves = 0; int A::n_copies = 0; +int func(int i) { return i; } + int main() { { @@ -52,7 +54,7 @@ int main() } assert(test_alloc_base::count == 0); A::n_copies = 0; - A::n_copies = 0; + A::n_moves = 0; { A a(5); std::packaged_task<double(int, char)> p(std::allocator_arg, @@ -66,4 +68,28 @@ int main() assert(A::n_moves > 0); } assert(test_alloc_base::count == 0); + A::n_copies = 0; + A::n_moves = 0; + { + A a(5); + std::packaged_task<int(int)> p(std::allocator_arg, test_allocator<A>(), &func); + assert(test_alloc_base::count > 0); + assert(p.valid()); + std::future<int> f = p.get_future(); + p(4); + assert(f.get() == 4); + } + assert(test_alloc_base::count == 0); + A::n_copies = 0; + A::n_moves = 0; + { + A a(5); + std::packaged_task<int(int)> p(std::allocator_arg, test_allocator<A>(), func); + assert(test_alloc_base::count > 0); + assert(p.valid()); + std::future<int> f = p.get_future(); + p(4); + assert(f.get() == 4); + } + assert(test_alloc_base::count == 0); } |