diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2019-02-26 20:34:46 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-02-26 20:34:46 +0000 |
commit | 3d7beb79e0631c7ca8532c497295af03822eeed2 (patch) | |
tree | b44c104dc45d5d8606e71fcdbc5353bf8c96e680 | |
parent | ec2d749a10606629e257ff6e7a7435289c9068d8 (diff) | |
download | gcc-3d7beb79e0631c7ca8532c497295af03822eeed2.zip gcc-3d7beb79e0631c7ca8532c497295af03822eeed2.tar.gz gcc-3d7beb79e0631c7ca8532c497295af03822eeed2.tar.bz2 |
PR libstdc++/89416 fix alloc insertable trait for clang (again)
PR libstdc++/89416
* include/bits/alloc_traits.h (__is_alloc_insertable_impl): Change
to class template and partial specialization using void_t.
(__is_copy_insertable, __is_move_insertable): Adjust base class.
From-SVN: r269229
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/alloc_traits.h | 44 |
2 files changed, 28 insertions, 23 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1ace579..d6ae322 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2019-02-26 Jonathan Wakely <jwakely@redhat.com> + + PR libstdc++/89416 + * include/bits/alloc_traits.h (__is_alloc_insertable_impl): Change + to class template and partial specialization using void_t. + (__is_copy_insertable, __is_move_insertable): Adjust base class. + 2019-02-24 Jonathan Wakely <jwakely@redhat.com> PR libstdc++/89416 diff --git a/libstdc++-v3/include/bits/alloc_traits.h b/libstdc++-v3/include/bits/alloc_traits.h index 9a3d816..b8689da 100644 --- a/libstdc++-v3/include/bits/alloc_traits.h +++ b/libstdc++-v3/include/bits/alloc_traits.h @@ -576,32 +576,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __do_alloc_on_swap(__one, __two, __pocs()); } - class __is_alloc_insertable_impl - { - template<typename _Alloc, typename _Up, - typename _Tp = __remove_cvref_t<_Up>, - typename = decltype(allocator_traits<_Alloc>::construct( - std::declval<_Alloc&>(), std::declval<_Tp*>(), - std::declval<_Up>()))> - static true_type - _M_select(int); - - template<typename, typename> - static false_type - _M_select(...); - - public: - template<typename _Alloc, typename _Tp = typename _Alloc::value_type> - using copy = decltype(_M_select<_Alloc, const _Tp&>(0)); - - template<typename _Alloc, typename _Tp = typename _Alloc::value_type> - using move = decltype(_M_select<_Alloc, _Tp>(0)); - }; + template<typename _Alloc, typename _Tp, + typename _ValueT = __remove_cvref_t<typename _Alloc::value_type>, + typename = void> + struct __is_alloc_insertable_impl + : false_type + { }; + + template<typename _Alloc, typename _Tp, typename _ValueT> + struct __is_alloc_insertable_impl<_Alloc, _Tp, _ValueT, + __void_t<decltype(allocator_traits<_Alloc>::construct( + std::declval<_Alloc&>(), std::declval<_ValueT*>(), + std::declval<_Tp>()))>> + : true_type + { }; // true if _Alloc::value_type is CopyInsertable into containers using _Alloc + // (might be wrong if _Alloc::construct exists but is not constrained, + // i.e. actually trying to use it would still be invalid. Use with caution.) template<typename _Alloc> struct __is_copy_insertable - : __is_alloc_insertable_impl::template copy<_Alloc> + : __is_alloc_insertable_impl<_Alloc, + typename _Alloc::value_type const&>::type { }; // std::allocator<_Tp> just requires CopyConstructible @@ -611,9 +607,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { }; // true if _Alloc::value_type is MoveInsertable into containers using _Alloc + // (might be wrong if _Alloc::construct exists but is not constrained, + // i.e. actually trying to use it would still be invalid. Use with caution.) template<typename _Alloc> struct __is_move_insertable - : __is_alloc_insertable_impl::template move<_Alloc> + : __is_alloc_insertable_impl<_Alloc, typename _Alloc::value_type>::type { }; // std::allocator<_Tp> just requires MoveConstructible |