|
21 | 21 |
|
22 | 22 | #ifndef TEST_HAS_NO_EXCEPTIONS
|
23 | 23 | struct Throws {
|
24 |
| - Throws() : v_(0) {} |
25 |
| - Throws(int v) : v_(v) {} |
26 |
| - Throws(const Throws &rhs) : v_(rhs.v_) { if (sThrows) throw 1; } |
27 |
| - Throws( Throws &&rhs) : v_(rhs.v_) { if (sThrows) throw 1; } |
28 |
| - Throws& operator=(const Throws &rhs) { v_ = rhs.v_; return *this; } |
29 |
| - Throws& operator=( Throws &&rhs) { v_ = rhs.v_; return *this; } |
30 |
| - int v_; |
31 |
| - static bool sThrows; |
32 |
| - }; |
| 24 | + Throws() : v_(0) {} |
| 25 | + Throws(int v) : v_(v) {} |
| 26 | + Throws(const Throws& rhs) : v_(rhs.v_) { |
| 27 | + if (sThrows) |
| 28 | + throw 1; |
| 29 | + } |
| 30 | + Throws(Throws&& rhs) : v_(rhs.v_) { |
| 31 | + if (sThrows) |
| 32 | + throw 1; |
| 33 | + } |
| 34 | + Throws& operator=(const Throws& rhs) { |
| 35 | + v_ = rhs.v_; |
| 36 | + return *this; |
| 37 | + } |
| 38 | + Throws& operator=(Throws&& rhs) { |
| 39 | + v_ = rhs.v_; |
| 40 | + return *this; |
| 41 | + } |
| 42 | + int v_; |
| 43 | + static bool sThrows; |
| 44 | +}; |
33 | 45 |
|
34 | 46 | bool Throws::sThrows = false;
|
35 | 47 | #endif
|
36 | 48 |
|
37 |
| -TEST_CONSTEXPR_CXX20 bool tests() |
38 |
| -{ |
39 |
| - int a1[] = {1, 2, 3}; |
| 49 | +TEST_CONSTEXPR_CXX20 bool tests() { |
| 50 | + int a1[] = {1, 2, 3}; |
| 51 | + { |
| 52 | + std::vector<int> l1(a1, a1 + 3); |
| 53 | + assert(is_contiguous_container_asan_correct(l1)); |
| 54 | + std::vector<int>::iterator i = l1.erase(l1.cbegin(), l1.cbegin()); |
| 55 | + assert(l1.size() == 3); |
| 56 | + assert(std::distance(l1.cbegin(), l1.cend()) == 3); |
| 57 | + assert(i == l1.begin()); |
| 58 | + assert(is_contiguous_container_asan_correct(l1)); |
| 59 | + } |
| 60 | + { |
| 61 | + std::vector<int> l1(a1, a1 + 3); |
| 62 | + assert(is_contiguous_container_asan_correct(l1)); |
| 63 | + std::vector<int>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin())); |
| 64 | + assert(l1.size() == 2); |
| 65 | + assert(std::distance(l1.cbegin(), l1.cend()) == 2); |
| 66 | + assert(i == l1.begin()); |
| 67 | + assert(l1 == std::vector<int>(a1 + 1, a1 + 3)); |
| 68 | + assert(is_contiguous_container_asan_correct(l1)); |
| 69 | + } |
| 70 | + { |
| 71 | + std::vector<int> l1(a1, a1 + 3); |
| 72 | + assert(is_contiguous_container_asan_correct(l1)); |
| 73 | + std::vector<int>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin(), 2)); |
| 74 | + assert(l1.size() == 1); |
| 75 | + assert(std::distance(l1.cbegin(), l1.cend()) == 1); |
| 76 | + assert(i == l1.begin()); |
| 77 | + assert(l1 == std::vector<int>(a1 + 2, a1 + 3)); |
| 78 | + assert(is_contiguous_container_asan_correct(l1)); |
| 79 | + } |
| 80 | + { |
| 81 | + std::vector<int> l1(a1, a1 + 3); |
| 82 | + assert(is_contiguous_container_asan_correct(l1)); |
| 83 | + std::vector<int>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin(), 3)); |
| 84 | + assert(l1.size() == 0); |
| 85 | + assert(std::distance(l1.cbegin(), l1.cend()) == 0); |
| 86 | + assert(i == l1.begin()); |
| 87 | + assert(is_contiguous_container_asan_correct(l1)); |
| 88 | + } |
| 89 | + { |
| 90 | + std::vector<std::vector<int> > outer(2, std::vector<int>(1)); |
| 91 | + assert(is_contiguous_container_asan_correct(outer)); |
| 92 | + assert(is_contiguous_container_asan_correct(outer[0])); |
| 93 | + assert(is_contiguous_container_asan_correct(outer[1])); |
| 94 | + outer.erase(outer.begin(), outer.begin()); |
| 95 | + assert(outer.size() == 2); |
| 96 | + assert(outer[0].size() == 1); |
| 97 | + assert(outer[1].size() == 1); |
| 98 | + assert(is_contiguous_container_asan_correct(outer)); |
| 99 | + assert(is_contiguous_container_asan_correct(outer[0])); |
| 100 | + assert(is_contiguous_container_asan_correct(outer[1])); |
| 101 | + } |
| 102 | + // Make sure vector::erase works with move-only types |
| 103 | + { |
| 104 | + // When non-trivial |
40 | 105 | {
|
41 |
| - std::vector<int> l1(a1, a1+3); |
42 |
| - assert(is_contiguous_container_asan_correct(l1)); |
43 |
| - std::vector<int>::iterator i = l1.erase(l1.cbegin(), l1.cbegin()); |
44 |
| - assert(l1.size() == 3); |
45 |
| - assert(std::distance(l1.cbegin(), l1.cend()) == 3); |
46 |
| - assert(i == l1.begin()); |
47 |
| - assert(is_contiguous_container_asan_correct(l1)); |
| 106 | + std::vector<MoveOnly> v; |
| 107 | + v.emplace_back(1); |
| 108 | + v.emplace_back(2); |
| 109 | + v.emplace_back(3); |
| 110 | + v.erase(v.begin(), v.begin() + 2); |
| 111 | + assert(v.size() == 1); |
| 112 | + assert(v[0] == MoveOnly(3)); |
48 | 113 | }
|
| 114 | + // When trivial |
49 | 115 | {
|
50 |
| - std::vector<int> l1(a1, a1+3); |
51 |
| - assert(is_contiguous_container_asan_correct(l1)); |
52 |
| - std::vector<int>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin())); |
53 |
| - assert(l1.size() == 2); |
54 |
| - assert(std::distance(l1.cbegin(), l1.cend()) == 2); |
55 |
| - assert(i == l1.begin()); |
56 |
| - assert(l1 == std::vector<int>(a1+1, a1+3)); |
57 |
| - assert(is_contiguous_container_asan_correct(l1)); |
58 |
| - } |
59 |
| - { |
60 |
| - std::vector<int> l1(a1, a1+3); |
61 |
| - assert(is_contiguous_container_asan_correct(l1)); |
62 |
| - std::vector<int>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin(), 2)); |
63 |
| - assert(l1.size() == 1); |
64 |
| - assert(std::distance(l1.cbegin(), l1.cend()) == 1); |
65 |
| - assert(i == l1.begin()); |
66 |
| - assert(l1 == std::vector<int>(a1+2, a1+3)); |
67 |
| - assert(is_contiguous_container_asan_correct(l1)); |
68 |
| - } |
69 |
| - { |
70 |
| - std::vector<int> l1(a1, a1+3); |
71 |
| - assert(is_contiguous_container_asan_correct(l1)); |
72 |
| - std::vector<int>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin(), 3)); |
73 |
| - assert(l1.size() == 0); |
74 |
| - assert(std::distance(l1.cbegin(), l1.cend()) == 0); |
75 |
| - assert(i == l1.begin()); |
76 |
| - assert(is_contiguous_container_asan_correct(l1)); |
77 |
| - } |
78 |
| - { |
79 |
| - std::vector<std::vector<int> > outer(2, std::vector<int>(1)); |
80 |
| - assert(is_contiguous_container_asan_correct(outer)); |
81 |
| - assert(is_contiguous_container_asan_correct(outer[0])); |
82 |
| - assert(is_contiguous_container_asan_correct(outer[1])); |
83 |
| - outer.erase(outer.begin(), outer.begin()); |
84 |
| - assert(outer.size() == 2); |
85 |
| - assert(outer[0].size() == 1); |
86 |
| - assert(outer[1].size() == 1); |
87 |
| - assert(is_contiguous_container_asan_correct(outer)); |
88 |
| - assert(is_contiguous_container_asan_correct(outer[0])); |
89 |
| - assert(is_contiguous_container_asan_correct(outer[1])); |
90 |
| - } |
91 |
| - // Make sure vector::erase works with move-only types |
92 |
| - { |
93 |
| - // When non-trivial |
94 |
| - { |
95 |
| - std::vector<MoveOnly> v; |
96 |
| - v.emplace_back(1); v.emplace_back(2); v.emplace_back(3); |
97 |
| - v.erase(v.begin(), v.begin() + 2); |
98 |
| - assert(v.size() == 1); |
99 |
| - assert(v[0] == MoveOnly(3)); |
100 |
| - } |
101 |
| - // When trivial |
102 |
| - { |
103 |
| - std::vector<TrivialMoveOnly> v; |
104 |
| - v.emplace_back(1); v.emplace_back(2); v.emplace_back(3); |
105 |
| - v.erase(v.begin(), v.begin() + 2); |
106 |
| - assert(v.size() == 1); |
107 |
| - assert(v[0] == TrivialMoveOnly(3)); |
108 |
| - } |
| 116 | + std::vector<TrivialMoveOnly> v; |
| 117 | + v.emplace_back(1); |
| 118 | + v.emplace_back(2); |
| 119 | + v.emplace_back(3); |
| 120 | + v.erase(v.begin(), v.begin() + 2); |
| 121 | + assert(v.size() == 1); |
| 122 | + assert(v[0] == TrivialMoveOnly(3)); |
109 | 123 | }
|
| 124 | + } |
110 | 125 | #if TEST_STD_VER >= 11
|
111 |
| - { |
112 |
| - std::vector<int, min_allocator<int>> l1(a1, a1+3); |
113 |
| - assert(is_contiguous_container_asan_correct(l1)); |
114 |
| - std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), l1.cbegin()); |
115 |
| - assert(l1.size() == 3); |
116 |
| - assert(std::distance(l1.cbegin(), l1.cend()) == 3); |
117 |
| - assert(i == l1.begin()); |
118 |
| - assert(is_contiguous_container_asan_correct(l1)); |
119 |
| - } |
120 |
| - { |
121 |
| - std::vector<int, min_allocator<int>> l1(a1, a1+3); |
122 |
| - assert(is_contiguous_container_asan_correct(l1)); |
123 |
| - std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin())); |
124 |
| - assert(l1.size() == 2); |
125 |
| - assert(std::distance(l1.cbegin(), l1.cend()) == 2); |
126 |
| - assert(i == l1.begin()); |
127 |
| - assert((l1 == std::vector<int, min_allocator<int>>(a1+1, a1+3))); |
128 |
| - assert(is_contiguous_container_asan_correct(l1)); |
129 |
| - } |
130 |
| - { |
131 |
| - std::vector<int, min_allocator<int>> l1(a1, a1+3); |
132 |
| - assert(is_contiguous_container_asan_correct(l1)); |
133 |
| - std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin(), 2)); |
134 |
| - assert(l1.size() == 1); |
135 |
| - assert(std::distance(l1.cbegin(), l1.cend()) == 1); |
136 |
| - assert(i == l1.begin()); |
137 |
| - assert((l1 == std::vector<int, min_allocator<int>>(a1+2, a1+3))); |
138 |
| - assert(is_contiguous_container_asan_correct(l1)); |
139 |
| - } |
140 |
| - { |
141 |
| - std::vector<int, min_allocator<int>> l1(a1, a1+3); |
142 |
| - assert(is_contiguous_container_asan_correct(l1)); |
143 |
| - std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin(), 3)); |
144 |
| - assert(l1.size() == 0); |
145 |
| - assert(std::distance(l1.cbegin(), l1.cend()) == 0); |
146 |
| - assert(i == l1.begin()); |
147 |
| - assert(is_contiguous_container_asan_correct(l1)); |
148 |
| - } |
149 |
| - { |
150 |
| - std::vector<std::vector<int, min_allocator<int>>, min_allocator<std::vector<int, min_allocator<int>>>> outer(2, std::vector<int, min_allocator<int>>(1)); |
151 |
| - assert(is_contiguous_container_asan_correct(outer)); |
152 |
| - assert(is_contiguous_container_asan_correct(outer[0])); |
153 |
| - assert(is_contiguous_container_asan_correct(outer[1])); |
154 |
| - outer.erase(outer.begin(), outer.begin()); |
155 |
| - assert(outer.size() == 2); |
156 |
| - assert(outer[0].size() == 1); |
157 |
| - assert(outer[1].size() == 1); |
158 |
| - assert(is_contiguous_container_asan_correct(outer)); |
159 |
| - assert(is_contiguous_container_asan_correct(outer[0])); |
160 |
| - assert(is_contiguous_container_asan_correct(outer[1])); |
161 |
| - } |
| 126 | + { |
| 127 | + std::vector<int, min_allocator<int>> l1(a1, a1 + 3); |
| 128 | + assert(is_contiguous_container_asan_correct(l1)); |
| 129 | + std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), l1.cbegin()); |
| 130 | + assert(l1.size() == 3); |
| 131 | + assert(std::distance(l1.cbegin(), l1.cend()) == 3); |
| 132 | + assert(i == l1.begin()); |
| 133 | + assert(is_contiguous_container_asan_correct(l1)); |
| 134 | + } |
| 135 | + { |
| 136 | + std::vector<int, min_allocator<int>> l1(a1, a1 + 3); |
| 137 | + assert(is_contiguous_container_asan_correct(l1)); |
| 138 | + std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin())); |
| 139 | + assert(l1.size() == 2); |
| 140 | + assert(std::distance(l1.cbegin(), l1.cend()) == 2); |
| 141 | + assert(i == l1.begin()); |
| 142 | + assert((l1 == std::vector<int, min_allocator<int>>(a1 + 1, a1 + 3))); |
| 143 | + assert(is_contiguous_container_asan_correct(l1)); |
| 144 | + } |
| 145 | + { |
| 146 | + std::vector<int, min_allocator<int>> l1(a1, a1 + 3); |
| 147 | + assert(is_contiguous_container_asan_correct(l1)); |
| 148 | + std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin(), 2)); |
| 149 | + assert(l1.size() == 1); |
| 150 | + assert(std::distance(l1.cbegin(), l1.cend()) == 1); |
| 151 | + assert(i == l1.begin()); |
| 152 | + assert((l1 == std::vector<int, min_allocator<int>>(a1 + 2, a1 + 3))); |
| 153 | + assert(is_contiguous_container_asan_correct(l1)); |
| 154 | + } |
| 155 | + { |
| 156 | + std::vector<int, min_allocator<int>> l1(a1, a1 + 3); |
| 157 | + assert(is_contiguous_container_asan_correct(l1)); |
| 158 | + std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), std::next(l1.cbegin(), 3)); |
| 159 | + assert(l1.size() == 0); |
| 160 | + assert(std::distance(l1.cbegin(), l1.cend()) == 0); |
| 161 | + assert(i == l1.begin()); |
| 162 | + assert(is_contiguous_container_asan_correct(l1)); |
| 163 | + } |
| 164 | + { |
| 165 | + std::vector<std::vector<int, min_allocator<int>>, min_allocator<std::vector<int, min_allocator<int>>>> outer( |
| 166 | + 2, std::vector<int, min_allocator<int>>(1)); |
| 167 | + assert(is_contiguous_container_asan_correct(outer)); |
| 168 | + assert(is_contiguous_container_asan_correct(outer[0])); |
| 169 | + assert(is_contiguous_container_asan_correct(outer[1])); |
| 170 | + outer.erase(outer.begin(), outer.begin()); |
| 171 | + assert(outer.size() == 2); |
| 172 | + assert(outer[0].size() == 1); |
| 173 | + assert(outer[1].size() == 1); |
| 174 | + assert(is_contiguous_container_asan_correct(outer)); |
| 175 | + assert(is_contiguous_container_asan_correct(outer[0])); |
| 176 | + assert(is_contiguous_container_asan_correct(outer[1])); |
| 177 | + } |
162 | 178 | #endif
|
163 | 179 |
|
164 |
| - return true; |
| 180 | + return true; |
165 | 181 | }
|
166 | 182 |
|
167 |
| -int main(int, char**) |
168 |
| -{ |
169 |
| - tests(); |
| 183 | +int main(int, char**) { |
| 184 | + tests(); |
170 | 185 | #if TEST_STD_VER > 17
|
171 |
| - static_assert(tests()); |
| 186 | + static_assert(tests()); |
172 | 187 | #endif
|
173 | 188 |
|
174 | 189 | #ifndef TEST_HAS_NO_EXCEPTIONS
|
175 |
| -// Test for LWG2853: |
176 |
| -// Throws: Nothing unless an exception is thrown by the assignment operator or move assignment operator of T. |
177 |
| - { |
178 |
| - Throws arr[] = {1, 2, 3}; |
179 |
| - std::vector<Throws> v(arr, arr+3); |
180 |
| - Throws::sThrows = true; |
181 |
| - v.erase(v.begin(), --v.end()); |
182 |
| - assert(v.size() == 1); |
183 |
| - v.erase(v.begin(), v.end()); |
184 |
| - assert(v.size() == 0); |
185 |
| - } |
| 190 | + // Test for LWG2853: |
| 191 | + // Throws: Nothing unless an exception is thrown by the assignment operator or move assignment operator of T. |
| 192 | + { |
| 193 | + Throws arr[] = {1, 2, 3}; |
| 194 | + std::vector<Throws> v(arr, arr + 3); |
| 195 | + Throws::sThrows = true; |
| 196 | + v.erase(v.begin(), --v.end()); |
| 197 | + assert(v.size() == 1); |
| 198 | + v.erase(v.begin(), v.end()); |
| 199 | + assert(v.size() == 0); |
| 200 | + } |
186 | 201 | #endif
|
187 | 202 |
|
188 |
| - return 0; |
| 203 | + return 0; |
189 | 204 | }
|
0 commit comments