[PATCH] LWG 2921 remove packaged_task constructors taking allocators
Jonathan Wakely
jwakely@redhat.com
Thu May 23 21:39:00 GMT 2019
* 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.
Tested powerpc64le-linux, committed to trunk.
-------------- next part --------------
commit 6ee6d6fb851cb5f8ca80533fd37b8cbb882e6ad8
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Thu May 23 17:22:28 2019 +0100
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.
diff --git a/libstdc++-v3/doc/xml/manual/evolution.xml b/libstdc++-v3/doc/xml/manual/evolution.xml
index 010907a2f6b..1bd7bb1bb9f 100644
--- a/libstdc++-v3/doc/xml/manual/evolution.xml
+++ b/libstdc++-v3/doc/xml/manual/evolution.xml
@@ -955,6 +955,11 @@ now defaults to zero.
</itemizedlist>
</para>
+<para>
+ The <classname>std::packaged_task</classname> constructors taking
+ an allocator argument are only defined for C++11 and C++14.
+</para>
+
</section>
</section>
diff --git a/libstdc++-v3/doc/xml/manual/intro.xml b/libstdc++-v3/doc/xml/manual/intro.xml
index 35a2016f5c3..a2162562b54 100644
--- a/libstdc++-v3/doc/xml/manual/intro.xml
+++ b/libstdc++-v3/doc/xml/manual/intro.xml
@@ -1221,6 +1221,14 @@ requirements of the license of GCC.
<listitem><para>Use rvalues for deleters.
</para></listitem></varlistentry>
+ <varlistentry xml:id="manual.bugs.dr2921"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#2921">2921</link>:
+ <emphasis><code>packaged_task</code> and type-erased allocators
+ </emphasis>
+ </term>
+ <listitem><para>For C++17 mode, remove the constructors taking
+ an allocator argument.
+ </para></listitem></varlistentry>
+
<varlistentry xml:id="manual.bugs.dr2942"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#2942">2942</link>:
<emphasis>LWG 2873's resolution missed
<code>weak_ptr::owner_before</code>
diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future
index 967110050b8..6c276694df3 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,27 +1482,39 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Construction and destruction
packaged_task() noexcept { }
+ template<typename _Fn, typename = __not_same<_Fn>>
+ explicit
+ packaged_task(_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
+ // 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 _Fn, typename = __not_same<_Fn>>
- explicit
- packaged_task(_Fn&& __fn)
- : packaged_task(allocator_arg, std::allocator<int>(),
- std::forward<_Fn>(__fn))
- { }
+ template<typename _Allocator>
+ packaged_task(allocator_arg_t, const _Allocator&,
+ const packaged_task&) = delete;
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 2097. packaged_task constructors should be constrained
- // 2407. [this constructor should not be] explicit
- 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))
- { }
+ template<typename _Allocator>
+ packaged_task(allocator_arg_t, const _Allocator&,
+ packaged_task&& __other) noexcept
+ { this->swap(__other); }
+#endif
~packaged_task()
{
@@ -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.
diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc.cc
index b806c0b8636..815ae0d25be 100644
--- a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc.cc
+++ b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc.cc
@@ -1,6 +1,5 @@
-// { dg-do run }
+// { dg-do run { target { c++11_only || c++14_only } } }
// { dg-options "-pthread" }
-// { dg-require-effective-target c++11 }
// { dg-require-effective-target pthread }
// { dg-require-gthreads "" }
diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc2.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc2.cc
index 4159d0088d9..06b60e546b2 100644
--- a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc2.cc
+++ b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc2.cc
@@ -1,4 +1,4 @@
-// { dg-do compile { target c++11 } }
+// { dg-do compile { target { c++11_only || c++14_only } } }
// { dg-require-gthreads "" }
// Copyright (C) 2011-2019 Free Software Foundation, Inc.
diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc_min.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc_min.cc
index 3ab1d1bd543..5ca0ba9ddb7 100644
--- a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc_min.cc
+++ b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc_min.cc
@@ -1,4 +1,4 @@
-// { dg-do compile { target c++11 } }
+// { dg-do compile { target { c++11_only || c++14_only } } }
// { dg-require-gthreads "" }
// Copyright (C) 2011-2019 Free Software Foundation, Inc.
diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc
index d251f89d5f4..5b1f244c960 100644
--- a/libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc
+++ b/libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc
@@ -1,4 +1,4 @@
-// { dg-do compile { target c++11 } }
+// { dg-do compile { target { c++11_only || c++14_only } } }
// { dg-require-gthreads "" }
// Copyright (C) 2011-2019 Free Software Foundation, Inc.
More information about the Libstdc++
mailing list