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\
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.
17 #include "Inputs/system-header-simulator-cxx.h"
19 void clang_analyzer_eval(bool);
21 template <typename Iterator
>
22 long clang_analyzer_iterator_position(const Iterator
&);
24 template <typename Iter
> Iter
return_any_iterator(const Iter
&It
);
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());
30 const auto i3
= std::find(i1
, i2
, n
);
32 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
51 const auto i3
= std::find(std::execution::sequenced_policy(), i1
, i2
, n
);
53 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
68 bool odd(int i
) { return i
% 2; }
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());
74 const auto i3
= std::find_if(i1
, i2
, odd
);
76 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
95 const auto i3
= std::find_if(std::execution::sequenced_policy(), i1
, i2
, odd
);
97 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
116 const auto i3
= std::find_if_not(i1
, i2
, odd
);
118 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
137 const auto i3
= std::find_if_not(std::execution::sequenced_policy(), i1
, i2
,
140 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
161 const auto i5
= std::find_first_of(i1
, i2
, i3
, i4
);
163 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
184 const auto i5
= std::find_first_of(std::execution::sequenced_policy(),
187 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
208 const auto i5
= std::find_first_of(i1
, i2
, i3
, i4
, odd
);
210 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
231 const auto i5
= std::find_first_of(std::execution::sequenced_policy(),
232 i1
, i2
, i3
, i4
, odd
);
234 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
255 const auto i5
= std::find_end(i1
, i2
, i3
, i4
);
257 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
278 const auto i5
= std::find_end(std::execution::sequenced_policy(),
281 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
302 const auto i5
= std::find_end(i1
, i2
, i3
, i4
, odd
);
304 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
325 const auto i5
= std::find_end(std::execution::sequenced_policy(),
326 i1
, i2
, i3
, i4
, odd
);
328 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
343 bool compare(int, int);
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());
349 const auto i3
= std::lower_bound(i1
, i2
, n
);
351 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
370 const auto i3
= std::lower_bound(i1
, i2
, n
, compare
);
372 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
391 const auto i3
= std::upper_bound(i1
, i2
, n
);
393 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
412 const auto i3
= std::upper_bound(i1
, i2
, n
, compare
);
414 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
435 const auto i5
= std::search(i1
, i2
, i3
, i4
);
437 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
458 const auto i5
= std::search(std::execution::sequenced_policy(),
461 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
482 const auto i5
= std::search(i1
, i2
, i3
, i4
, odd
);
484 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
505 const auto i5
= std::search(std::execution::sequenced_policy(),
506 i1
, i2
, i3
, i4
, odd
);
508 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
529 const auto i5
= std::search(i1
, i2
, std::default_searcher(i3
, i4
));
531 clang_analyzer_eval(i5
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
550 const auto i3
= std::search_n(i1
, i2
, 2, n
);
552 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
571 const auto i3
= std::search_n(std::execution::sequenced_policy(),
574 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
593 const auto i3
= std::search_n(i1
, i2
, 2, n
, compare
);
595 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}
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());
614 const auto i3
= std::search_n(std::execution::sequenced_policy(),
615 i1
, i2
, 2, n
, compare
);
617 clang_analyzer_eval(i3
== i2
); // expected-warning{{TRUE}} expected-warning{{FALSE}}
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}}
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}}