1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03, c++11, c++14 10 // TODO: Change to XFAIL once https://github.com/llvm/llvm-project/issues/40340 is fixed 11 // UNSUPPORTED: availability-pmr-missing 12 13 // test_memory_resource requires RTTI for dynamic_cast 14 // UNSUPPORTED: no-rtti 15 16 // <memory_resource> 17 18 // template <class T> class polymorphic_allocator; 19 20 // template <class T, class U> 21 // bool operator==( 22 // polymorphic_allocator<T> const & 23 // , polymorphic_allocator<U> const &) noexcept 24 25 #include <memory_resource> 26 #include <cassert> 27 #include <type_traits> 28 29 #include "test_std_memory_resource.h" 30 main(int,char **)31int main(int, char**) { 32 typedef std::pmr::polymorphic_allocator<void> A1; 33 typedef std::pmr::polymorphic_allocator<int> A2; 34 // check return types 35 { 36 A1 const a1; 37 A2 const a2; 38 static_assert(std::is_same_v<decltype(a1 == a2), bool>); 39 static_assert(noexcept(a1 == a2)); 40 } 41 // equal same type (different resource) 42 { 43 TestResource d1(1); 44 TestResource d2(1); 45 A1 const a1(&d1); 46 A1 const a2(&d2); 47 48 assert(a1 == a2); 49 assert(d1.checkIsEqualCalledEq(1)); 50 assert(d2.checkIsEqualCalledEq(0)); 51 52 d1.reset(); 53 54 assert(a2 == a1); 55 assert(d1.checkIsEqualCalledEq(0)); 56 assert(d2.checkIsEqualCalledEq(1)); 57 } 58 // equal same type (same resource) 59 { 60 TestResource d1; 61 A1 const a1(&d1); 62 A1 const a2(&d1); 63 64 assert(a1 == a2); 65 assert(d1.checkIsEqualCalledEq(0)); 66 67 assert(a2 == a1); 68 assert(d1.checkIsEqualCalledEq(0)); 69 } 70 // equal different type (different resource) 71 { 72 TestResource d1(42); 73 TestResource d2(42); 74 A1 const a1(&d1); 75 A2 const a2(&d2); 76 77 assert(a1 == a2); 78 assert(d1.checkIsEqualCalledEq(1)); 79 assert(d2.checkIsEqualCalledEq(0)); 80 81 assert(a2 == a1); 82 assert(d1.checkIsEqualCalledEq(1)); 83 assert(d2.checkIsEqualCalledEq(1)); 84 } 85 // equal different type (same resource) 86 { 87 TestResource d1(42); 88 A1 const a1(&d1); 89 A2 const a2(&d1); 90 91 assert(a1 == a2); 92 assert(d1.checkIsEqualCalledEq(0)); 93 94 assert(a2 == a1); 95 assert(d1.checkIsEqualCalledEq(0)); 96 } 97 // not equal same type 98 { 99 TestResource d1(1); 100 TestResource d2(2); 101 A1 const a1(&d1); 102 A1 const a2(&d2); 103 104 assert(!(a1 == a2)); 105 assert(d1.checkIsEqualCalledEq(1)); 106 assert(d2.checkIsEqualCalledEq(0)); 107 108 d1.reset(); 109 110 assert(!(a2 == a1)); 111 assert(d1.checkIsEqualCalledEq(0)); 112 assert(d2.checkIsEqualCalledEq(1)); 113 } 114 // not equal different types 115 { 116 TestResource d1; 117 TestResource1 d2; 118 A1 const a1(&d1); 119 A2 const a2(&d2); 120 121 assert(!(a1 == a2)); 122 assert(d1.checkIsEqualCalledEq(1)); 123 assert(d2.checkIsEqualCalledEq(0)); 124 125 d1.reset(); 126 127 assert(!(a2 == a1)); 128 assert(d1.checkIsEqualCalledEq(0)); 129 assert(d2.checkIsEqualCalledEq(1)); 130 } 131 132 return 0; 133 } 134