From 5bfcfe3087eb05b76395c9efbfc1abbf3f9e1a03 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 9 Jun 2021 10:11:00 +0100 Subject: [PATCH] libstdc++: Add warnings for some C++23 deprecations LWG 3036 deprecates std::pmr::polymorphic_allocator::destroy in favour of the equivalent member of std::allocator_traits. LWG 3170 deprecates std::allocator::is_always_equal in favour of the equivalent member of std::allocator_traits. This also updates a comment to note that we support the LWG 3541 change (even before the issue was opened). Signed-off-by: Jonathan Wakely libstdc++-v3/ChangeLog: * include/bits/allocator.h (allocator::is_always_equal): Deprecate. * include/bits/iterator_concepts.h (indirectly_readable_traits): Add LWG issue number to comment. * include/std/memory_resource (polymorphic_allocator::release): Deprecate. * testsuite/20_util/allocator/requirements/typedefs.cc: Add dg-warning for deprecation. Also check std::allocator. --- libstdc++-v3/include/bits/allocator.h | 12 ++++++---- libstdc++-v3/include/bits/iterator_concepts.h | 4 ++-- libstdc++-v3/include/std/memory_resource | 1 + .../20_util/allocator/requirements/typedefs.cc | 26 ++++++++++++++++++++-- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h index 73d5d7a..396872f 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 f4e94a6..8723f35 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 d330da9..df4e806 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 ca4714d..4f1f46a 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 -- 2.7.4