diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h index 73d5d7a25be..396872ffae5 100644 --- a/libstdc++-v3/include/bits/allocator.h +++ b/libstdc++-v3/include/bits/allocator.h @@ -89,9 +89,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if __cplusplus >= 201103L // _GLIBCXX_RESOLVE_LIB_DEFECTS // 2103. std::allocator propagate_on_container_move_assignment - typedef true_type propagate_on_container_move_assignment; + using propagate_on_container_move_assignment = true_type; - typedef true_type is_always_equal; + using is_always_equal + _GLIBCXX20_DEPRECATED_SUGGEST("allocator_traits::is_always_equal") + = true_type; #if __cplusplus >= 202002L allocator() = default; @@ -157,9 +159,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if __cplusplus >= 201103L // _GLIBCXX_RESOLVE_LIB_DEFECTS // 2103. std::allocator propagate_on_container_move_assignment - typedef true_type propagate_on_container_move_assignment; + using propagate_on_container_move_assignment = true_type; - typedef true_type is_always_equal; + using is_always_equal + _GLIBCXX20_DEPRECATED_SUGGEST("allocator_traits::is_always_equal") + = true_type; #endif // _GLIBCXX_RESOLVE_LIB_DEFECTS diff --git a/libstdc++-v3/include/bits/iterator_concepts.h b/libstdc++-v3/include/bits/iterator_concepts.h index f4e94a6263b..8723f35c5cb 100644 --- a/libstdc++-v3/include/bits/iterator_concepts.h +++ b/libstdc++-v3/include/bits/iterator_concepts.h @@ -264,8 +264,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : __detail::__cond_value_type { }; - // LWG 3446 doesn't add this, but it's needed for the case where - // value_type and element_type are both present, but not the same type. + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 3541. indirectly_readable_traits should be SFINAE-friendly for all types template<__detail::__has_member_value_type _Tp> requires __detail::__has_member_element_type<_Tp> struct indirectly_readable_traits<_Tp> diff --git a/libstdc++-v3/include/std/memory_resource b/libstdc++-v3/include/std/memory_resource index d330da9de5b..df4e806f814 100644 --- a/libstdc++-v3/include/std/memory_resource +++ b/libstdc++-v3/include/std/memory_resource @@ -322,6 +322,7 @@ namespace pmr #endif template + _GLIBCXX20_DEPRECATED_SUGGEST("allocator_traits::destroy") __attribute__((__nonnull__)) void destroy(_Up* __p) diff --git a/libstdc++-v3/testsuite/20_util/allocator/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/allocator/requirements/typedefs.cc index ca4714d108f..4f1f46a3465 100644 --- a/libstdc++-v3/testsuite/20_util/allocator/requirements/typedefs.cc +++ b/libstdc++-v3/testsuite/20_util/allocator/requirements/typedefs.cc @@ -53,5 +53,27 @@ static_assert( is_same::propagate_on_container_move_assignment, std::true_type>::value, "propagate_on_container_move_assignment" ); -static_assert( is_same::is_always_equal, std::true_type>::value, - "is_always_equal" ); +using IAE = allocator::is_always_equal; // { dg-warning "deprecated" "" { target c++20 } } +static_assert( is_same::value, "is_always_equal" ); + + +// Test required typedefs for allocator specialization. +static_assert( is_same::value_type, void>::value, + "void value_type" ); +#if __cplusplus <= 201703L +static_assert( is_same::pointer, void*>::value, + "void pointer" ); +static_assert( is_same::const_pointer, const void*>::value, + "void const_pointer" ); +static_assert( is_same::rebind::other, + allocator>::value, + "void rebind::other" ); +#else +// Since C++20 allocator uses the primary template, so has the same types. +static_assert( is_same::propagate_on_container_move_assignment, + std::true_type>::value, + "propagate_on_container_move_assignment" ); + +using VIAE = allocator::is_always_equal; // { dg-warning "deprecated" "" { target c++20 } } +static_assert( is_same::value, "is_always_equal" ); +#endif