1 // RUN: %clang_analyze_cc1 -std=c++17 %s\ 2 // RUN: -analyzer-checker=core,cplusplus,alpha.cplusplus.STLAlgorithmModeling,debug.DebugIteratorModeling,debug.ExprInspection\ 3 // RUN: -analyzer-config aggressive-binary-operation-simplification=true\ 4 // RUN: -analyzer-config alpha.cplusplus.STLAlgorithmModeling:AggressiveStdFindModeling=true\ 5 // RUN: -verify 6 7 #include "Inputs/system-header-simulator-cxx.h" 8 9 void clang_analyzer_eval(bool); 10 11 template <typename Iterator> 12 long clang_analyzer_iterator_position(const Iterator&); 13 14 template <typename Iter> Iter return_any_iterator(const Iter &It); 15 16 void test_find1(std::vector<int> V, int n) { 17 const auto i1 = return_any_iterator(V.begin()); 18 const auto i2 = return_any_iterator(V.begin()); 19 20 const auto i3 = std::find(i1, i2, n); 21 22 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 23 24 if (i3 != i2) { 25 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 26 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 27 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 28 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 29 30 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 31 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 32 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 33 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 34 } 35 } 36 37 void test_find2(std::vector<int> V, int n) { 38 const auto i1 = return_any_iterator(V.begin()); 39 const auto i2 = return_any_iterator(V.begin()); 40 41 const auto i3 = std::find(std::execution::sequenced_policy(), i1, i2, n); 42 43 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 44 45 if (i3 != i2) { 46 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 47 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 48 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 49 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 50 51 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 52 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 53 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 54 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 55 } 56 } 57 58 bool odd(int i) { return i % 2; } 59 60 void test_find_if1(std::vector<int> V) { 61 const auto i1 = return_any_iterator(V.begin()); 62 const auto i2 = return_any_iterator(V.begin()); 63 64 const auto i3 = std::find_if(i1, i2, odd); 65 66 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 67 68 if (i3 != i2) { 69 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 70 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 71 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 72 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 73 74 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 75 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 76 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 77 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 78 } 79 } 80 81 void test_find_if2(std::vector<int> V) { 82 const auto i1 = return_any_iterator(V.begin()); 83 const auto i2 = return_any_iterator(V.begin()); 84 85 const auto i3 = std::find_if(std::execution::sequenced_policy(), i1, i2, odd); 86 87 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 88 89 if (i3 != i2) { 90 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 91 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 92 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 93 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 94 95 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 96 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 97 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 98 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 99 } 100 } 101 102 void test_find_if_not1(std::vector<int> V) { 103 const auto i1 = return_any_iterator(V.begin()); 104 const auto i2 = return_any_iterator(V.begin()); 105 106 const auto i3 = std::find_if_not(i1, i2, odd); 107 108 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 109 110 if (i3 != i2) { 111 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 112 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 113 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 114 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 115 116 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 117 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 118 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 119 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 120 } 121 } 122 123 void test_find_if_not2(std::vector<int> V) { 124 const auto i1 = return_any_iterator(V.begin()); 125 const auto i2 = return_any_iterator(V.begin()); 126 127 const auto i3 = std::find_if_not(std::execution::sequenced_policy(), i1, i2, 128 odd); 129 130 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 131 132 if (i3 != i2) { 133 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 134 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 135 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 136 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 137 138 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 139 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 140 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 141 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 142 } 143 } 144 145 void test_find_first_of1(std::vector<int> V1, std::vector<int> V2) { 146 const auto i1 = return_any_iterator(V1.begin()); 147 const auto i2 = return_any_iterator(V1.begin()); 148 const auto i3 = return_any_iterator(V2.begin()); 149 const auto i4 = return_any_iterator(V2.begin()); 150 151 const auto i5 = std::find_first_of(i1, i2, i3, i4); 152 153 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 154 155 if (i5 != i2) { 156 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 157 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 158 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 159 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 160 161 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 162 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 163 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 164 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 165 } 166 } 167 168 void test_find_first_of2(std::vector<int> V1, std::vector<int> V2) { 169 const auto i1 = return_any_iterator(V1.begin()); 170 const auto i2 = return_any_iterator(V1.begin()); 171 const auto i3 = return_any_iterator(V2.begin()); 172 const auto i4 = return_any_iterator(V2.begin()); 173 174 const auto i5 = std::find_first_of(std::execution::sequenced_policy(), 175 i1, i2, i3, i4); 176 177 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 178 179 if (i5 != i2) { 180 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 181 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 182 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 183 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 184 185 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 186 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 187 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 188 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 189 } 190 } 191 192 void test_find_first_of3(std::vector<int> V1, std::vector<int> V2) { 193 const auto i1 = return_any_iterator(V1.begin()); 194 const auto i2 = return_any_iterator(V1.begin()); 195 const auto i3 = return_any_iterator(V2.begin()); 196 const auto i4 = return_any_iterator(V2.begin()); 197 198 const auto i5 = std::find_first_of(i1, i2, i3, i4, odd); 199 200 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 201 202 if (i5 != i2) { 203 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 204 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 205 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 206 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 207 208 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 209 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 210 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 211 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 212 } 213 } 214 215 void test_find_first_of4(std::vector<int> V1, std::vector<int> V2) { 216 const auto i1 = return_any_iterator(V1.begin()); 217 const auto i2 = return_any_iterator(V1.begin()); 218 const auto i3 = return_any_iterator(V2.begin()); 219 const auto i4 = return_any_iterator(V2.begin()); 220 221 const auto i5 = std::find_first_of(std::execution::sequenced_policy(), 222 i1, i2, i3, i4, odd); 223 224 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 225 226 if (i5 != i2) { 227 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 228 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 229 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 230 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 231 232 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 233 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 234 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 235 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 236 } 237 } 238 239 void test_find_end1(std::vector<int> V1, std::vector<int> V2) { 240 const auto i1 = return_any_iterator(V1.begin()); 241 const auto i2 = return_any_iterator(V1.begin()); 242 const auto i3 = return_any_iterator(V2.begin()); 243 const auto i4 = return_any_iterator(V2.begin()); 244 245 const auto i5 = std::find_end(i1, i2, i3, i4); 246 247 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 248 249 if (i5 != i2) { 250 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 251 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 252 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 253 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 254 255 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 256 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 257 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 258 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 259 } 260 } 261 262 void test_find_end2(std::vector<int> V1, std::vector<int> V2) { 263 const auto i1 = return_any_iterator(V1.begin()); 264 const auto i2 = return_any_iterator(V1.begin()); 265 const auto i3 = return_any_iterator(V2.begin()); 266 const auto i4 = return_any_iterator(V2.begin()); 267 268 const auto i5 = std::find_end(std::execution::sequenced_policy(), 269 i1, i2, i3, i4); 270 271 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 272 273 if (i5 != i2) { 274 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 275 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 276 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 277 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 278 279 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 280 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 281 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 282 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 283 } 284 } 285 286 void test_find_end3(std::vector<int> V1, std::vector<int> V2) { 287 const auto i1 = return_any_iterator(V1.begin()); 288 const auto i2 = return_any_iterator(V1.begin()); 289 const auto i3 = return_any_iterator(V2.begin()); 290 const auto i4 = return_any_iterator(V2.begin()); 291 292 const auto i5 = std::find_end(i1, i2, i3, i4, odd); 293 294 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 295 296 if (i5 != i2) { 297 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 298 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 299 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 300 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 301 302 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 303 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 304 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 305 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 306 } 307 } 308 309 void test_find_end4(std::vector<int> V1, std::vector<int> V2) { 310 const auto i1 = return_any_iterator(V1.begin()); 311 const auto i2 = return_any_iterator(V1.begin()); 312 const auto i3 = return_any_iterator(V2.begin()); 313 const auto i4 = return_any_iterator(V2.begin()); 314 315 const auto i5 = std::find_end(std::execution::sequenced_policy(), 316 i1, i2, i3, i4, odd); 317 318 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 319 320 if (i5 != i2) { 321 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 322 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 323 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 324 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 325 326 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 327 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 328 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 329 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 330 } 331 } 332 333 bool compare(int, int); 334 335 void test_lower_bound1(std::vector<int> V, int n) { 336 const auto i1 = return_any_iterator(V.begin()); 337 const auto i2 = return_any_iterator(V.begin()); 338 339 const auto i3 = std::lower_bound(i1, i2, n); 340 341 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 342 343 if (i3 != i2) { 344 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 345 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 346 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 347 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 348 349 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 350 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 351 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 352 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 353 } 354 } 355 356 void test_lower_bound2(std::vector<int> V, int n) { 357 const auto i1 = return_any_iterator(V.begin()); 358 const auto i2 = return_any_iterator(V.begin()); 359 360 const auto i3 = std::lower_bound(i1, i2, n, compare); 361 362 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 363 364 if (i3 != i2) { 365 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 366 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 367 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 368 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 369 370 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 371 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 372 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 373 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 374 } 375 } 376 377 void test_upper_bound1(std::vector<int> V, int n) { 378 const auto i1 = return_any_iterator(V.begin()); 379 const auto i2 = return_any_iterator(V.begin()); 380 381 const auto i3 = std::upper_bound(i1, i2, n); 382 383 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 384 385 if (i3 != i2) { 386 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 387 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 388 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 389 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 390 391 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 392 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 393 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 394 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 395 } 396 } 397 398 void test_upper_bound2(std::vector<int> V, int n) { 399 const auto i1 = return_any_iterator(V.begin()); 400 const auto i2 = return_any_iterator(V.begin()); 401 402 const auto i3 = std::upper_bound(i1, i2, n, compare); 403 404 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 405 406 if (i3 != i2) { 407 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 408 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 409 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 410 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 411 412 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 413 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 414 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 415 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 416 } 417 } 418 419 void test_search1(std::vector<int> V1, std::vector<int> V2) { 420 const auto i1 = return_any_iterator(V1.begin()); 421 const auto i2 = return_any_iterator(V1.begin()); 422 const auto i3 = return_any_iterator(V2.begin()); 423 const auto i4 = return_any_iterator(V2.begin()); 424 425 const auto i5 = std::search(i1, i2, i3, i4); 426 427 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 428 429 if (i5 != i2) { 430 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 431 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 432 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 433 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 434 435 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 436 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 437 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 438 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 439 } 440 } 441 442 void test_search2(std::vector<int> V1, std::vector<int> V2) { 443 const auto i1 = return_any_iterator(V1.begin()); 444 const auto i2 = return_any_iterator(V1.begin()); 445 const auto i3 = return_any_iterator(V2.begin()); 446 const auto i4 = return_any_iterator(V2.begin()); 447 448 const auto i5 = std::search(std::execution::sequenced_policy(), 449 i1, i2, i3, i4); 450 451 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 452 453 if (i5 != i2) { 454 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 455 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 456 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 457 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 458 459 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 460 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 461 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 462 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 463 } 464 } 465 466 void test_search3(std::vector<int> V1, std::vector<int> V2) { 467 const auto i1 = return_any_iterator(V1.begin()); 468 const auto i2 = return_any_iterator(V1.begin()); 469 const auto i3 = return_any_iterator(V2.begin()); 470 const auto i4 = return_any_iterator(V2.begin()); 471 472 const auto i5 = std::search(i1, i2, i3, i4, odd); 473 474 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 475 476 if (i5 != i2) { 477 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 478 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 479 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 480 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 481 482 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 483 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 484 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 485 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 486 } 487 } 488 489 void test_search4(std::vector<int> V1, std::vector<int> V2) { 490 const auto i1 = return_any_iterator(V1.begin()); 491 const auto i2 = return_any_iterator(V1.begin()); 492 const auto i3 = return_any_iterator(V2.begin()); 493 const auto i4 = return_any_iterator(V2.begin()); 494 495 const auto i5 = std::search(std::execution::sequenced_policy(), 496 i1, i2, i3, i4, odd); 497 498 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 499 500 if (i5 != i2) { 501 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 502 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 503 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 504 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 505 506 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 507 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 508 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 509 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 510 } 511 } 512 513 void test_search5(std::vector<int> V1, std::vector<int> V2) { 514 const auto i1 = return_any_iterator(V1.begin()); 515 const auto i2 = return_any_iterator(V1.begin()); 516 const auto i3 = return_any_iterator(V2.begin()); 517 const auto i4 = return_any_iterator(V2.begin()); 518 519 const auto i5 = std::search(i1, i2, std::default_searcher(i3, i4)); 520 521 clang_analyzer_eval(i5 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 522 523 if (i5 != i2) { 524 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 525 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 526 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 527 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 528 529 clang_analyzer_eval(clang_analyzer_iterator_position(i5) < 530 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 531 clang_analyzer_eval(clang_analyzer_iterator_position(i5) >= 532 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 533 } 534 } 535 536 void test_search_n1(std::vector<int> V, int n) { 537 const auto i1 = return_any_iterator(V.begin()); 538 const auto i2 = return_any_iterator(V.begin()); 539 540 const auto i3 = std::search_n(i1, i2, 2, n); 541 542 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 543 544 if (i3 != i2) { 545 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 546 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 547 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 548 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 549 550 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 551 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 552 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 553 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 554 } 555 } 556 557 void test_search_n2(std::vector<int> V, int n) { 558 const auto i1 = return_any_iterator(V.begin()); 559 const auto i2 = return_any_iterator(V.begin()); 560 561 const auto i3 = std::search_n(std::execution::sequenced_policy(), 562 i1, i2, 2, n); 563 564 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 565 566 if (i3 != i2) { 567 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 568 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 569 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 570 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 571 572 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 573 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 574 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 575 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 576 } 577 } 578 579 void test_search_n3(std::vector<int> V, int n) { 580 const auto i1 = return_any_iterator(V.begin()); 581 const auto i2 = return_any_iterator(V.begin()); 582 583 const auto i3 = std::search_n(i1, i2, 2, n, compare); 584 585 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 586 587 if (i3 != i2) { 588 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 589 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 590 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 591 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 592 593 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 594 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 595 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 596 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 597 } 598 } 599 600 void test_search_n4(std::vector<int> V, int n) { 601 const auto i1 = return_any_iterator(V.begin()); 602 const auto i2 = return_any_iterator(V.begin()); 603 604 const auto i3 = std::search_n(std::execution::sequenced_policy(), 605 i1, i2, 2, n, compare); 606 607 clang_analyzer_eval(i3 == i2); // expected-warning{{TRUE}} expected-warning{{FALSE}} 608 609 if (i3 != i2) { 610 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 611 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}} 612 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 613 clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}} 614 615 clang_analyzer_eval(clang_analyzer_iterator_position(i3) < 616 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}} 617 clang_analyzer_eval(clang_analyzer_iterator_position(i3) >= 618 clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}} 619 } 620 } 621