From ab39f0b7d252ec0a541f0fe3ec6bf4bb9882effd Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Tue, 19 Jul 2022 14:27:00 +0800 Subject: [PATCH 1/2] Add test cases for LWG-3683 --- .../test.cpp | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/std/tests/P0220R1_polymorphic_memory_resources/test.cpp b/tests/std/tests/P0220R1_polymorphic_memory_resources/test.cpp index cd3cb543f7c..7144cc0a21b 100644 --- a/tests/std/tests/P0220R1_polymorphic_memory_resources/test.cpp +++ b/tests/std/tests/P0220R1_polymorphic_memory_resources/test.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -946,6 +947,45 @@ namespace { } } // namespace eq + namespace eq_cvt { + void test() { + const auto pres = std::pmr::get_default_resource(); + std::pmr::polymorphic_allocator a = pres; + const auto ra = std::ref(a); + const auto cra = std::cref(a); + + CHECK(a == pres); + CHECK(a == ra); + CHECK(a == cra); + CHECK(pres == a); + CHECK(pres == ra); + CHECK(pres == cra); + CHECK(ra == a); + CHECK(ra == pres); + CHECK(ra == ra); + CHECK(ra == cra); + CHECK(cra == a); + CHECK(cra == pres); + CHECK(cra == ra); + CHECK(cra == cra); + + CHECK(!(a != pres)); + CHECK(!(a != ra)); + CHECK(!(a != cra)); + CHECK(!(pres != a)); + CHECK(!(pres != ra)); + CHECK(!(pres != cra)); + CHECK(!(ra != a)); + CHECK(!(ra != pres)); + CHECK(!(ra != ra)); + CHECK(!(ra != cra)); + CHECK(!(cra != a)); + CHECK(!(cra != pres)); + CHECK(!(cra != ra)); + CHECK(!(cra != cra)); + } + } // namespace eq_cvt + namespace destroy { void test() { bool destroyed = false; @@ -1505,6 +1545,7 @@ int main() { polymorphic_allocator::mem::select_on_container_copy_construction::test(); polymorphic_allocator::mem::resource::test(); polymorphic_allocator::eq::test(); + polymorphic_allocator::eq_cvt::test(); polymorphic_allocator::destroy::test(); monotonic::ctor::buffer_upstream::test(); From aa10ae4c998b5890f29fb9bcc66a0aa4719dbf2d Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Tue, 19 Jul 2022 14:55:11 +0800 Subject: [PATCH 2/2] Implement LWG-3683 also in C++17 mode --- stl/inc/xpolymorphic_allocator.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/stl/inc/xpolymorphic_allocator.h b/stl/inc/xpolymorphic_allocator.h index 1701dedbdf5..d065085328e 100644 --- a/stl/inc/xpolymorphic_allocator.h +++ b/stl/inc/xpolymorphic_allocator.h @@ -282,6 +282,18 @@ namespace pmr { return _Resource; } + _NODISCARD_FRIEND bool operator==( + const polymorphic_allocator& _Lhs, const polymorphic_allocator& _Rhs) noexcept { + return *_Lhs._Resource == *_Rhs._Resource; + } + +#if !_HAS_CXX20 + _NODISCARD_FRIEND bool operator!=( + const polymorphic_allocator& _Lhs, const polymorphic_allocator& _Rhs) noexcept { + return *_Lhs._Resource != *_Rhs._Resource; + } +#endif // !_HAS_CXX20 + private: memory_resource* _Resource = _STD pmr::get_default_resource(); };