From: Jonathan Wakely Date: Wed, 15 Apr 2020 18:47:48 +0000 (+0100) Subject: libstdc++: Add comparison operators to types from Utilities clause X-Git-Tag: basepoints/gcc-11~338 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=596676d66cab21e5ed85669e737af5b62f067d57;p=thirdparty%2Fgcc.git libstdc++: Add comparison operators to types from Utilities clause Some more C++20 changes from P1614R2, "The Mothership has Landed". This removes all redundant equality and inequality operators in the Utilities clause, as they can be synthesized from the remaining equality operators. It also removes the single redundant operator in the Localization clause, because it didn't seem worth doing in a separate commit. * include/bits/allocator.h (operator!=): Do not define for C++20. * include/bits/locale_classes.h (operator!=): Likewise. * include/bits/std_function.h (operator==(nullptr_t, const function&)) (operator!=(const function&, nullptr_t)) (operator!=(nullptr_t, const function&)): Likewise. * include/ext/bitmap_allocator.h (operator!=): Likewise. * include/ext/debug_allocator.h (operator!=): Likewise. * include/ext/extptr_allocator.h (operator!=): Likewise. * include/ext/malloc_allocator.h (operator!=): Likewise. * include/ext/mt_allocator.h (operator!=): Likewise. * include/ext/new_allocator.h (operator!=): Likewise. * include/ext/pool_allocator.h (operator!=): Likewise. * include/ext/throw_allocator.h (operator!=): Likewise. * include/std/bitset (bitset::operator!=): Likewise. * include/std/memory_resource (operator!=): Likewise. * include/std/scoped_allocator (operator!=): Likewise. --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 696a423e5c71..ac446acaaac2 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,22 @@ 2020-04-15 Jonathan Wakely + * include/bits/allocator.h (operator!=): Do not define for C++20. + * include/bits/locale_classes.h (operator!=): Likewise. + * include/bits/std_function.h (operator==(nullptr_t, const function&)) + (operator!=(const function&, nullptr_t)) + (operator!=(nullptr_t, const function&)): Likewise. + * include/ext/bitmap_allocator.h (operator!=): Likewise. + * include/ext/debug_allocator.h (operator!=): Likewise. + * include/ext/extptr_allocator.h (operator!=): Likewise. + * include/ext/malloc_allocator.h (operator!=): Likewise. + * include/ext/mt_allocator.h (operator!=): Likewise. + * include/ext/new_allocator.h (operator!=): Likewise. + * include/ext/pool_allocator.h (operator!=): Likewise. + * include/ext/throw_allocator.h (operator!=): Likewise. + * include/std/bitset (bitset::operator!=): Likewise. + * include/std/memory_resource (operator!=): Likewise. + * include/std/scoped_allocator (operator!=): Likewise. + * include/std/typeindex (operator<=>): Define for C++20. * testsuite/20_util/typeindex/comparison_operators_c++20.cc: New test. diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h index 3e0d608aa6ba..ee564791dfae 100644 --- a/libstdc++-v3/include/bits/allocator.h +++ b/libstdc++-v3/include/bits/allocator.h @@ -196,9 +196,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator==(const allocator&, const allocator&) _GLIBCXX_NOTHROW { return true; } +#if __cpp_impl_three_way_comparison < 201907L friend _GLIBCXX20_CONSTEXPR bool operator!=(const allocator&, const allocator&) _GLIBCXX_NOTHROW { return false; } +#endif // Inherit everything else. }; @@ -209,11 +211,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_NOTHROW { return true; } +#if __cpp_impl_three_way_comparison < 201907L template inline _GLIBCXX20_CONSTEXPR bool operator!=(const allocator<_T1>&, const allocator<_T2>&) _GLIBCXX_NOTHROW { return false; } +#endif // Invalid allocator partial specializations. // allocator_traits::rebind_alloc can be used to form a valid allocator type. diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h index 11bdddd3dcd5..ab90682cde23 100644 --- a/libstdc++-v3/include/bits/locale_classes.h +++ b/libstdc++-v3/include/bits/locale_classes.h @@ -254,6 +254,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool operator==(const locale& __other) const throw(); +#if __cpp_impl_three_way_comparison < 201907L /** * @brief Locale inequality. * @@ -263,6 +264,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool operator!=(const locale& __other) const throw() { return !(this->operator==(__other)); } +#endif /** * @brief Compare two strings according to collate. diff --git a/libstdc++-v3/include/bits/std_function.h b/libstdc++-v3/include/bits/std_function.h index 57375b5de0c5..e2bf9b91850b 100644 --- a/libstdc++-v3/include/bits/std_function.h +++ b/libstdc++-v3/include/bits/std_function.h @@ -680,6 +680,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator==(const function<_Res(_Args...)>& __f, nullptr_t) noexcept { return !static_cast(__f); } +#if __cpp_impl_three_way_comparison < 201907L /// @overload template inline bool @@ -703,7 +704,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline bool operator!=(nullptr_t, const function<_Res(_Args...)>& __f) noexcept { return static_cast(__f); } - +#endif // [20.7.15.2.7] specialized algorithms diff --git a/libstdc++-v3/include/ext/bitmap_allocator.h b/libstdc++-v3/include/ext/bitmap_allocator.h index 97b89e14c8ce..edddf32fb973 100644 --- a/libstdc++-v3/include/ext/bitmap_allocator.h +++ b/libstdc++-v3/include/ext/bitmap_allocator.h @@ -1098,11 +1098,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const bitmap_allocator<_Tp2>&) throw() { return true; } +#if __cpp_impl_three_way_comparison < 201907L template bool operator!=(const bitmap_allocator<_Tp1>&, const bitmap_allocator<_Tp2>&) throw() - { return false; } + { return false; } +#endif // Static member definitions. template diff --git a/libstdc++-v3/include/ext/debug_allocator.h b/libstdc++-v3/include/ext/debug_allocator.h index 879bb9cfc05d..9946faa10a6d 100644 --- a/libstdc++-v3/include/ext/debug_allocator.h +++ b/libstdc++-v3/include/ext/debug_allocator.h @@ -179,11 +179,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const debug_allocator<_Alloc2>& __rhs) _GLIBCXX_NOTHROW { return __lhs._M_allocator == debug_allocator(__rhs)._M_allocator; } +#if __cpp_impl_three_way_comparison < 201907L template friend bool operator!=(const debug_allocator& __lhs, const debug_allocator<_Alloc2>& __rhs) _GLIBCXX_NOTHROW { return !(__lhs == __rhs); } +#endif }; _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/include/ext/extptr_allocator.h b/libstdc++-v3/include/ext/extptr_allocator.h index 88090548b7cd..850ca286ef6c 100644 --- a/libstdc++-v3/include/ext/extptr_allocator.h +++ b/libstdc++-v3/include/ext/extptr_allocator.h @@ -138,6 +138,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator==(const _ExtPtr_allocator& __rarg) const { return _M_real_alloc == __rarg._M_real_alloc; } +#if __cpp_impl_three_way_comparison < 201907L template inline bool operator!=(const _ExtPtr_allocator<_Up>& __rarg) const @@ -146,6 +147,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline bool operator!=(const _ExtPtr_allocator& __rarg) const { return _M_real_alloc != __rarg._M_real_alloc; } +#endif template inline friend void diff --git a/libstdc++-v3/include/ext/malloc_allocator.h b/libstdc++-v3/include/ext/malloc_allocator.h index e0d59e5620fd..1f41660fac7e 100644 --- a/libstdc++-v3/include/ext/malloc_allocator.h +++ b/libstdc++-v3/include/ext/malloc_allocator.h @@ -174,11 +174,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_NOTHROW { return true; } +#if __cpp_impl_three_way_comparison < 201907L template friend _GLIBCXX20_CONSTEXPR bool operator!=(const malloc_allocator&, const malloc_allocator<_Up>&) _GLIBCXX_NOTHROW { return false; } +#endif private: _GLIBCXX_CONSTEXPR size_type diff --git a/libstdc++-v3/include/ext/mt_allocator.h b/libstdc++-v3/include/ext/mt_allocator.h index 49e0a8ff836e..0857390e6654 100644 --- a/libstdc++-v3/include/ext/mt_allocator.h +++ b/libstdc++-v3/include/ext/mt_allocator.h @@ -771,10 +771,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator==(const __mt_alloc<_Tp, _Poolp>&, const __mt_alloc<_Tp, _Poolp>&) { return true; } +#if __cpp_impl_three_way_comparison < 201907L template inline bool operator!=(const __mt_alloc<_Tp, _Poolp>&, const __mt_alloc<_Tp, _Poolp>&) { return false; } +#endif #undef __thread_default diff --git a/libstdc++-v3/include/ext/new_allocator.h b/libstdc++-v3/include/ext/new_allocator.h index 3639f3cbffea..959d68802768 100644 --- a/libstdc++-v3/include/ext/new_allocator.h +++ b/libstdc++-v3/include/ext/new_allocator.h @@ -173,11 +173,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_NOTHROW { return true; } +#if __cpp_impl_three_way_comparison < 201907L template friend _GLIBCXX20_CONSTEXPR bool operator!=(const new_allocator&, const new_allocator<_Up>&) _GLIBCXX_NOTHROW { return false; } +#endif private: _GLIBCXX_CONSTEXPR size_type diff --git a/libstdc++-v3/include/ext/pool_allocator.h b/libstdc++-v3/include/ext/pool_allocator.h index cb5bbc2cbb15..c247c403bec7 100644 --- a/libstdc++-v3/include/ext/pool_allocator.h +++ b/libstdc++-v3/include/ext/pool_allocator.h @@ -198,10 +198,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator==(const __pool_alloc<_Tp>&, const __pool_alloc<_Tp>&) { return true; } +#if __cpp_impl_three_way_comparison < 201907L template inline bool operator!=(const __pool_alloc<_Tp>&, const __pool_alloc<_Tp>&) { return false; } +#endif template _Atomic_word diff --git a/libstdc++-v3/include/ext/throw_allocator.h b/libstdc++-v3/include/ext/throw_allocator.h index 6b0b0a4a1501..f99b26b0cf12 100644 --- a/libstdc++-v3/include/ext/throw_allocator.h +++ b/libstdc++-v3/include/ext/throw_allocator.h @@ -895,11 +895,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const throw_allocator_base<_Tp, _Cond>&) { return true; } +#if __cpp_impl_three_way_comparison < 201907L template inline bool operator!=(const throw_allocator_base<_Tp, _Cond>&, const throw_allocator_base<_Tp, _Cond>&) { return false; } +#endif /// Allocator throwing via limit condition. template diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset index 93296b9e6238..5364e59f4663 100644 --- a/libstdc++-v3/include/std/bitset +++ b/libstdc++-v3/include/std/bitset @@ -1306,9 +1306,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT { return this->_M_is_equal(__rhs); } +#if __cpp_impl_three_way_comparison < 201907L bool operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT { return !this->_M_is_equal(__rhs); } +#endif //@} /** diff --git a/libstdc++-v3/include/std/memory_resource b/libstdc++-v3/include/std/memory_resource index 74683c5267fc..f87ef9688f35 100644 --- a/libstdc++-v3/include/std/memory_resource +++ b/libstdc++-v3/include/std/memory_resource @@ -122,10 +122,11 @@ namespace pmr operator==(const memory_resource& __a, const memory_resource& __b) noexcept { return &__a == &__b || __a.is_equal(__b); } +#if __cpp_impl_three_way_comparison < 201907L inline bool operator!=(const memory_resource& __a, const memory_resource& __b) noexcept { return !(__a == __b); } - +#endif // C++17 23.12.3 Class template polymorphic_allocator template @@ -362,12 +363,13 @@ namespace pmr const polymorphic_allocator<_Tp2>& __b) noexcept { return *__a.resource() == *__b.resource(); } +#if __cpp_impl_three_way_comparison < 201907L template inline bool operator!=(const polymorphic_allocator<_Tp1>& __a, const polymorphic_allocator<_Tp2>& __b) noexcept { return !(__a == __b); } - +#endif /// Parameters for tuning a pool resource's behaviour. struct pool_options diff --git a/libstdc++-v3/include/std/scoped_allocator b/libstdc++-v3/include/std/scoped_allocator index 8b8866277499..969b6d8e8c2a 100644 --- a/libstdc++-v3/include/std/scoped_allocator +++ b/libstdc++-v3/include/std/scoped_allocator @@ -500,12 +500,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION && __a._M_inner == __b._M_inner; } +#if __cpp_impl_three_way_comparison < 201907L /// @related std::scoped_allocator_adaptor template inline bool operator!=(const scoped_allocator_adaptor<_OutA1, _InA...>& __a, const scoped_allocator_adaptor<_OutA2, _InA...>& __b) noexcept { return !(__a == __b); } +#endif /// @}