aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-02-26 20:34:46 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2019-02-26 20:34:46 +0000
commit3d7beb79e0631c7ca8532c497295af03822eeed2 (patch)
treeb44c104dc45d5d8606e71fcdbc5353bf8c96e680
parentec2d749a10606629e257ff6e7a7435289c9068d8 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/alloc_traits.h44
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