121583b73SAdam Balogh // 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
221583b73SAdam Balogh // 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
32cfbe933SAdam Balogh 
42cfbe933SAdam Balogh #include "Inputs/system-header-simulator-cxx.h"
52cfbe933SAdam Balogh 
62cfbe933SAdam Balogh void bad_copy_assign_operator_list1(std::list<int> &L1,
72cfbe933SAdam Balogh                                     const std::list<int> &L2) {
82cfbe933SAdam Balogh   auto i0 = L1.cbegin();
92cfbe933SAdam Balogh   L1 = L2;
102cfbe933SAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
112cfbe933SAdam Balogh }
122cfbe933SAdam Balogh 
132cfbe933SAdam Balogh void bad_copy_assign_operator_vector1(std::vector<int> &V1,
142cfbe933SAdam Balogh                                       const std::vector<int> &V2) {
152cfbe933SAdam Balogh   auto i0 = V1.cbegin();
162cfbe933SAdam Balogh   V1 = V2;
172cfbe933SAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
182cfbe933SAdam Balogh }
192cfbe933SAdam Balogh 
202cfbe933SAdam Balogh void bad_copy_assign_operator_deque1(std::deque<int> &D1,
212cfbe933SAdam Balogh                                      const std::deque<int> &D2) {
222cfbe933SAdam Balogh   auto i0 = D1.cbegin();
232cfbe933SAdam Balogh   D1 = D2;
242cfbe933SAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
252cfbe933SAdam Balogh }
262cfbe933SAdam Balogh 
272cfbe933SAdam Balogh void bad_copy_assign_operator_forward_list1(std::forward_list<int> &FL1,
282cfbe933SAdam Balogh                                             const std::forward_list<int> &FL2) {
292cfbe933SAdam Balogh   auto i0 = FL1.cbegin();
302cfbe933SAdam Balogh   FL1 = FL2;
312cfbe933SAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
322cfbe933SAdam Balogh }
339a48ba6bSAdam Balogh 
34*2e7cb34dSAdam Balogh void bad_assign_list1(std::list<int> &L, int n) {
35*2e7cb34dSAdam Balogh   auto i0 = L.cbegin();
36*2e7cb34dSAdam Balogh   L.assign(10, n);
37*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
38*2e7cb34dSAdam Balogh }
39*2e7cb34dSAdam Balogh 
40*2e7cb34dSAdam Balogh void bad_assign_vector1(std::vector<int> &V, int n) {
41*2e7cb34dSAdam Balogh   auto i0 = V.cbegin();
42*2e7cb34dSAdam Balogh   V.assign(10, n);
43*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
44*2e7cb34dSAdam Balogh }
45*2e7cb34dSAdam Balogh 
46*2e7cb34dSAdam Balogh void bad_assign_deque1(std::deque<int> &D, int n) {
47*2e7cb34dSAdam Balogh   auto i0 = D.cbegin();
48*2e7cb34dSAdam Balogh   D.assign(10, n);
49*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
50*2e7cb34dSAdam Balogh }
51*2e7cb34dSAdam Balogh 
52*2e7cb34dSAdam Balogh void bad_assign_forward_list1(std::forward_list<int> &FL, int n) {
53*2e7cb34dSAdam Balogh   auto i0 = FL.cbegin();
54*2e7cb34dSAdam Balogh   FL.assign(10, n);
55*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
56*2e7cb34dSAdam Balogh }
57*2e7cb34dSAdam Balogh 
58*2e7cb34dSAdam Balogh void good_clear_list1(std::list<int> &L) {
59*2e7cb34dSAdam Balogh   auto i0 = L.cend();
60*2e7cb34dSAdam Balogh   L.clear();
61*2e7cb34dSAdam Balogh   --i0; // no-warning
62*2e7cb34dSAdam Balogh }
63*2e7cb34dSAdam Balogh 
64*2e7cb34dSAdam Balogh void bad_clear_list1(std::list<int> &L) {
65*2e7cb34dSAdam Balogh   auto i0 = L.cbegin(), i1 = L.cend();
66*2e7cb34dSAdam Balogh   L.clear();
67*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
68*2e7cb34dSAdam Balogh }
69*2e7cb34dSAdam Balogh 
70*2e7cb34dSAdam Balogh void bad_clear_vector1(std::vector<int> &V) {
71*2e7cb34dSAdam Balogh   auto i0 = V.cbegin(), i1 = V.cend();
72*2e7cb34dSAdam Balogh   V.clear();
73*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
74*2e7cb34dSAdam Balogh   --i1; // expected-warning{{Invalidated iterator accessed}}
75*2e7cb34dSAdam Balogh }
76*2e7cb34dSAdam Balogh 
77*2e7cb34dSAdam Balogh void bad_clear_deque1(std::deque<int> &D) {
78*2e7cb34dSAdam Balogh   auto i0 = D.cbegin(), i1 = D.cend();
79*2e7cb34dSAdam Balogh   D.clear();
80*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
81*2e7cb34dSAdam Balogh   --i1; // expected-warning{{Invalidated iterator accessed}}
82*2e7cb34dSAdam Balogh }
83*2e7cb34dSAdam Balogh 
849a48ba6bSAdam Balogh void good_push_back_list1(std::list<int> &L, int n) {
859a48ba6bSAdam Balogh   auto i0 = L.cbegin(), i1 = L.cend();
869a48ba6bSAdam Balogh   L.push_back(n);
879a48ba6bSAdam Balogh   *i0; // no-warning
889a48ba6bSAdam Balogh   --i1; // no-warning
899a48ba6bSAdam Balogh }
909a48ba6bSAdam Balogh 
919a48ba6bSAdam Balogh void good_push_back_vector1(std::vector<int> &V, int n) {
929a48ba6bSAdam Balogh   auto i0 = V.cbegin(), i1 = V.cend();
939a48ba6bSAdam Balogh   V.push_back(n);
949a48ba6bSAdam Balogh   *i0; // no-warning
959a48ba6bSAdam Balogh }
969a48ba6bSAdam Balogh 
979a48ba6bSAdam Balogh void bad_push_back_vector1(std::vector<int> &V, int n) {
989a48ba6bSAdam Balogh   auto i0 = V.cbegin(), i1 = V.cend();
999a48ba6bSAdam Balogh   V.push_back(n);
1009a48ba6bSAdam Balogh   --i1; // expected-warning{{Invalidated iterator accessed}}
1019a48ba6bSAdam Balogh }
1029a48ba6bSAdam Balogh 
1039a48ba6bSAdam Balogh void bad_push_back_deque1(std::deque<int> &D, int n) {
1049a48ba6bSAdam Balogh   auto i0 = D.cbegin(), i1 = D.cend();
1059a48ba6bSAdam Balogh   D.push_back(n);
1069a48ba6bSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
1079a48ba6bSAdam Balogh   --i1; // expected-warning{{Invalidated iterator accessed}}
1089a48ba6bSAdam Balogh }
1099a48ba6bSAdam Balogh 
1109a48ba6bSAdam Balogh void good_emplace_back_list1(std::list<int> &L, int n) {
1119a48ba6bSAdam Balogh   auto i0 = L.cbegin(), i1 = L.cend();
1129a48ba6bSAdam Balogh   L.emplace_back(n);
1139a48ba6bSAdam Balogh   *i0; // no-warning
1149a48ba6bSAdam Balogh   --i1; // no-warning
1159a48ba6bSAdam Balogh }
1169a48ba6bSAdam Balogh 
1179a48ba6bSAdam Balogh void good_emplace_back_vector1(std::vector<int> &V, int n) {
1189a48ba6bSAdam Balogh   auto i0 = V.cbegin(), i1 = V.cend();
1199a48ba6bSAdam Balogh   V.emplace_back(n);
1209a48ba6bSAdam Balogh   *i0; // no-warning
1219a48ba6bSAdam Balogh }
1229a48ba6bSAdam Balogh 
1239a48ba6bSAdam Balogh void bad_emplace_back_vector1(std::vector<int> &V, int n) {
1249a48ba6bSAdam Balogh   auto i0 = V.cbegin(), i1 = V.cend();
1259a48ba6bSAdam Balogh   V.emplace_back(n);
1269a48ba6bSAdam Balogh   --i1; // expected-warning{{Invalidated iterator accessed}}
1279a48ba6bSAdam Balogh }
1289a48ba6bSAdam Balogh 
1299a48ba6bSAdam Balogh void bad_emplace_back_deque1(std::deque<int> &D, int n) {
1309a48ba6bSAdam Balogh   auto i0 = D.cbegin(), i1 = D.cend();
1319a48ba6bSAdam Balogh   D.emplace_back(n);
1329a48ba6bSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
1339a48ba6bSAdam Balogh   --i1; // expected-warning{{Invalidated iterator accessed}}
1349a48ba6bSAdam Balogh }
1359a48ba6bSAdam Balogh 
1369a48ba6bSAdam Balogh void good_pop_back_list1(std::list<int> &L, int n) {
1379a48ba6bSAdam Balogh   auto i0 = L.cbegin(), i1 = L.cend(), i2 = i1--;
1389a48ba6bSAdam Balogh   L.pop_back();
1399a48ba6bSAdam Balogh   *i0; // no-warning
1409a48ba6bSAdam Balogh   *i2; // no-warning
1419a48ba6bSAdam Balogh }
1429a48ba6bSAdam Balogh 
1439a48ba6bSAdam Balogh void bad_pop_back_list1(std::list<int> &L, int n) {
1449a48ba6bSAdam Balogh   auto i0 = L.cbegin(), i1 = L.cend(), i2 = i1--;
1459a48ba6bSAdam Balogh   L.pop_back();
1469a48ba6bSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
1479a48ba6bSAdam Balogh }
1489a48ba6bSAdam Balogh 
1499a48ba6bSAdam Balogh void good_pop_back_vector1(std::vector<int> &V, int n) {
1509a48ba6bSAdam Balogh   auto i0 = V.cbegin(), i1 = V.cend(), i2 = i1--;
1519a48ba6bSAdam Balogh   V.pop_back();
1529a48ba6bSAdam Balogh   *i0; // no-warning
1539a48ba6bSAdam Balogh }
1549a48ba6bSAdam Balogh 
1559a48ba6bSAdam Balogh void bad_pop_back_vector1(std::vector<int> &V, int n) {
1569a48ba6bSAdam Balogh   auto i0 = V.cbegin(), i1 = V.cend(), i2 = i1--;
1579a48ba6bSAdam Balogh   V.pop_back();
1589a48ba6bSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
1599a48ba6bSAdam Balogh   --i2; // expected-warning{{Invalidated iterator accessed}}
1609a48ba6bSAdam Balogh }
1619a48ba6bSAdam Balogh 
1629a48ba6bSAdam Balogh void good_pop_back_deque1(std::deque<int> &D, int n) {
1639a48ba6bSAdam Balogh   auto i0 = D.cbegin(), i1 = D.cend(), i2 = i1--;
1649a48ba6bSAdam Balogh   D.pop_back();
1659a48ba6bSAdam Balogh   *i0; // no-warning
1669a48ba6bSAdam Balogh }
1679a48ba6bSAdam Balogh 
1689a48ba6bSAdam Balogh void bad_pop_back_deque1(std::deque<int> &D, int n) {
1699a48ba6bSAdam Balogh   auto i0 = D.cbegin(), i1 = D.cend(), i2 = i1--;
1709a48ba6bSAdam Balogh   D.pop_back();
1719a48ba6bSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
1729a48ba6bSAdam Balogh   --i2; // expected-warning{{Invalidated iterator accessed}}
1739a48ba6bSAdam Balogh }
1749a48ba6bSAdam Balogh 
1759a48ba6bSAdam Balogh void good_push_front_list1(std::list<int> &L, int n) {
1769a48ba6bSAdam Balogh   auto i0 = L.cbegin(), i1 = L.cend();
1779a48ba6bSAdam Balogh   L.push_front(n);
1789a48ba6bSAdam Balogh   *i0; // no-warning
1799a48ba6bSAdam Balogh   --i1; // no-warning
1809a48ba6bSAdam Balogh }
1819a48ba6bSAdam Balogh 
1829a48ba6bSAdam Balogh void bad_push_front_deque1(std::deque<int> &D, int n) {
1839a48ba6bSAdam Balogh   auto i0 = D.cbegin(), i1 = D.cend();
1849a48ba6bSAdam Balogh   D.push_front(n);
1859a48ba6bSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
1869a48ba6bSAdam Balogh   --i1; // expected-warning{{Invalidated iterator accessed}}
1879a48ba6bSAdam Balogh }
1889a48ba6bSAdam Balogh 
1899a48ba6bSAdam Balogh void good_push_front_forward_list1(std::forward_list<int> &FL, int n) {
1909a48ba6bSAdam Balogh   auto i0 = FL.cbegin(), i1 = FL.cend();
1919a48ba6bSAdam Balogh   FL.push_front(n);
1929a48ba6bSAdam Balogh   *i0; // no-warning
1939a48ba6bSAdam Balogh }
1949a48ba6bSAdam Balogh 
1959a48ba6bSAdam Balogh void good_emplace_front_list1(std::list<int> &L, int n) {
1969a48ba6bSAdam Balogh   auto i0 = L.cbegin(), i1 = L.cend();
1979a48ba6bSAdam Balogh   L.emplace_front(n);
1989a48ba6bSAdam Balogh   *i0; // no-warning
1999a48ba6bSAdam Balogh   --i1; // no-warning
2009a48ba6bSAdam Balogh }
2019a48ba6bSAdam Balogh 
2029a48ba6bSAdam Balogh void bad_emplace_front_deque1(std::deque<int> &D, int n) {
2039a48ba6bSAdam Balogh   auto i0 = D.cbegin(), i1 = D.cend();
2049a48ba6bSAdam Balogh   D.emplace_front(n);
2059a48ba6bSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
2069a48ba6bSAdam Balogh   --i1; // expected-warning{{Invalidated iterator accessed}}
2079a48ba6bSAdam Balogh }
2089a48ba6bSAdam Balogh 
2099a48ba6bSAdam Balogh void good_emplace_front_forward_list1(std::forward_list<int> &FL, int n) {
2109a48ba6bSAdam Balogh   auto i0 = FL.cbegin(), i1 = FL.cend();
2119a48ba6bSAdam Balogh   FL.emplace_front(n);
2129a48ba6bSAdam Balogh   *i0; // no-warning
2139a48ba6bSAdam Balogh }
2149a48ba6bSAdam Balogh 
2159a48ba6bSAdam Balogh void good_pop_front_list1(std::list<int> &L, int n) {
2169a48ba6bSAdam Balogh   auto i1 = L.cbegin(), i0 = i1++;
2179a48ba6bSAdam Balogh   L.pop_front();
2189a48ba6bSAdam Balogh   *i1; // no-warning
2199a48ba6bSAdam Balogh }
2209a48ba6bSAdam Balogh 
2219a48ba6bSAdam Balogh void bad_pop_front_list1(std::list<int> &L, int n) {
2229a48ba6bSAdam Balogh   auto i1 = L.cbegin(), i0 = i1++;
2239a48ba6bSAdam Balogh   L.pop_front();
2249a48ba6bSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
2259a48ba6bSAdam Balogh }
2269a48ba6bSAdam Balogh 
2279a48ba6bSAdam Balogh void good_pop_front_deque1(std::deque<int> &D, int n) {
2289a48ba6bSAdam Balogh   auto i1 = D.cbegin(), i0 = i1++;
2299a48ba6bSAdam Balogh   D.pop_front();
2309a48ba6bSAdam Balogh   *i1; // no-warning
2319a48ba6bSAdam Balogh }
2329a48ba6bSAdam Balogh 
2339a48ba6bSAdam Balogh void bad_pop_front_deque1(std::deque<int> &D, int n) {
2349a48ba6bSAdam Balogh   auto i1 = D.cbegin(), i0 = i1++;
2359a48ba6bSAdam Balogh   D.pop_front();
2369a48ba6bSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
2379a48ba6bSAdam Balogh }
2389a48ba6bSAdam Balogh 
2399a48ba6bSAdam Balogh void good_pop_front_forward_list1(std::forward_list<int> &FL, int n) {
2409a48ba6bSAdam Balogh   auto i1 = FL.cbegin(), i0 = i1++;
2419a48ba6bSAdam Balogh   FL.pop_front();
2429a48ba6bSAdam Balogh   *i1; // no-warning
2439a48ba6bSAdam Balogh }
2449a48ba6bSAdam Balogh 
2459a48ba6bSAdam Balogh void bad_pop_front_forward_list1(std::forward_list<int> &FL, int n) {
2469a48ba6bSAdam Balogh   auto i1 = FL.cbegin(), i0 = i1++;
2479a48ba6bSAdam Balogh   FL.pop_front();
2489a48ba6bSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
2499a48ba6bSAdam Balogh }
250*2e7cb34dSAdam Balogh 
251*2e7cb34dSAdam Balogh void good_insert_list1(std::list<int> &L, int n) {
252*2e7cb34dSAdam Balogh   auto i1 = L.cbegin(), i0 = i1++;
253*2e7cb34dSAdam Balogh   L.insert(i1, n);
254*2e7cb34dSAdam Balogh   *i0; // no-warning
255*2e7cb34dSAdam Balogh   *i1; // no-warning
256*2e7cb34dSAdam Balogh }
257*2e7cb34dSAdam Balogh 
258*2e7cb34dSAdam Balogh void good_insert_vector1(std::vector<int> &V, int n) {
259*2e7cb34dSAdam Balogh   auto i1 = V.cbegin(), i0 = i1++;
260*2e7cb34dSAdam Balogh   V.insert(i1, n);
261*2e7cb34dSAdam Balogh   *i0; // no-warning
262*2e7cb34dSAdam Balogh }
263*2e7cb34dSAdam Balogh 
264*2e7cb34dSAdam Balogh void bad_insert_vector1(std::vector<int> &V, int n) {
265*2e7cb34dSAdam Balogh   auto i1 = V.cbegin(), i0 = i1++;
266*2e7cb34dSAdam Balogh   V.insert(i1, n);
267*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
268*2e7cb34dSAdam Balogh }
269*2e7cb34dSAdam Balogh 
270*2e7cb34dSAdam Balogh void bad_insert_deque1(std::deque<int> &D, int n) {
271*2e7cb34dSAdam Balogh   auto i1 = D.cbegin(), i0 = i1++;
272*2e7cb34dSAdam Balogh   D.insert(i1, n);
273*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
274*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
275*2e7cb34dSAdam Balogh }
276*2e7cb34dSAdam Balogh 
277*2e7cb34dSAdam Balogh void good_emplace_list1(std::list<int> &L, int n) {
278*2e7cb34dSAdam Balogh   auto i1 = L.cbegin(), i0 = i1++;
279*2e7cb34dSAdam Balogh   L.emplace(i1, n);
280*2e7cb34dSAdam Balogh   *i0; // no-warning
281*2e7cb34dSAdam Balogh   *i1; // no-warning
282*2e7cb34dSAdam Balogh }
283*2e7cb34dSAdam Balogh 
284*2e7cb34dSAdam Balogh void good_emplace_vector1(std::vector<int> &V, int n) {
285*2e7cb34dSAdam Balogh   auto i1 = V.cbegin(), i0 = i1++;
286*2e7cb34dSAdam Balogh   V.emplace(i1, n);
287*2e7cb34dSAdam Balogh   *i0; // no-warning
288*2e7cb34dSAdam Balogh }
289*2e7cb34dSAdam Balogh 
290*2e7cb34dSAdam Balogh void bad_emplace_vector1(std::vector<int> &V, int n) {
291*2e7cb34dSAdam Balogh   auto i1 = V.cbegin(), i0 = i1++;
292*2e7cb34dSAdam Balogh   V.emplace(i1, n);
293*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
294*2e7cb34dSAdam Balogh }
295*2e7cb34dSAdam Balogh 
296*2e7cb34dSAdam Balogh void bad_emplace_deque1(std::deque<int> &D, int n) {
297*2e7cb34dSAdam Balogh   auto i1 = D.cbegin(), i0 = i1++;
298*2e7cb34dSAdam Balogh   D.emplace(i1, n);
299*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
300*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
301*2e7cb34dSAdam Balogh }
302*2e7cb34dSAdam Balogh 
303*2e7cb34dSAdam Balogh void good_erase_list1(std::list<int> &L) {
304*2e7cb34dSAdam Balogh   auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
305*2e7cb34dSAdam Balogh   L.erase(i1);
306*2e7cb34dSAdam Balogh   *i0; // no-warning
307*2e7cb34dSAdam Balogh   *i2; // no-warning
308*2e7cb34dSAdam Balogh }
309*2e7cb34dSAdam Balogh 
310*2e7cb34dSAdam Balogh void bad_erase_list1(std::list<int> &L) {
311*2e7cb34dSAdam Balogh   auto i0 = L.cbegin();
312*2e7cb34dSAdam Balogh   L.erase(i0);
313*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
314*2e7cb34dSAdam Balogh }
315*2e7cb34dSAdam Balogh 
316*2e7cb34dSAdam Balogh void good_erase_vector1(std::vector<int> &V) {
317*2e7cb34dSAdam Balogh   auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
318*2e7cb34dSAdam Balogh   V.erase(i1);
319*2e7cb34dSAdam Balogh   *i0; // no-warning
320*2e7cb34dSAdam Balogh }
321*2e7cb34dSAdam Balogh 
322*2e7cb34dSAdam Balogh void bad_erase_vector1(std::vector<int> &V) {
323*2e7cb34dSAdam Balogh   auto i1 = V.cbegin(), i0 = i1++;
324*2e7cb34dSAdam Balogh   V.erase(i0);
325*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
326*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
327*2e7cb34dSAdam Balogh }
328*2e7cb34dSAdam Balogh 
329*2e7cb34dSAdam Balogh void bad_erase_deque1(std::deque<int> &D) {
330*2e7cb34dSAdam Balogh   auto i2 = D.cbegin(), i0 = i2++, i1 = i2++;
331*2e7cb34dSAdam Balogh   D.erase(i1);
332*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
333*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
334*2e7cb34dSAdam Balogh   *i2; // expected-warning{{Invalidated iterator accessed}}
335*2e7cb34dSAdam Balogh }
336*2e7cb34dSAdam Balogh 
337*2e7cb34dSAdam Balogh void good_erase_list2(std::list<int> &L) {
338*2e7cb34dSAdam Balogh   auto i3 = L.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
339*2e7cb34dSAdam Balogh   L.erase(i1, i3);
340*2e7cb34dSAdam Balogh   *i0; // no-warning
341*2e7cb34dSAdam Balogh   *i3; // no-warning
342*2e7cb34dSAdam Balogh }
343*2e7cb34dSAdam Balogh 
344*2e7cb34dSAdam Balogh void bad_erase_list2(std::list<int> &L) {
345*2e7cb34dSAdam Balogh   auto i2 = L.cbegin(), i0 = i2++, i1 = i2++;
346*2e7cb34dSAdam Balogh   L.erase(i0, i2);
347*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
348*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
349*2e7cb34dSAdam Balogh }
350*2e7cb34dSAdam Balogh 
351*2e7cb34dSAdam Balogh void good_erase_vector2(std::vector<int> &V) {
352*2e7cb34dSAdam Balogh   auto i3 = V.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;;
353*2e7cb34dSAdam Balogh   V.erase(i1, i3);
354*2e7cb34dSAdam Balogh   *i0; // no-warning
355*2e7cb34dSAdam Balogh }
356*2e7cb34dSAdam Balogh 
357*2e7cb34dSAdam Balogh void bad_erase_vector2(std::vector<int> &V) {
358*2e7cb34dSAdam Balogh   auto i2 = V.cbegin(), i0 = i2++, i1 = i2++;
359*2e7cb34dSAdam Balogh   V.erase(i0, i2);
360*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
361*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
362*2e7cb34dSAdam Balogh   *i2; // expected-warning{{Invalidated iterator accessed}}
363*2e7cb34dSAdam Balogh }
364*2e7cb34dSAdam Balogh 
365*2e7cb34dSAdam Balogh void bad_erase_deque2(std::deque<int> &D) {
366*2e7cb34dSAdam Balogh   auto i3 = D.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
367*2e7cb34dSAdam Balogh   D.erase(i1, i3);
368*2e7cb34dSAdam Balogh   *i0; // expected-warning{{Invalidated iterator accessed}}
369*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
370*2e7cb34dSAdam Balogh   *i2; // expected-warning{{Invalidated iterator accessed}}
371*2e7cb34dSAdam Balogh   *i3; // expected-warning{{Invalidated iterator accessed}}
372*2e7cb34dSAdam Balogh }
373*2e7cb34dSAdam Balogh 
374*2e7cb34dSAdam Balogh void good_erase_after_forward_list1(std::forward_list<int> &FL) {
375*2e7cb34dSAdam Balogh   auto i2 = FL.cbegin(), i0 = i2++, i1 = i2++;
376*2e7cb34dSAdam Balogh   FL.erase_after(i0);
377*2e7cb34dSAdam Balogh   *i0; // no-warning
378*2e7cb34dSAdam Balogh   *i2; // no-warning
379*2e7cb34dSAdam Balogh }
380*2e7cb34dSAdam Balogh 
381*2e7cb34dSAdam Balogh void bad_erase_after_forward_list1(std::forward_list<int> &FL) {
382*2e7cb34dSAdam Balogh   auto i1 = FL.cbegin(), i0 = i1++;
383*2e7cb34dSAdam Balogh   FL.erase_after(i0);
384*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
385*2e7cb34dSAdam Balogh }
386*2e7cb34dSAdam Balogh 
387*2e7cb34dSAdam Balogh void good_erase_after_forward_list2(std::forward_list<int> &FL) {
388*2e7cb34dSAdam Balogh   auto i3 = FL.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
389*2e7cb34dSAdam Balogh   FL.erase_after(i0, i3);
390*2e7cb34dSAdam Balogh   *i0; // no-warning
391*2e7cb34dSAdam Balogh   *i3; // no-warning
392*2e7cb34dSAdam Balogh }
393*2e7cb34dSAdam Balogh 
394*2e7cb34dSAdam Balogh void bad_erase_after_forward_list2(std::forward_list<int> &FL) {
395*2e7cb34dSAdam Balogh   auto i3 = FL.cbegin(), i0 = i3++, i1 = i3++, i2 = i3++;
396*2e7cb34dSAdam Balogh   FL.erase_after(i0, i3);
397*2e7cb34dSAdam Balogh   *i1; // expected-warning{{Invalidated iterator accessed}}
398*2e7cb34dSAdam Balogh   *i2; // expected-warning{{Invalidated iterator accessed}}
399*2e7cb34dSAdam Balogh }
400