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