1 // 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
3 
4 #include "Inputs/system-header-simulator-cxx.h"
5 
6 void clang_analyzer_warnIfReached();
7 
8 void bad_copy_assign_operator1_list(std::list<int> &L1,
9                                     const std::list<int> &L2) {
10   auto i0 = L1.cbegin();
11   L1 = L2;
12   *i0; // expected-warning{{Invalidated iterator accessed}}
13   clang_analyzer_warnIfReached();
14 }
15 
16 void bad_copy_assign_operator1_vector(std::vector<int> &V1,
17                                       const std::vector<int> &V2) {
18   auto i0 = V1.cbegin();
19   V1 = V2;
20   *i0; // expected-warning{{Invalidated iterator accessed}}
21 }
22 
23 void bad_copy_assign_operator1_deque(std::deque<int> &D1,
24                                      const std::deque<int> &D2) {
25   auto i0 = D1.cbegin();
26   D1 = D2;
27   *i0; // expected-warning{{Invalidated iterator accessed}}
28 }
29 
30 void bad_copy_assign_operator1_forward_list(std::forward_list<int> &FL1,
31                                             const std::forward_list<int> &FL2) {
32   auto i0 = FL1.cbegin();
33   FL1 = FL2;
34   *i0; // expected-warning{{Invalidated iterator accessed}}
35 }
36 
37 void bad_assign1_list(std::list<int> &L, int n) {
38   auto i0 = L.cbegin();
39   L.assign(10, n);
40   *i0; // expected-warning{{Invalidated iterator accessed}}
41 }
42 
43 void bad_assign1_vector(std::vector<int> &V, int n) {
44   auto i0 = V.cbegin();
45   V.assign(10, n);
46   *i0; // expected-warning{{Invalidated iterator accessed}}
47 }
48 
49 void bad_assign1_deque(std::deque<int> &D, int n) {
50   auto i0 = D.cbegin();
51   D.assign(10, n);
52   *i0; // expected-warning{{Invalidated iterator accessed}}
53 }
54 
55 void bad_assign1_forward_list(std::forward_list<int> &FL, int n) {
56   auto i0 = FL.cbegin();
57   FL.assign(10, n);
58   *i0; // expected-warning{{Invalidated iterator accessed}}
59 }
60 
61 void good_clear1_list(std::list<int> &L) {
62   auto i0 = L.cend();
63   L.clear();
64   --i0; // no-warning
65 }
66 
67 void bad_clear1_list(std::list<int> &L) {
68   auto i0 = L.cbegin(), i1 = L.cend();
69   L.clear();
70   *i0; // expected-warning{{Invalidated iterator accessed}}
71 }
72 
73 void bad_clear1_vector(std::vector<int> &V) {
74   auto i0 = V.cbegin(), i1 = V.cend();
75   V.clear();
76   *i0; // expected-warning{{Invalidated iterator accessed}}
77 }
78 
79 void bad_clear1_vector_decr(std::vector<int> &V) {
80   auto i0 = V.cbegin(), i1 = V.cend();
81   V.clear();
82   --i1; // expected-warning{{Invalidated iterator accessed}}
83 }
84 
85 void bad_clear1_deque(std::deque<int> &D) {
86   auto i0 = D.cbegin(), i1 = D.cend();
87   D.clear();
88   *i0; // expected-warning{{Invalidated iterator accessed}}
89 }
90 
91 void bad_clear1_deque_decr(std::deque<int> &D) {
92   auto i0 = D.cbegin(), i1 = D.cend();
93   D.clear();
94   --i1; // expected-warning{{Invalidated iterator accessed}}
95 }
96 
97 void good_push_back1_list(std::list<int> &L, int n) {
98   auto i0 = L.cbegin(), i1 = L.cend();
99   L.push_back(n);
100   *i0; // no-warning
101   --i1; // no-warning
102 }
103 
104 void good_push_back1_vector(std::vector<int> &V, int n) {
105   auto i0 = V.cbegin(), i1 = V.cend();
106   V.push_back(n);
107   *i0; // no-warning
108 }
109 
110 void bad_push_back1_vector(std::vector<int> &V, int n) {
111   auto i0 = V.cbegin(), i1 = V.cend();
112   V.push_back(n);
113   --i1; // expected-warning{{Invalidated iterator accessed}}
114 }
115 
116 void bad_push_back1_deque(std::deque<int> &D, int n) {
117   auto i0 = D.cbegin(), i1 = D.cend();
118   D.push_back(n);
119   *i0; // expected-warning{{Invalidated iterator accessed}}
120 }
121 
122 void bad_push_back1_deque_decr(std::deque<int> &D, int n) {
123   auto i0 = D.cbegin(), i1 = D.cend();
124   D.push_back(n);
125   --i1; // expected-warning{{Invalidated iterator accessed}}
126 }
127 
128 void good_emplace_back1_list(std::list<int> &L, int n) {
129   auto i0 = L.cbegin(), i1 = L.cend();
130   L.emplace_back(n);
131   *i0; // no-warning
132   --i1; // no-warning
133 }
134 
135 void good_emplace_back1_vector(std::vector<int> &V, int n) {
136   auto i0 = V.cbegin(), i1 = V.cend();
137   V.emplace_back(n);
138   *i0; // no-warning
139 }
140 
141 void bad_emplace_back1_vector(std::vector<int> &V, int n) {
142   auto i0 = V.cbegin(), i1 = V.cend();
143   V.emplace_back(n);
144   --i1; // expected-warning{{Invalidated iterator accessed}}
145 }
146 
147 void bad_emplace_back1_deque(std::deque<int> &D, int n) {
148   auto i0 = D.cbegin(), i1 = D.cend();
149   D.emplace_back(n);
150   *i0; // expected-warning{{Invalidated iterator accessed}}
151 }
152 
153 void bad_emplace_back1_deque_decr(std::deque<int> &D, int n) {
154   auto i0 = D.cbegin(), i1 = D.cend();
155   D.emplace_back(n);
156   --i1; // expected-warning{{Invalidated iterator accessed}}
157 }
158 
159 void good_pop_back1_list(std::list<int> &L, int n) {
160   auto i0 = L.cbegin(), i1 = L.cend(), i2 = i1--;
161   L.pop_back();
162   *i0; // no-warning
163   *i2; // no-warning
164 }
165 
166 void bad_pop_back1_list(std::list<int> &L, int n) {
167   auto i0 = L.cbegin(), i1 = L.cend(), i2 = i1--;
168   L.pop_back();
169   *i1; // expected-warning{{Invalidated iterator accessed}}
170 }
171 
172 void good_pop_back1_vector(std::vector<int> &V, int n) {
173   auto i0 = V.cbegin(), i1 = V.cend(), i2 = i1--;
174   V.pop_back();
175   *i0; // no-warning
176 }
177 
178 void bad_pop_back1_vector(std::vector<int> &V, int n) {
179   auto i0 = V.cbegin(), i1 = V.cend(), i2 = i1--;
180   V.pop_back();
181   *i1; // expected-warning{{Invalidated iterator accessed}}
182 }
183 
184 void 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();
187   --i2; // expected-warning{{Invalidated iterator accessed}}
188 }
189 
190 void good_pop_back1_deque(std::deque<int> &D, int n) {
191   auto i0 = D.cbegin(), i1 = D.cend(), i2 = i1--;
192   D.pop_back();
193   *i0; // no-warning
194 }
195 
196 void bad_pop_back1_deque(std::deque<int> &D, int n) {
197   auto i0 = D.cbegin(), i1 = D.cend(), i2 = i1--;
198   D.pop_back();
199   *i1; // expected-warning{{Invalidated iterator accessed}}
200 }
201 
202 void 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();
205   --i2; // expected-warning{{Invalidated iterator accessed}}
206 }
207 
208 void good_push_front1_list(std::list<int> &L, int n) {
209   auto i0 = L.cbegin(), i1 = L.cend();
210   L.push_front(n);
211   *i0; // no-warning
212   --i1; // no-warning
213 }
214 
215 void bad_push_front1_deque(std::deque<int> &D, int n) {
216   auto i0 = D.cbegin(), i1 = D.cend();
217   D.push_front(n);
218   *i0; // expected-warning{{Invalidated iterator accessed}}
219 }
220 
221 void bad_push_front1_deque_decr(std::deque<int> &D, int n) {
222   auto i0 = D.cbegin(), i1 = D.cend();
223   D.push_front(n);
224   --i1; // expected-warning{{Invalidated iterator accessed}}
225 }
226 
227 void good_push_front1_forward_list(std::forward_list<int> &FL, int n) {
228   auto i0 = FL.cbegin(), i1 = FL.cend();
229   FL.push_front(n);
230   *i0; // no-warning
231 }
232 
233 void good_emplace_front1_list(std::list<int> &L, int n) {
234   auto i0 = L.cbegin(), i1 = L.cend();
235   L.emplace_front(n);
236   *i0; // no-warning
237   --i1; // no-warning
238 }
239 
240 void bad_emplace_front1_deque(std::deque<int> &D, int n) {
241   auto i0 = D.cbegin(), i1 = D.cend();
242   D.emplace_front(n);
243   *i0; // expected-warning{{Invalidated iterator accessed}}
244 }
245 
246 void bad_emplace_front1_deque_decr(std::deque<int> &D, int n) {
247   auto i0 = D.cbegin(), i1 = D.cend();
248   D.emplace_front(n);
249   --i1; // expected-warning{{Invalidated iterator accessed}}
250 }
251 
252 void good_emplace_front1_forward_list(std::forward_list<int> &FL, int n) {
253   auto i0 = FL.cbegin(), i1 = FL.cend();
254   FL.emplace_front(n);
255   *i0; // no-warning
256 }
257 
258 void good_pop_front1_list(std::list<int> &L, int n) {
259   auto i1 = L.cbegin(), i0 = i1++;
260   L.pop_front();
261   *i1; // no-warning
262 }
263 
264 void bad_pop_front1_list(std::list<int> &L, int n) {
265   auto i1 = L.cbegin(), i0 = i1++;
266   L.pop_front();
267   *i0; // expected-warning{{Invalidated iterator accessed}}
268 }
269 
270 void good_pop_front1_deque(std::deque<int> &D, int n) {
271   auto i1 = D.cbegin(), i0 = i1++;
272   D.pop_front();
273   *i1; // no-warning
274 }
275 
276 void bad_pop_front1_deque(std::deque<int> &D, int n) {
277   auto i1 = D.cbegin(), i0 = i1++;
278   D.pop_front();
279   *i0; // expected-warning{{Invalidated iterator accessed}}
280 }
281 
282 void good_pop_front1_forward_list(std::forward_list<int> &FL, int n) {
283   auto i1 = FL.cbegin(), i0 = i1++;
284   FL.pop_front();
285   *i1; // no-warning
286 }
287 
288 void bad_pop_front1_forward_list(std::forward_list<int> &FL, int n) {
289   auto i1 = FL.cbegin(), i0 = i1++;
290   FL.pop_front();
291   *i0; // expected-warning{{Invalidated iterator accessed}}
292 }
293 
294 void good_insert1_list1(std::list<int> &L, int n) {
295   auto i1 = L.cbegin(), i0 = i1++;
296   L.insert(i1, n);
297   *i0; // no-warning
298   *i1; // no-warning
299 }
300 
301 void 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 
307 void good_insert1_vector1(std::vector<int> &V, int n) {
308   auto i1 = V.cbegin(), i0 = i1++;
309   V.insert(i1, n);
310   *i0; // no-warning
311 }
312 
313 void 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 
319 void bad_insert1_vector(std::vector<int> &V, int n) {
320   auto i1 = V.cbegin(), i0 = i1++;
321   V.insert(i1, n);
322   *i1; // expected-warning{{Invalidated iterator accessed}}
323 }
324 
325 void 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 
331 void bad_insert1_deque1(std::deque<int> &D, int n) {
332   auto i1 = D.cbegin(), i0 = i1++;
333   D.insert(i1, n);
334   *i0; // expected-warning{{Invalidated iterator accessed}}
335 }
336 
337 void bad_insert1_deque2(std::deque<int> &D, int n) {
338   auto i1 = D.cbegin(), i0 = i1++;
339   D.insert(i1, n);
340   *i1; // expected-warning{{Invalidated iterator accessed}}
341 }
342 
343 void 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 
350 void 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 
356 void 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 
362 void 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 
368 void 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 
374 void 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 
380 void 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 
386 void 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 
392 void 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 
399 void 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 
405 void 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 
411 void 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 
417 void 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 
423 void 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 
429 void 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 
435 void 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 
441 void 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 
448 void 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 
454 void 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 
460 void 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 
466 void 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 
472 void 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 
478 void 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 
484 void 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 
490 void 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 
497 void 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 
503 void 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 
509 void 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 
515 void 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 
521 void 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 
527 void 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 
533 void 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 
539 void good_emplace1_list(std::list<int> &L, int n) {
540   auto i1 = L.cbegin(), i0 = i1++;
541   L.emplace(i1, n);
542   *i0; // no-warning
543   *i1; // no-warning
544 }
545 
546 void good_emplace1_vector(std::vector<int> &V, int n) {
547   auto i1 = V.cbegin(), i0 = i1++;
548   V.emplace(i1, n);
549   *i0; // no-warning
550 }
551 
552 void bad_emplace1_vector(std::vector<int> &V, int n) {
553   auto i1 = V.cbegin(), i0 = i1++;
554   V.emplace(i1, n);
555   *i1; // expected-warning{{Invalidated iterator accessed}}
556 }
557 
558 void bad_emplace1_deque1(std::deque<int> &D, int n) {
559   auto i1 = D.cbegin(), i0 = i1++;
560   D.emplace(i1, n);
561   *i0; // expected-warning{{Invalidated iterator accessed}}
562 }
563 
564 void bad_emplace1_deque2(std::deque<int> &D, int n) {
565   auto i1 = D.cbegin(), i0 = i1++;
566   D.emplace(i1, n);
567   *i1; // expected-warning{{Invalidated iterator accessed}}
568 }
569 
570 void good_erase1_list1(std::list<int> &L) {
571   auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
572   L.erase(i1);
573   *i0; // no-warning
574   *i2; // no-warning
575 }
576 
577 void good_erase1_list2(std::list<int> &L) {
578   auto i0 = L.cbegin();
579   i0 = L.erase(i0);
580   *i0; // no-warning
581 }
582 
583 void bad_erase1_list(std::list<int> &L) {
584   auto i0 = L.cbegin();
585   L.erase(i0);
586   *i0; // expected-warning{{Invalidated iterator accessed}}
587 }
588 
589 void good_erase1_vector1(std::vector<int> &V) {
590   auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
591   V.erase(i1);
592   *i0; // no-warning
593 }
594 
595 void good_erase1_vector2(std::vector<int> &V) {
596   auto i0 = V.cbegin();
597   i0 = V.erase(i0);
598   *i0; // no-warning
599 }
600 
601 void bad_erase1_vector1(std::vector<int> &V) {
602   auto i1 = V.cbegin(), i0 = i1++;
603   V.erase(i0);
604   *i0; // expected-warning{{Invalidated iterator accessed}}
605 }
606 
607 void bad_erase1_vector2(std::vector<int> &V) {
608   auto i1 = V.cbegin(), i0 = i1++;
609   V.erase(i0);
610   *i1; // expected-warning{{Invalidated iterator accessed}}
611 }
612 
613 void good_erase1_deque(std::deque<int> &D) {
614   auto i0 = D.cbegin();
615   i0 = D.erase(i0);
616   *i0; // no-warning
617 }
618 
619 void bad_erase1_deque1(std::deque<int> &D) {
620   auto i2 = D.cbegin(), i0 = i2++, i1 = i2++;
621   D.erase(i1);
622   *i0; // expected-warning{{Invalidated iterator accessed}}
623 }
624 
625 void bad_erase1_deque2(std::deque<int> &D) {
626   auto i2 = D.cbegin(), i0 = i2++, i1 = i2++;
627   D.erase(i1);
628   *i1; // expected-warning{{Invalidated iterator accessed}}
629 }
630 
631 void bad_erase1_deque3(std::deque<int> &D) {
632   auto i2 = D.cbegin(), i0 = i2++, i1 = i2++;
633   D.erase(i1);
634   *i2; // expected-warning{{Invalidated iterator accessed}}
635 }
636 
637 void good_erase2_list1(std::list<int> &L) {
638   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 
644 void 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 
650 void bad_erase2_list1(std::list<int> &L) {
651   auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
652   L.erase(i0, i2);
653   *i0; // expected-warning{{Invalidated iterator accessed}}
654 }
655 
656 void bad_erase2_list2(std::list<int> &L) {
657   auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
658   L.erase(i0, i2);
659   *i1; // expected-warning{{Invalidated iterator accessed}}
660 }
661 
662 void good_erase2_vector1(std::vector<int> &V) {
663   auto i3 = V.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;;
664   V.erase(i1, i3);
665   *i0; // no-warning
666 }
667 
668 void 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 
674 void bad_erase2_vector1(std::vector<int> &V) {
675   auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
676   V.erase(i0, i2);
677   *i0; // expected-warning{{Invalidated iterator accessed}}
678 }
679 
680 void bad_erase2_vector2(std::vector<int> &V) {
681   auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
682   V.erase(i0, i2);
683   *i1; // expected-warning{{Invalidated iterator accessed}}
684 }
685 
686 void bad_erase2_vector3(std::vector<int> &V) {
687   auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
688   V.erase(i0, i2);
689   *i2; // expected-warning{{Invalidated iterator accessed}}
690 }
691 
692 void 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 
698 void bad_erase2_deque1(std::deque<int> &D) {
699   auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
700   D.erase(i1, i3);
701   *i0; // expected-warning{{Invalidated iterator accessed}}
702 }
703 
704 void bad_erase2_deque2(std::deque<int> &D) {
705   auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
706   D.erase(i1, i3);
707   *i1; // expected-warning{{Invalidated iterator accessed}}
708 }
709 
710 void bad_erase2_deque3(std::deque<int> &D) {
711   auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
712   D.erase(i1, i3);
713   *i2; // expected-warning{{Invalidated iterator accessed}}
714 }
715 
716 void bad_erase2_deque4(std::deque<int> &D) {
717   auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
718   D.erase(i1, i3);
719   *i3; // expected-warning{{Invalidated iterator accessed}}
720 }
721 
722 void good_erase_after1_forward_list1(std::forward_list<int> &FL) {
723   auto i2 = FL.cbegin(), i0 = i2++, i1 = i2++;
724   FL.erase_after(i0);
725   *i0; // no-warning
726   *i2; // no-warning
727 }
728 
729 void 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 
735 void bad_erase_after1_forward_list(std::forward_list<int> &FL) {
736   auto i1 = FL.cbegin(), i0 = i1++;
737   FL.erase_after(i0);
738   *i1; // expected-warning{{Invalidated iterator accessed}}
739 }
740 
741 void good_erase_after2_forward_list1(std::forward_list<int> &FL) {
742   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 
748 void 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 
754 void bad_erase_after2_forward_list1(std::forward_list<int> &FL) {
755   auto i3 = FL.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
756   FL.erase_after(i0, i3);
757   *i1; // expected-warning{{Invalidated iterator accessed}}
758 }
759 
760 void 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);
763   *i2; // expected-warning{{Invalidated iterator accessed}}
764 }
765