LWG 3039 Unnecessary decay in thread and packaged_task
authorJonathan Wakely <jwakely@redhat.com>
Fri, 15 Jun 2018 00:19:07 +0000 (01:19 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 15 Jun 2018 00:19:07 +0000 (01:19 +0100)
* include/std/future (__constrain_pkgdtask): Replace with ...
(packaged_task::__not_same): New alias template, using
__remove_cvref_t instead of decay.
* include/std/thread (thread::__not_same): Add comment.

From-SVN: r261618

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/future
libstdc++-v3/include/std/thread

index e368044232f613de6ecf0d2200d38dba43d139e9..aafffa58c5c4f58b186e559b2b523d5a84a82bca 100644 (file)
@@ -1,3 +1,11 @@
+2018-06-15  Jonathan Wakely  <jwakely@redhat.com>
+
+       LWG 3039 Unnecessary decay in thread and packaged_task
+       * include/std/future (__constrain_pkgdtask): Replace with ...
+       (packaged_task::__not_same): New alias template, using
+       __remove_cvref_t instead of decay.
+       * include/std/thread (thread::__not_same): Add comment.
+
 2018-06-14  Jonathan Wakely  <jwakely@redhat.com>
 
        LWG 3075 basic_string needs deduction guides from basic_string_view
index c17a253d26ec7455d4089f1644238f3fbb8381ba..937c05ef2b24fc0c45174ceca65c42996de6dfb5 100644 (file)
@@ -1462,15 +1462,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                                 static_cast<_Alloc&>(_M_impl));
     }
 
-  template<typename _Task, typename _Fn, bool
-          = is_same<_Task, typename decay<_Fn>::type>::value>
-    struct __constrain_pkgdtask
-    { typedef void __type; };
-
-  template<typename _Task, typename _Fn>
-    struct __constrain_pkgdtask<_Task, _Fn, true>
-    { };
-
   /// packaged_task
   template<typename _Res, typename... _ArgTypes>
     class packaged_task<_Res(_ArgTypes...)>
@@ -1478,6 +1469,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef __future_base::_Task_state_base<_Res(_ArgTypes...)> _State_type;
       shared_ptr<_State_type>                   _M_state;
 
+      // _GLIBCXX_RESOLVE_LIB_DEFECTS
+      // 3039. Unnecessary decay in thread and packaged_task
+      template<typename _Fn, typename _Fn2 = __remove_cvref_t<_Fn>>
+       using __not_same
+         = typename enable_if<!is_same<packaged_task, _Fn2>::value>::type;
+
     public:
       // Construction and destruction
       packaged_task() noexcept { }
@@ -1488,8 +1485,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        packaged_task(allocator_arg_t, const _Allocator& __a) noexcept
        { }
 
-      template<typename _Fn, typename = typename
-              __constrain_pkgdtask<packaged_task, _Fn>::__type>
+      template<typename _Fn, typename = __not_same<_Fn>>
        explicit
        packaged_task(_Fn&& __fn)
        : packaged_task(allocator_arg, std::allocator<int>(),
@@ -1499,11 +1495,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 2097.  packaged_task constructors should be constrained
       // 2407. [this constructor should not be] explicit
-      template<typename _Fn, typename _Alloc, typename = typename
-              __constrain_pkgdtask<packaged_task, _Fn>::__type>
+      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))
+                  std::forward<_Fn>(__fn), __a))
        { }
 
       ~packaged_task()
index 61861b585206fab18b21beedcf70f0c843d2cf42..13acd6a3091a58d9dbdcbb4200b60df940c6d0d0 100644 (file)
@@ -104,6 +104,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     // _GLIBCXX_RESOLVE_LIB_DEFECTS
     // 2097.  packaged_task constructors should be constrained
+    // 3039. Unnecessary decay in thread and packaged_task
     template<typename _Tp>
       using __not_same = __not_<is_same<__remove_cvref_t<_Tp>, thread>>;