mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-30 08:16:06 +00:00

STL Algorithms are usually implemented in a tricky for performance reasons which is too complicated for the analyzer. Furthermore inlining them is costly. Instead of inlining we should model their behavior according to the specifications. This patch is the first step towards STL Algorithm modeling. It models all the `find()`-like functions in a simple way: the result is either found or not. In the future it can be extended to only return success if container modeling is also extended in a way the it keeps track of trivial insertions and deletions. Differential Revision: https://reviews.llvm.org/D70818
567 lines
26 KiB
C++
567 lines
26 KiB
C++
// RUN: %clang_analyze_cc1 -std=c++17 %s\
|
|
// RUN: -analyzer-checker=core,cplusplus,alpha.cplusplus.STLAlgorithmModeling,debug.DebugIteratorModeling,debug.ExprInspection\
|
|
// RUN: -analyzer-config aggressive-binary-operation-simplification=true\
|
|
// RUN: -verify
|
|
|
|
#include "Inputs/system-header-simulator-cxx.h"
|
|
|
|
void clang_analyzer_eval(bool);
|
|
|
|
template <typename Iterator>
|
|
long clang_analyzer_iterator_position(const Iterator&);
|
|
|
|
template <typename Iter> Iter return_any_iterator(const Iter &It);
|
|
|
|
void test_find1(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::find(i1, i2, n);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find2(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::find(std::execution::sequenced_policy(), i1, i2, n);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
bool odd(int i) { return i % 2; }
|
|
|
|
void test_find_if1(std::vector<int> V) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::find_if(i1, i2, odd);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_if2(std::vector<int> V) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::find_if(std::execution::sequenced_policy(), i1, i2, odd);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_if_not1(std::vector<int> V) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::find_if_not(i1, i2, odd);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_if_not2(std::vector<int> V) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::find_if_not(std::execution::sequenced_policy(), i1, i2,
|
|
odd);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_first_of1(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::find_first_of(i1, i2, i3, i4);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_first_of2(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::find_first_of(std::execution::sequenced_policy(),
|
|
i1, i2, i3, i4);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_first_of3(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::find_first_of(i1, i2, i3, i4, odd);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_first_of4(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::find_first_of(std::execution::sequenced_policy(),
|
|
i1, i2, i3, i4, odd);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_end1(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::find_end(i1, i2, i3, i4);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_end2(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::find_end(std::execution::sequenced_policy(),
|
|
i1, i2, i3, i4);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_end3(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::find_end(i1, i2, i3, i4, odd);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_find_end4(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::find_end(std::execution::sequenced_policy(),
|
|
i1, i2, i3, i4, odd);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
bool compare(int, int);
|
|
|
|
void test_lower_bound1(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::lower_bound(i1, i2, n);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_lower_bound2(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::lower_bound(i1, i2, n, compare);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_upper_bound1(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::upper_bound(i1, i2, n);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_upper_bound2(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::upper_bound(i1, i2, n, compare);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_search1(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::search(i1, i2, i3, i4);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_search2(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::search(std::execution::sequenced_policy(),
|
|
i1, i2, i3, i4);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_search3(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::search(i1, i2, i3, i4, odd);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_search4(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::search(std::execution::sequenced_policy(),
|
|
i1, i2, i3, i4, odd);
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_search5(std::vector<int> V1, std::vector<int> V2) {
|
|
const auto i1 = return_any_iterator(V1.begin());
|
|
const auto i2 = return_any_iterator(V1.begin());
|
|
const auto i3 = return_any_iterator(V2.begin());
|
|
const auto i4 = return_any_iterator(V2.begin());
|
|
|
|
const auto i5 = std::search(i1, i2, std::default_searcher(i3, i4));
|
|
|
|
clang_analyzer_eval(i5 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i5) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_search_n1(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::search_n(i1, i2, 2, n);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_search_n2(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::search_n(std::execution::sequenced_policy(),
|
|
i1, i2, 2, n);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_search_n3(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::search_n(i1, i2, 2, n, compare);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|
|
|
|
void test_search_n4(std::vector<int> V, int n) {
|
|
const auto i1 = return_any_iterator(V.begin());
|
|
const auto i2 = return_any_iterator(V.begin());
|
|
|
|
const auto i3 = std::search_n(std::execution::sequenced_policy(),
|
|
i1, i2, 2, n, compare);
|
|
|
|
clang_analyzer_eval(i3 == i2); // expected-warning{{FALSE}}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i1)); // expected-warning@-1{{FALSE}}
|
|
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) <
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{TRUE}}
|
|
clang_analyzer_eval(clang_analyzer_iterator_position(i3) >=
|
|
clang_analyzer_iterator_position(i2)); // expected-warning@-1{{FALSE}}
|
|
}
|