blob: de37c9c055b97d42686f6911150eafe4e56e3916 [file] [log] [blame]
Adam Balogh21583b72018-09-10 09:03:22 +00001// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.InvalidatedIterator -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=false %s -verify
2// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.InvalidatedIterator -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 %s -verify
Adam Balogh2cfbe932018-08-28 08:41:15 +00003
4#include "Inputs/system-header-simulator-cxx.h"
5
Adam Balogh12f5c7f2019-08-29 09:35:47 +00006void clang_analyzer_warnIfReached();
7
8void bad_copy_assign_operator1_list(std::list<int> &L1,
Adam Balogh2cfbe932018-08-28 08:41:15 +00009 const std::list<int> &L2) {
10 auto i0 = L1.cbegin();
11 L1 = L2;
12 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +000013 clang_analyzer_warnIfReached();
Adam Balogh2cfbe932018-08-28 08:41:15 +000014}
15
Adam Balogh12f5c7f2019-08-29 09:35:47 +000016void bad_copy_assign_operator1_vector(std::vector<int> &V1,
Adam Balogh2cfbe932018-08-28 08:41:15 +000017 const std::vector<int> &V2) {
18 auto i0 = V1.cbegin();
19 V1 = V2;
20 *i0; // expected-warning{{Invalidated iterator accessed}}
21}
22
Adam Balogh12f5c7f2019-08-29 09:35:47 +000023void bad_copy_assign_operator1_deque(std::deque<int> &D1,
Adam Balogh2cfbe932018-08-28 08:41:15 +000024 const std::deque<int> &D2) {
25 auto i0 = D1.cbegin();
26 D1 = D2;
27 *i0; // expected-warning{{Invalidated iterator accessed}}
28}
29
Adam Balogh12f5c7f2019-08-29 09:35:47 +000030void bad_copy_assign_operator1_forward_list(std::forward_list<int> &FL1,
Adam Balogh2cfbe932018-08-28 08:41:15 +000031 const std::forward_list<int> &FL2) {
32 auto i0 = FL1.cbegin();
33 FL1 = FL2;
34 *i0; // expected-warning{{Invalidated iterator accessed}}
35}
Adam Balogh9a48ba62018-09-10 09:06:31 +000036
Adam Balogh12f5c7f2019-08-29 09:35:47 +000037void bad_assign1_list(std::list<int> &L, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +000038 auto i0 = L.cbegin();
39 L.assign(10, n);
40 *i0; // expected-warning{{Invalidated iterator accessed}}
41}
42
Adam Balogh12f5c7f2019-08-29 09:35:47 +000043void bad_assign1_vector(std::vector<int> &V, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +000044 auto i0 = V.cbegin();
45 V.assign(10, n);
46 *i0; // expected-warning{{Invalidated iterator accessed}}
47}
48
Adam Balogh12f5c7f2019-08-29 09:35:47 +000049void bad_assign1_deque(std::deque<int> &D, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +000050 auto i0 = D.cbegin();
51 D.assign(10, n);
52 *i0; // expected-warning{{Invalidated iterator accessed}}
53}
54
Adam Balogh12f5c7f2019-08-29 09:35:47 +000055void bad_assign1_forward_list(std::forward_list<int> &FL, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +000056 auto i0 = FL.cbegin();
57 FL.assign(10, n);
58 *i0; // expected-warning{{Invalidated iterator accessed}}
59}
60
Adam Balogh12f5c7f2019-08-29 09:35:47 +000061void good_clear1_list(std::list<int> &L) {
Adam Balogh2e7cb342018-09-10 09:07:47 +000062 auto i0 = L.cend();
63 L.clear();
64 --i0; // no-warning
65}
66
Adam Balogh12f5c7f2019-08-29 09:35:47 +000067void bad_clear1_list(std::list<int> &L) {
Adam Balogh2e7cb342018-09-10 09:07:47 +000068 auto i0 = L.cbegin(), i1 = L.cend();
69 L.clear();
70 *i0; // expected-warning{{Invalidated iterator accessed}}
71}
72
Adam Balogh12f5c7f2019-08-29 09:35:47 +000073void bad_clear1_vector(std::vector<int> &V) {
Adam Balogh2e7cb342018-09-10 09:07:47 +000074 auto i0 = V.cbegin(), i1 = V.cend();
75 V.clear();
76 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +000077}
78
79void bad_clear1_vector_decr(std::vector<int> &V) {
80 auto i0 = V.cbegin(), i1 = V.cend();
81 V.clear();
Adam Balogh2e7cb342018-09-10 09:07:47 +000082 --i1; // expected-warning{{Invalidated iterator accessed}}
83}
84
Adam Balogh12f5c7f2019-08-29 09:35:47 +000085void bad_clear1_deque(std::deque<int> &D) {
Adam Balogh2e7cb342018-09-10 09:07:47 +000086 auto i0 = D.cbegin(), i1 = D.cend();
87 D.clear();
88 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +000089}
90
91void bad_clear1_deque_decr(std::deque<int> &D) {
92 auto i0 = D.cbegin(), i1 = D.cend();
93 D.clear();
Adam Balogh2e7cb342018-09-10 09:07:47 +000094 --i1; // expected-warning{{Invalidated iterator accessed}}
95}
96
Adam Balogh12f5c7f2019-08-29 09:35:47 +000097void good_push_back1_list(std::list<int> &L, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +000098 auto i0 = L.cbegin(), i1 = L.cend();
99 L.push_back(n);
100 *i0; // no-warning
101 --i1; // no-warning
102}
103
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000104void good_push_back1_vector(std::vector<int> &V, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000105 auto i0 = V.cbegin(), i1 = V.cend();
106 V.push_back(n);
107 *i0; // no-warning
108}
109
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000110void bad_push_back1_vector(std::vector<int> &V, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000111 auto i0 = V.cbegin(), i1 = V.cend();
112 V.push_back(n);
113 --i1; // expected-warning{{Invalidated iterator accessed}}
114}
115
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000116void bad_push_back1_deque(std::deque<int> &D, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000117 auto i0 = D.cbegin(), i1 = D.cend();
118 D.push_back(n);
119 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000120}
121
122void bad_push_back1_deque_decr(std::deque<int> &D, int n) {
123 auto i0 = D.cbegin(), i1 = D.cend();
124 D.push_back(n);
Adam Balogh9a48ba62018-09-10 09:06:31 +0000125 --i1; // expected-warning{{Invalidated iterator accessed}}
126}
127
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000128void good_emplace_back1_list(std::list<int> &L, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000129 auto i0 = L.cbegin(), i1 = L.cend();
130 L.emplace_back(n);
131 *i0; // no-warning
132 --i1; // no-warning
133}
134
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000135void good_emplace_back1_vector(std::vector<int> &V, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000136 auto i0 = V.cbegin(), i1 = V.cend();
137 V.emplace_back(n);
138 *i0; // no-warning
139}
140
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000141void bad_emplace_back1_vector(std::vector<int> &V, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000142 auto i0 = V.cbegin(), i1 = V.cend();
143 V.emplace_back(n);
144 --i1; // expected-warning{{Invalidated iterator accessed}}
145}
146
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000147void bad_emplace_back1_deque(std::deque<int> &D, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000148 auto i0 = D.cbegin(), i1 = D.cend();
149 D.emplace_back(n);
150 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000151}
152
153void bad_emplace_back1_deque_decr(std::deque<int> &D, int n) {
154 auto i0 = D.cbegin(), i1 = D.cend();
155 D.emplace_back(n);
Adam Balogh9a48ba62018-09-10 09:06:31 +0000156 --i1; // expected-warning{{Invalidated iterator accessed}}
157}
158
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000159void good_pop_back1_list(std::list<int> &L, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000160 auto i0 = L.cbegin(), i1 = L.cend(), i2 = i1--;
161 L.pop_back();
162 *i0; // no-warning
163 *i2; // no-warning
164}
165
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000166void bad_pop_back1_list(std::list<int> &L, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000167 auto i0 = L.cbegin(), i1 = L.cend(), i2 = i1--;
168 L.pop_back();
169 *i1; // expected-warning{{Invalidated iterator accessed}}
170}
171
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000172void good_pop_back1_vector(std::vector<int> &V, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000173 auto i0 = V.cbegin(), i1 = V.cend(), i2 = i1--;
174 V.pop_back();
175 *i0; // no-warning
176}
177
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000178void bad_pop_back1_vector(std::vector<int> &V, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000179 auto i0 = V.cbegin(), i1 = V.cend(), i2 = i1--;
180 V.pop_back();
181 *i1; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000182}
183
184void bad_pop_back1_vector_decr(std::vector<int> &V, int n) {
185 auto i0 = V.cbegin(), i1 = V.cend(), i2 = i1--;
186 V.pop_back();
Adam Balogh9a48ba62018-09-10 09:06:31 +0000187 --i2; // expected-warning{{Invalidated iterator accessed}}
188}
189
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000190void good_pop_back1_deque(std::deque<int> &D, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000191 auto i0 = D.cbegin(), i1 = D.cend(), i2 = i1--;
192 D.pop_back();
193 *i0; // no-warning
194}
195
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000196void bad_pop_back1_deque(std::deque<int> &D, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000197 auto i0 = D.cbegin(), i1 = D.cend(), i2 = i1--;
198 D.pop_back();
199 *i1; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000200}
201
202void bad_pop_back1_deque_decr(std::deque<int> &D, int n) {
203 auto i0 = D.cbegin(), i1 = D.cend(), i2 = i1--;
204 D.pop_back();
Adam Balogh9a48ba62018-09-10 09:06:31 +0000205 --i2; // expected-warning{{Invalidated iterator accessed}}
206}
207
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000208void good_push_front1_list(std::list<int> &L, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000209 auto i0 = L.cbegin(), i1 = L.cend();
210 L.push_front(n);
211 *i0; // no-warning
212 --i1; // no-warning
213}
214
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000215void bad_push_front1_deque(std::deque<int> &D, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000216 auto i0 = D.cbegin(), i1 = D.cend();
217 D.push_front(n);
218 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000219}
220
221void bad_push_front1_deque_decr(std::deque<int> &D, int n) {
222 auto i0 = D.cbegin(), i1 = D.cend();
223 D.push_front(n);
Adam Balogh9a48ba62018-09-10 09:06:31 +0000224 --i1; // expected-warning{{Invalidated iterator accessed}}
225}
226
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000227void good_push_front1_forward_list(std::forward_list<int> &FL, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000228 auto i0 = FL.cbegin(), i1 = FL.cend();
229 FL.push_front(n);
230 *i0; // no-warning
231}
232
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000233void good_emplace_front1_list(std::list<int> &L, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000234 auto i0 = L.cbegin(), i1 = L.cend();
235 L.emplace_front(n);
236 *i0; // no-warning
237 --i1; // no-warning
238}
239
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000240void bad_emplace_front1_deque(std::deque<int> &D, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000241 auto i0 = D.cbegin(), i1 = D.cend();
242 D.emplace_front(n);
243 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000244}
245
246void bad_emplace_front1_deque_decr(std::deque<int> &D, int n) {
247 auto i0 = D.cbegin(), i1 = D.cend();
248 D.emplace_front(n);
Adam Balogh9a48ba62018-09-10 09:06:31 +0000249 --i1; // expected-warning{{Invalidated iterator accessed}}
250}
251
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000252void good_emplace_front1_forward_list(std::forward_list<int> &FL, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000253 auto i0 = FL.cbegin(), i1 = FL.cend();
254 FL.emplace_front(n);
255 *i0; // no-warning
256}
257
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000258void good_pop_front1_list(std::list<int> &L, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000259 auto i1 = L.cbegin(), i0 = i1++;
260 L.pop_front();
261 *i1; // no-warning
262}
263
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000264void bad_pop_front1_list(std::list<int> &L, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000265 auto i1 = L.cbegin(), i0 = i1++;
266 L.pop_front();
267 *i0; // expected-warning{{Invalidated iterator accessed}}
268}
269
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000270void good_pop_front1_deque(std::deque<int> &D, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000271 auto i1 = D.cbegin(), i0 = i1++;
272 D.pop_front();
273 *i1; // no-warning
274}
275
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000276void bad_pop_front1_deque(std::deque<int> &D, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000277 auto i1 = D.cbegin(), i0 = i1++;
278 D.pop_front();
279 *i0; // expected-warning{{Invalidated iterator accessed}}
280}
281
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000282void good_pop_front1_forward_list(std::forward_list<int> &FL, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000283 auto i1 = FL.cbegin(), i0 = i1++;
284 FL.pop_front();
285 *i1; // no-warning
286}
287
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000288void bad_pop_front1_forward_list(std::forward_list<int> &FL, int n) {
Adam Balogh9a48ba62018-09-10 09:06:31 +0000289 auto i1 = FL.cbegin(), i0 = i1++;
290 FL.pop_front();
291 *i0; // expected-warning{{Invalidated iterator accessed}}
292}
Adam Balogh2e7cb342018-09-10 09:07:47 +0000293
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000294void good_insert1_list1(std::list<int> &L, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000295 auto i1 = L.cbegin(), i0 = i1++;
296 L.insert(i1, n);
297 *i0; // no-warning
298 *i1; // no-warning
299}
300
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000301void good_insert1_list2(std::list<int> &L, int n) {
302 auto i1 = L.cbegin(), i0 = i1++;
303 i1 = L.insert(i1, n);
304 *i1; // no-warning
305}
306
307void good_insert1_vector1(std::vector<int> &V, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000308 auto i1 = V.cbegin(), i0 = i1++;
309 V.insert(i1, n);
310 *i0; // no-warning
311}
312
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000313void good_insert1_vector2(std::vector<int> &V, int n) {
314 auto i1 = V.cbegin(), i0 = i1++;
315 i1 = V.insert(i1, n);
316 *i1; // no-warning
317}
318
319void bad_insert1_vector(std::vector<int> &V, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000320 auto i1 = V.cbegin(), i0 = i1++;
321 V.insert(i1, n);
322 *i1; // expected-warning{{Invalidated iterator accessed}}
323}
324
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000325void good_insert1_deque(std::deque<int> &D, int n) {
326 auto i1 = D.cbegin(), i0 = i1++;
327 i0 = D.insert(i1, n);
328 *i0; // no-warning
329}
330
331void bad_insert1_deque1(std::deque<int> &D, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000332 auto i1 = D.cbegin(), i0 = i1++;
333 D.insert(i1, n);
334 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000335}
336
337void bad_insert1_deque2(std::deque<int> &D, int n) {
338 auto i1 = D.cbegin(), i0 = i1++;
339 D.insert(i1, n);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000340 *i1; // expected-warning{{Invalidated iterator accessed}}
341}
342
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000343void good_insert2_list1(std::list<int> &L, int n) {
344 auto i1 = L.cbegin(), i0 = i1++;
345 L.insert(i1, std::move(n));
346 *i0; // no-warning
347 *i1; // no-warning
348}
349
350void good_insert2_list2(std::list<int> &L, int n) {
351 auto i1 = L.cbegin(), i0 = i1++;
352 i1 = L.insert(i1, std::move(n));
353 *i1; // no-warning
354}
355
356void good_insert2_vector1(std::vector<int> &V, int n) {
357 auto i1 = V.cbegin(), i0 = i1++;
358 V.insert(i1, std::move(n));
359 *i0; // no-warning
360}
361
362void good_insert2_vector2(std::vector<int> &V, int n) {
363 auto i1 = V.cbegin(), i0 = i1++;
364 i1 = V.insert(i1, std::move(n));
365 *i1; // no-warning
366}
367
368void bad_insert2_vector(std::vector<int> &V, int n) {
369 auto i1 = V.cbegin(), i0 = i1++;
370 V.insert(i1, std::move(n));
371 *i1; // expected-warning{{Invalidated iterator accessed}}
372}
373
374void good_insert2_deque(std::deque<int> &D, int n) {
375 auto i1 = D.cbegin(), i0 = i1++;
376 i1 = D.insert(i1, std::move(n));
377 *i1; // no-warning
378}
379
380void bad_insert2_deque1(std::deque<int> &D, int n) {
381 auto i1 = D.cbegin(), i0 = i1++;
382 D.insert(i1, std::move(n));
383 *i0; // expected-warning{{Invalidated iterator accessed}}
384}
385
386void bad_insert2_deque2(std::deque<int> &D, int n) {
387 auto i1 = D.cbegin(), i0 = i1++;
388 D.insert(i1, std::move(n));
389 *i1; // expected-warning{{Invalidated iterator accessed}}
390}
391
392void good_insert3_list1(std::list<int> &L, int n) {
393 auto i1 = L.cbegin(), i0 = i1++;
394 L.insert(i1, 10, n);
395 *i0; // no-warning
396 *i1; // no-warning
397}
398
399void good_insert3_list2(std::list<int> &L, int n) {
400 auto i1 = L.cbegin(), i0 = i1++;
401 i1 = L.insert(i1, 10, n);
402 *i1; // no-warning
403}
404
405void good_insert3_vector1(std::vector<int> &V, int n) {
406 auto i1 = V.cbegin(), i0 = i1++;
407 V.insert(i1, 10, n);
408 *i0; // no-warning
409}
410
411void good_insert3_vector2(std::vector<int> &V, int n) {
412 auto i1 = V.cbegin(), i0 = i1++;
413 i1 = V.insert(i1, 10, n);
414 *i1; // no-warning
415}
416
417void bad_insert3_vector(std::vector<int> &V, int n) {
418 auto i1 = V.cbegin(), i0 = i1++;
419 V.insert(i1, 10, n);
420 *i1; // expected-warning{{Invalidated iterator accessed}}
421}
422
423void good_insert3_deque(std::deque<int> &D, int n) {
424 auto i1 = D.cbegin(), i0 = i1++;
425 i1 = D.insert(i1, 10, std::move(n));
426 *i1; // no-warning
427}
428
429void bad_insert3_deque1(std::deque<int> &D, int n) {
430 auto i1 = D.cbegin(), i0 = i1++;
431 D.insert(i1, 10, std::move(n));
432 *i0; // expected-warning{{Invalidated iterator accessed}}
433}
434
435void bad_insert3_deque2(std::deque<int> &D, int n) {
436 auto i1 = D.cbegin(), i0 = i1++;
437 D.insert(i1, 10, std::move(n));
438 *i1; // expected-warning{{Invalidated iterator accessed}}
439}
440
441void good_insert4_list1(std::list<int> &L1, std::list<int> &L2, int n) {
442 auto i1 = L1.cbegin(), i0 = i1++;
443 L1.insert(i1, L2.cbegin(), L2.cend());
444 *i0; // no-warning
445 *i1; // no-warning
446}
447
448void good_insert4_list2(std::list<int> &L1, std::list<int> &L2, int n) {
449 auto i1 = L1.cbegin(), i0 = i1++;
450 i1 = L1.insert(i1, L2.cbegin(), L2.cend());
451 *i1; // no-warning
452}
453
454void good_insert4_vector1(std::vector<int> &V1, std::vector<int> &V2, int n) {
455 auto i1 = V1.cbegin(), i0 = i1++;
456 V1.insert(i1, V2.cbegin(), V2.cend());
457 *i0; // no-warning
458}
459
460void good_insert4_vector2(std::vector<int> &V1, std::vector<int> &V2, int n) {
461 auto i1 = V1.cbegin(), i0 = i1++;
462 i1 = V1.insert(i1, V2.cbegin(), V2.cend());
463 *i1; // no-warning
464}
465
466void bad_insert4_vector(std::vector<int> &V1, std::vector<int> &V2, int n) {
467 auto i1 = V1.cbegin(), i0 = i1++;
468 V1.insert(i1, V2.cbegin(), V2.cend());
469 *i1; // expected-warning{{Invalidated iterator accessed}}
470}
471
472void good_insert4_deque(std::deque<int> &D1, std::deque<int> &D2, int n) {
473 auto i1 = D1.cbegin(), i0 = i1++;
474 i1 = D1.insert(i1, D2.cbegin(), D2.cend());
475 *i1; // no-warning
476}
477
478void bad_insert4_deque1(std::deque<int> &D1, std::deque<int> &D2, int n) {
479 auto i1 = D1.cbegin(), i0 = i1++;
480 D1.insert(i1, D2.cbegin(), D2.cend());
481 *i0; // expected-warning{{Invalidated iterator accessed}}
482}
483
484void bad_insert4_deque2(std::deque<int> &D1, std::deque<int> &D2, int n) {
485 auto i1 = D1.cbegin(), i0 = i1++;
486 D1.insert(i1, D2.cbegin(), D2.cend());
487 *i1; // expected-warning{{Invalidated iterator accessed}}
488}
489
490void good_insert5_list1(std::list<int> &L) {
491 auto i1 = L.cbegin(), i0 = i1++;
492 L.insert(i1, {1, 2, 3, 4});
493 *i0; // no-warning
494 *i1; // no-warning
495}
496
497void good_insert5_list2(std::list<int> &L) {
498 auto i1 = L.cbegin(), i0 = i1++;
499 i1 = L.insert(i1, {1, 2, 3, 4});
500 *i1; // no-warning
501}
502
503void good_insert5_vector1(std::vector<int> &V) {
504 auto i1 = V.cbegin(), i0 = i1++;
505 V.insert(i1, {1, 2, 3, 4});
506 *i0; // no-warning
507}
508
509void good_insert5_vector2(std::vector<int> &V) {
510 auto i1 = V.cbegin(), i0 = i1++;
511 i1 = V.insert(i1, {1, 2, 3, 4});
512 *i1; // no-warning
513}
514
515void bad_insert5_vector(std::vector<int> &V) {
516 auto i1 = V.cbegin(), i0 = i1++;
517 V.insert(i1, {1, 2, 3, 4});
518 *i1; // expected-warning{{Invalidated iterator accessed}}
519}
520
521void good_insert5_deque(std::deque<int> &D) {
522 auto i1 = D.cbegin(), i0 = i1++;
523 i1 = D.insert(i1, {1, 2, 3, 4});
524 *i1; // no-warning
525}
526
527void bad_insert5_deque1(std::deque<int> &D) {
528 auto i1 = D.cbegin(), i0 = i1++;
529 D.insert(i1, {1, 2, 3, 4});
530 *i0; // expected-warning{{Invalidated iterator accessed}}
531}
532
533void bad_insert5_deque2(std::deque<int> &D) {
534 auto i1 = D.cbegin(), i0 = i1++;
535 D.insert(i1, {1, 2, 3, 4});
536 *i1; // expected-warning{{Invalidated iterator accessed}}
537}
538
539void good_emplace1_list(std::list<int> &L, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000540 auto i1 = L.cbegin(), i0 = i1++;
541 L.emplace(i1, n);
542 *i0; // no-warning
543 *i1; // no-warning
544}
545
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000546void good_emplace1_vector(std::vector<int> &V, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000547 auto i1 = V.cbegin(), i0 = i1++;
548 V.emplace(i1, n);
549 *i0; // no-warning
550}
551
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000552void bad_emplace1_vector(std::vector<int> &V, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000553 auto i1 = V.cbegin(), i0 = i1++;
554 V.emplace(i1, n);
555 *i1; // expected-warning{{Invalidated iterator accessed}}
556}
557
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000558void bad_emplace1_deque1(std::deque<int> &D, int n) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000559 auto i1 = D.cbegin(), i0 = i1++;
560 D.emplace(i1, n);
561 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000562}
563
564void bad_emplace1_deque2(std::deque<int> &D, int n) {
565 auto i1 = D.cbegin(), i0 = i1++;
566 D.emplace(i1, n);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000567 *i1; // expected-warning{{Invalidated iterator accessed}}
568}
569
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000570void good_erase1_list1(std::list<int> &L) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000571 auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
572 L.erase(i1);
573 *i0; // no-warning
574 *i2; // no-warning
575}
576
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000577void good_erase1_list2(std::list<int> &L) {
578 auto i0 = L.cbegin();
579 i0 = L.erase(i0);
580 *i0; // no-warning
581}
582
583void bad_erase1_list(std::list<int> &L) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000584 auto i0 = L.cbegin();
585 L.erase(i0);
586 *i0; // expected-warning{{Invalidated iterator accessed}}
587}
588
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000589void good_erase1_vector1(std::vector<int> &V) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000590 auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
591 V.erase(i1);
592 *i0; // no-warning
593}
594
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000595void good_erase1_vector2(std::vector<int> &V) {
596 auto i0 = V.cbegin();
597 i0 = V.erase(i0);
598 *i0; // no-warning
599}
600
601void bad_erase1_vector1(std::vector<int> &V) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000602 auto i1 = V.cbegin(), i0 = i1++;
603 V.erase(i0);
604 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000605}
606
607void bad_erase1_vector2(std::vector<int> &V) {
608 auto i1 = V.cbegin(), i0 = i1++;
609 V.erase(i0);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000610 *i1; // expected-warning{{Invalidated iterator accessed}}
611}
612
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000613void good_erase1_deque(std::deque<int> &D) {
614 auto i0 = D.cbegin();
615 i0 = D.erase(i0);
616 *i0; // no-warning
617}
618
619void bad_erase1_deque1(std::deque<int> &D) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000620 auto i2 = D.cbegin(), i0 = i2++, i1 = i2++;
621 D.erase(i1);
622 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000623}
624
625void bad_erase1_deque2(std::deque<int> &D) {
626 auto i2 = D.cbegin(), i0 = i2++, i1 = i2++;
627 D.erase(i1);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000628 *i1; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000629}
630
631void bad_erase1_deque3(std::deque<int> &D) {
632 auto i2 = D.cbegin(), i0 = i2++, i1 = i2++;
633 D.erase(i1);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000634 *i2; // expected-warning{{Invalidated iterator accessed}}
635}
636
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000637void good_erase2_list1(std::list<int> &L) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000638 auto i3 = L.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
639 L.erase(i1, i3);
640 *i0; // no-warning
641 *i3; // no-warning
642}
643
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000644void good_erase2_list2(std::list<int> &L) {
645 auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
646 i0 = L.erase(i0, i2);
647 *i0; // no-warning
648}
649
650void bad_erase2_list1(std::list<int> &L) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000651 auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
652 L.erase(i0, i2);
653 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000654}
655
656void bad_erase2_list2(std::list<int> &L) {
657 auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
658 L.erase(i0, i2);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000659 *i1; // expected-warning{{Invalidated iterator accessed}}
660}
661
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000662void good_erase2_vector1(std::vector<int> &V) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000663 auto i3 = V.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;;
664 V.erase(i1, i3);
665 *i0; // no-warning
666}
667
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000668void good_erase2_vector2(std::vector<int> &V) {
669 auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
670 i0 = V.erase(i0, i2);
671 *i0; // no-warning
672}
673
674void bad_erase2_vector1(std::vector<int> &V) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000675 auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
676 V.erase(i0, i2);
677 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000678}
679
680void bad_erase2_vector2(std::vector<int> &V) {
681 auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
682 V.erase(i0, i2);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000683 *i1; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000684}
685
686void bad_erase2_vector3(std::vector<int> &V) {
687 auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
688 V.erase(i0, i2);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000689 *i2; // expected-warning{{Invalidated iterator accessed}}
690}
691
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000692void good_erase2_deque(std::deque<int> &D) {
693 auto i2 = D.cbegin(), i0 = i2++, i1 = i2++;
694 i0 = D.erase(i0, i2);
695 *i0; // no-warning
696}
697
698void bad_erase2_deque1(std::deque<int> &D) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000699 auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
700 D.erase(i1, i3);
701 *i0; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000702}
703
704void bad_erase2_deque2(std::deque<int> &D) {
705 auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
706 D.erase(i1, i3);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000707 *i1; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000708}
709
710void bad_erase2_deque3(std::deque<int> &D) {
711 auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
712 D.erase(i1, i3);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000713 *i2; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000714}
715
716void bad_erase2_deque4(std::deque<int> &D) {
717 auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
718 D.erase(i1, i3);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000719 *i3; // expected-warning{{Invalidated iterator accessed}}
720}
721
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000722void good_erase_after1_forward_list1(std::forward_list<int> &FL) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000723 auto i2 = FL.cbegin(), i0 = i2++, i1 = i2++;
724 FL.erase_after(i0);
725 *i0; // no-warning
726 *i2; // no-warning
727}
728
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000729void good_erase_after1_forward_lis2(std::forward_list<int> &FL) {
730 auto i1 = FL.cbegin(), i0 = i1++;
731 i1 = FL.erase_after(i0);
732 *i1; // no-warning
733}
734
735void bad_erase_after1_forward_list(std::forward_list<int> &FL) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000736 auto i1 = FL.cbegin(), i0 = i1++;
737 FL.erase_after(i0);
738 *i1; // expected-warning{{Invalidated iterator accessed}}
739}
740
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000741void good_erase_after2_forward_list1(std::forward_list<int> &FL) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000742 auto i3 = FL.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
743 FL.erase_after(i0, i3);
744 *i0; // no-warning
745 *i3; // no-warning
746}
747
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000748void good_erase_after2_forward_list2(std::forward_list<int> &FL) {
749 auto i3 = FL.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
750 i2 = FL.erase_after(i0, i3);
751 *i2; // no-warning
752}
753
754void bad_erase_after2_forward_list1(std::forward_list<int> &FL) {
Adam Balogh2e7cb342018-09-10 09:07:47 +0000755 auto i3 = FL.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
756 FL.erase_after(i0, i3);
757 *i1; // expected-warning{{Invalidated iterator accessed}}
Adam Balogh12f5c7f2019-08-29 09:35:47 +0000758}
759
760void bad_erase_after2_forward_list2(std::forward_list<int> &FL) {
761 auto i3 = FL.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
762 FL.erase_after(i0, i3);
Adam Balogh2e7cb342018-09-10 09:07:47 +0000763 *i2; // expected-warning{{Invalidated iterator accessed}}
764}