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