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