Make ext allocators support heterogeneous equality comparison

Programming / Compilers / GCC - redi [138bc75d-0d04-0410-961f-82ee72b054a4] - 11 October 2018 11:32 EDT

The Allocator requirements include the ability to compare different specializations of the same allocator class template. This did not work for __gnu_cxx::new_allocator and other extension allocators. This patch replaces the equality operators for those allocators with inline friends that support heterogeneous comparisons. (I'm not changing all ext allocators because some are bit-rotted already).

Additionally, the equality operators for comparing two std::allocator objects of the same type are now defined as inline friends. Those overloads don't need to be declared at namespace scope, because they aren't specified in the standard (but they're needed in this implementation to avoid ambiguities caused by the extra overloads defined for the base allocator type).

- include/bits/allocator.h (operator==(const allocator<_Tp>&, const allocator<_Tp>)) (operator!=(const allocator<_Tp>&, const allocator<_Tp>)): Replace with inline friends.
- include/ext/debug_allocator.h (operator==, operator!=): Replace with inline friend functions that compare to rebound allocators.
- include/ext/malloc_allocator.h (operator==, operator!=): Likewise.
- include/ext/new_allocator.h (operator==, operator!=): Likewise.
- testsuite/ext/debug_allocator/eq.cc: New test.
- testsuite/ext/ext_pointer/alloc_eq.cc: New test.
- testsuite/ext/malloc_allocator/eq.cc: New test.
- testsuite/ext/new_allocator/eq.cc: New test.

5d56b42ba9f Make ext allocators support heterogeneous equality comparison
libstdc++-v3/ChangeLog | 15 +++++++++++
libstdc++-v3/include/bits/allocator.h | 20 ++++++--------
libstdc++-v3/include/ext/debug_allocator.h | 20 +++++++-------
libstdc++-v3/include/ext/malloc_allocator.h | 22 ++++++++-------
libstdc++-v3/include/ext/new_allocator.h | 20 +++++++-------
libstdc++-v3/testsuite/ext/debug_allocator/eq.cc | 31 ++++++++++++++++++++++
libstdc++-v3/testsuite/ext/ext_pointer/alloc_eq.cc | 31 ++++++++++++++++++++++
libstdc++-v3/testsuite/ext/malloc_allocator/eq.cc | 31 ++++++++++++++++++++++
libstdc++-v3/testsuite/ext/new_allocator/eq.cc | 31 ++++++++++++++++++++++
9 files changed, 181 insertions(+), 40 deletions(-)

Upstream: gcc.gnu.org


  • Share