Fix PR19819
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@205709 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1872,7 +1872,7 @@ template <class _Fp>
|
|||||||
__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f)
|
__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f)
|
||||||
: __f_(nullptr)
|
: __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;
|
typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
{
|
{
|
||||||
@@ -1897,7 +1897,7 @@ __packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(
|
|||||||
: __f_(nullptr)
|
: __f_(nullptr)
|
||||||
{
|
{
|
||||||
typedef allocator_traits<_Alloc> __alloc_traits;
|
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;
|
typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
{
|
{
|
||||||
|
@@ -35,6 +35,8 @@ public:
|
|||||||
int A::n_moves = 0;
|
int A::n_moves = 0;
|
||||||
int A::n_copies = 0;
|
int A::n_copies = 0;
|
||||||
|
|
||||||
|
int func(int i) { return i; }
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -58,4 +60,18 @@ int main()
|
|||||||
assert(A::n_copies > 0);
|
assert(A::n_copies > 0);
|
||||||
assert(A::n_moves > 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -37,6 +37,8 @@ public:
|
|||||||
int A::n_moves = 0;
|
int A::n_moves = 0;
|
||||||
int A::n_copies = 0;
|
int A::n_copies = 0;
|
||||||
|
|
||||||
|
int func(int i) { return i; }
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -52,7 +54,7 @@ int main()
|
|||||||
}
|
}
|
||||||
assert(test_alloc_base::count == 0);
|
assert(test_alloc_base::count == 0);
|
||||||
A::n_copies = 0;
|
A::n_copies = 0;
|
||||||
A::n_copies = 0;
|
A::n_moves = 0;
|
||||||
{
|
{
|
||||||
A a(5);
|
A a(5);
|
||||||
std::packaged_task<double(int, char)> p(std::allocator_arg,
|
std::packaged_task<double(int, char)> p(std::allocator_arg,
|
||||||
@@ -66,4 +68,28 @@ int main()
|
|||||||
assert(A::n_moves > 0);
|
assert(A::n_moves > 0);
|
||||||
}
|
}
|
||||||
assert(test_alloc_base::count == 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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user