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 **)31 int 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