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