summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2014-04-07 13:32:26 +0000
committerMarshall Clow <mclow.lists@gmail.com>2014-04-07 13:32:26 +0000
commit886c6a645f451ddb56df609c2bb6fe7388045f3e (patch)
treed6377bd7e73b6f6ec5196121218b2f9fb7bc5314
parentedc8cbf9a5c929789e88e34fa532204aa235c278 (diff)
downloadbcm5719-llvm-886c6a645f451ddb56df609c2bb6fe7388045f3e.tar.gz
bcm5719-llvm-886c6a645f451ddb56df609c2bb6fe7388045f3e.zip
Fix PR19819
llvm-svn: 205709
-rw-r--r--libcxx/include/future4
-rw-r--r--libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp16
-rw-r--r--libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp28
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);
}
OpenPOWER on IntegriCloud