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