aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/std/future
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-06-15 01:19:07 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-06-15 01:19:07 +0100
commitcb4f9a8c05fd36d78faaddb4635b4bfb80bba457 (patch)
tree5d50c2c7af59c9318d5d85923118f76535e23f50 /libstdc++-v3/include/std/future
parent024e96b90bd2bc4f88aaeb62295d6c919a5cd804 (diff)
downloadgcc-cb4f9a8c05fd36d78faaddb4635b4bfb80bba457.zip
gcc-cb4f9a8c05fd36d78faaddb4635b4bfb80bba457.tar.gz
gcc-cb4f9a8c05fd36d78faaddb4635b4bfb80bba457.tar.bz2
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. From-SVN: r261618
Diffstat (limited to 'libstdc++-v3/include/std/future')
-rw-r--r--libstdc++-v3/include/std/future23
1 files changed, 9 insertions, 14 deletions
diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future
index c17a253..937c05e 100644
--- a/libstdc++-v3/include/std/future
+++ b/libstdc++-v3/include/std/future
@@ -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()