xref: /llvm-project/clang/test/Analysis/stl-algorithm-modeling.cpp (revision 9b2ec87f5bce57cc900cf52a99f805d999716053)
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