LWG 2921 remove packaged_task constructors taking allocators
authorJonathan Wakely <jwakely@redhat.com>
Thu, 23 May 2019 21:40:56 +0000 (22:40 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 23 May 2019 21:40:56 +0000 (22:40 +0100)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/doc/xml/manual/evolution.xml
libstdc++-v3/doc/xml/manual/intro.xml
libstdc++-v3/include/std/future
libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc.cc
libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc2.cc
libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc_min.cc
libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc

index 17a0463c2c345e42ca49d7078dfef36be3d96f33..e230f24ca13ada22843788a578365db4927b8804 100644 (file)
@@ -1,3 +1,19 @@
+2019-05-23  Jonathan Wakely  <jwakely@redhat.com>
+
+       * 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.
+
 2019-05-23  Hans-Peter Nilsson  <hp@axis.com>
 
        * testsuite/26_numerics/random/poisson_distribution/operators/values.cc:
index 010907a2f6b0401b969d59e1f2ebdf7b23bb6576..1bd7bb1bb9f1e2b8e08ac644c4c28db2349fe7ad 100644 (file)
@@ -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>
index 35a2016f5c3c6ec322909d4a1b136b8b0f510e8d..a2162562b549dbe117da7980694e44800b32d247 100644 (file)
@@ -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>
index 967110050b8aa5a438ad602a1401c98f7c587300..6c276694df3051f3b22c09fa3921ce25a9719842 100644 (file)
@@ -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.
index b806c0b8636da94f529733e40f10f9c2b43aebe0..815ae0d25be6d771e50ffd75011bf0ec246cff58 100644 (file)
@@ -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 "" }
 
index 4159d0088d957137535bbf7026d6dfe345f81092..06b60e546b2e611e325c1f0715b32dd943d6148b 100644 (file)
@@ -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.
index 3ab1d1bd54304a6dde728a81d83fd97ad29c3391..5ca0ba9ddb7c6a404c239045bc4b02691a564d6c 100644 (file)
@@ -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.
index d251f89d5f43ad12e592d012fa5cefc5dd19627e..5b1f244c960f1fe775d9e22dc5f21372ce3ac33a 100644 (file)
@@ -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.