libstdc++: Implement LWG 3683 for pmr::polymorphic_allocator

This issue has recently been moved to Tentatively Ready, and seems
uncontroversial. This allows equality comparison with types that are
convertible to pmr::polymorphic_allocator, which fail deduction for the
existing equality operator.

libstdc++-v3/ChangeLog:

	* include/std/memory_resource (polymorphic_allocator): Add
	non-template equality operator, as proposed for LWG 3683.
	* testsuite/20_util/polymorphic_allocator/lwg3683.cc: New test.
This commit is contained in:
Jonathan Wakely 2022-05-19 13:26:49 +01:00
parent 060173dd73
commit f13f9c99db
2 changed files with 29 additions and 0 deletions

View File

@ -356,6 +356,22 @@ namespace pmr
__attribute__((__returns_nonnull__))
{ return _M_resource; }
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 3683. operator== for polymorphic_allocator cannot deduce template arg
[[nodiscard]]
friend bool
operator==(const polymorphic_allocator& __a,
const polymorphic_allocator& __b) noexcept
{ return *__a.resource() == *__b.resource(); }
#if __cpp_impl_three_way_comparison < 201907L
[[nodiscard]]
friend bool
operator!=(const polymorphic_allocator& __a,
const polymorphic_allocator& __b) noexcept
{ return !(__a == __b); }
#endif
private:
#if ! __cpp_lib_make_obj_using_allocator
using __uses_alloc1_ = __uses_alloc1<polymorphic_allocator>;

View File

@ -0,0 +1,13 @@
// { dg-do compile { target c++17 } }
#include <memory_resource>
bool
test_lwg3683(const std::pmr::polymorphic_allocator<int>& a)
{
if (a == std::pmr::get_default_resource())
return true;
if (std::pmr::get_default_resource() != a)
return false;
throw a;
}