diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2019-05-23 22:40:56 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-05-23 22:40:56 +0100 |
commit | 9a0af7e3fb425ae2c0e044d044feb81ef493ce2c (patch) | |
tree | a3d1f6bdc1b3b0ce8e8352e0048a022a8bee7691 /libstdc++-v3/include/std | |
parent | aa992ce717568eb88b324d39429e52df04a42eb1 (diff) | |
download | gcc-9a0af7e3fb425ae2c0e044d044feb81ef493ce2c.zip gcc-9a0af7e3fb425ae2c0e044d044feb81ef493ce2c.tar.gz gcc-9a0af7e3fb425ae2c0e044d044feb81ef493ce2c.tar.bz2 |
LWG 2921 remove packaged_task constructors taking allocators
* doc/xml/manual/evolution.xml: Document LWG DR 2921 change.
* doc/xml/manual/intro.xml: Likewise.
* include/std/future (__create_task_state): Add default arguments
to make providing an allocator optional.
(packaged_task::packaged_task(F&&)): Call __create_task_state directly
instead of delegating to another constructor.
(packaged_task::packaged_task(allocator_arg_t, const A&, ...)): Do not
define allocator-extended constructors for C++17 and later.
* testsuite/30_threads/packaged_task/cons/alloc.cc: Only run test for
C++11 and C++14.
* testsuite/30_threads/packaged_task/cons/alloc2.cc: Likewise.
* testsuite/30_threads/packaged_task/cons/alloc_min.cc: Likewise.
* testsuite/30_threads/packaged_task/uses_allocator.cc: Likewise.
From-SVN: r271582
Diffstat (limited to 'libstdc++-v3/include/std')
-rw-r--r-- | libstdc++-v3/include/std/future | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index 9671100..6c27669 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -1447,9 +1447,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } _M_impl; }; - template<typename _Signature, typename _Fn, typename _Alloc> + template<typename _Signature, typename _Fn, + typename _Alloc = std::allocator<int>> static shared_ptr<__future_base::_Task_state_base<_Signature>> - __create_task_state(_Fn&& __fn, const _Alloc& __a) + __create_task_state(_Fn&& __fn, const _Alloc& __a = _Alloc()) { typedef typename decay<_Fn>::type _Fn2; typedef __future_base::_Task_state<_Fn2, _Alloc, _Signature> _State; @@ -1481,28 +1482,40 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Construction and destruction packaged_task() noexcept { } - // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 2095. missing constructors needed for uses-allocator construction - template<typename _Allocator> - packaged_task(allocator_arg_t, const _Allocator& __a) noexcept - { } - template<typename _Fn, typename = __not_same<_Fn>> explicit packaged_task(_Fn&& __fn) - : packaged_task(allocator_arg, std::allocator<int>(), - std::forward<_Fn>(__fn)) + : _M_state( + __create_task_state<_Res(_ArgTypes...)>(std::forward<_Fn>(__fn))) { } +#if __cplusplus < 201703L // _GLIBCXX_RESOLVE_LIB_DEFECTS - // 2097. packaged_task constructors should be constrained + // 2097. packaged_task constructors should be constrained // 2407. [this constructor should not be] explicit + // 2921. packaged_task and type-erased allocators template<typename _Fn, typename _Alloc, typename = __not_same<_Fn>> packaged_task(allocator_arg_t, const _Alloc& __a, _Fn&& __fn) : _M_state(__create_task_state<_Res(_ArgTypes...)>( std::forward<_Fn>(__fn), __a)) { } + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2095. missing constructors needed for uses-allocator construction + template<typename _Allocator> + packaged_task(allocator_arg_t, const _Allocator& __a) noexcept + { } + + template<typename _Allocator> + packaged_task(allocator_arg_t, const _Allocator&, + const packaged_task&) = delete; + + template<typename _Allocator> + packaged_task(allocator_arg_t, const _Allocator&, + packaged_task&& __other) noexcept + { this->swap(__other); } +#endif + ~packaged_task() { if (static_cast<bool>(_M_state) && !_M_state.unique()) @@ -1513,19 +1526,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION packaged_task(const packaged_task&) = delete; packaged_task& operator=(const packaged_task&) = delete; - template<typename _Allocator> - packaged_task(allocator_arg_t, const _Allocator&, - const packaged_task&) = delete; - // Move support packaged_task(packaged_task&& __other) noexcept { this->swap(__other); } - template<typename _Allocator> - packaged_task(allocator_arg_t, const _Allocator&, - packaged_task&& __other) noexcept - { this->swap(__other); } - packaged_task& operator=(packaged_task&& __other) noexcept { packaged_task(std::move(__other)).swap(*this); @@ -1577,10 +1581,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION packaged_task<_Res(_ArgTypes...)>& __y) noexcept { __x.swap(__y); } +#if __cplusplus < 201703L + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2976. Dangling uses_allocator specialization for packaged_task template<typename _Res, typename _Alloc> struct uses_allocator<packaged_task<_Res>, _Alloc> : public true_type { }; - +#endif // Shared state created by std::async(). // Holds a deferred function and storage for its result. |