From: Marshall Clow Date: Mon, 27 Nov 2017 20:47:54 +0000 (+0000) Subject: Revert commit removing allocator support from packaged_task. Will investigate further X-Git-Tag: llvmorg-6.0.0-rc1~2590 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a2f3c63282330be0226158cdfdc27c4c2aef9cdc;p=platform%2Fupstream%2Fllvm.git Revert commit removing allocator support from packaged_task. Will investigate further llvm-svn: 319091 --- diff --git a/libcxx/include/future b/libcxx/include/future index 1bc4799..a7c28a4 100644 --- a/libcxx/include/future +++ b/libcxx/include/future @@ -328,6 +328,8 @@ public: packaged_task() noexcept; template explicit packaged_task(F&& f); + template + packaged_task(allocator_arg_t, const Allocator& a, F&& f); ~packaged_task(); // no copy @@ -354,6 +356,8 @@ public: template void swap(packaged_task&) noexcept; +template struct uses_allocator, Alloc>; + } // std */ @@ -2024,6 +2028,19 @@ public: > _LIBCPP_INLINE_VISIBILITY explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {} + template ::type, + packaged_task + >::value + >::type + > + _LIBCPP_INLINE_VISIBILITY + packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f) + : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)), + __p_(allocator_arg, __a) {} // ~packaged_task() = default; // no copy @@ -2140,6 +2157,19 @@ public: > _LIBCPP_INLINE_VISIBILITY explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {} + template ::type, + packaged_task + >::value + >::type + > + _LIBCPP_INLINE_VISIBILITY + packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f) + : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)), + __p_(allocator_arg, __a) {} // ~packaged_task() = default; // no copy @@ -2241,6 +2271,10 @@ swap(packaged_task<_Callable>& __x, packaged_task<_Callable>& __y) _NOEXCEPT __x.swap(__y); } +template +struct _LIBCPP_TEMPLATE_VIS uses_allocator, _Alloc> + : public true_type {}; + template future<_Rp> #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES diff --git a/libcxx/test/std/thread/futures/futures.task/futures.task.members/ctor2.fail.cpp b/libcxx/test/std/thread/futures/futures.task/futures.task.members/ctor2.fail.cpp new file mode 100644 index 0000000..212a120 --- /dev/null +++ b/libcxx/test/std/thread/futures/futures.task/futures.task.members/ctor2.fail.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: libcpp-has-no-threads +// UNSUPPORTED: c++98, c++03 + +// + +// class packaged_task +// template +// packaged_task(allocator_arg_t, const Allocator& a, F&& f); +// These constructors shall not participate in overload resolution if +// decay::type is the same type as std::packaged_task. + +#include +#include + +#include "test_allocator.h" + +struct A {}; +typedef std::packaged_task PT; +typedef volatile std::packaged_task VPT; + +int main() +{ + PT p { std::allocator_arg_t{}, test_allocator{}, VPT {}}; // expected-error {{no matching constructor for initialization of 'PT' (aka 'packaged_task')}} + // expected-note-re@future:* 1 {{candidate template ignored: {{(disabled by 'enable_if')|(requirement '.*' was not satisfied)}}}} +} diff --git a/libcxx/test/std/thread/futures/futures.task/futures.task.members/ctor_func_alloc.pass.cpp b/libcxx/test/std/thread/futures/futures.task/futures.task.members/ctor_func_alloc.pass.cpp index 1feda97..14b2971 100644 --- a/libcxx/test/std/thread/futures/futures.task/futures.task.members/ctor_func_alloc.pass.cpp +++ b/libcxx/test/std/thread/futures/futures.task/futures.task.members/ctor_func_alloc.pass.cpp @@ -16,6 +16,9 @@ // class packaged_task +// template +// explicit packaged_task(allocator_arg_t, const Allocator& a, F&& f); + #include #include