1 | // RUN: %check_clang_tidy %s bugprone-nondeterministic-pointer-iteration-order %t -- -- -I%S -std=c++!4 |
2 | |
3 | #include "Inputs/system-header-simulator/sim_set" |
4 | #include "Inputs/system-header-simulator/sim_unordered_set" |
5 | #include "Inputs/system-header-simulator/sim_map" |
6 | #include "Inputs/system-header-simulator/sim_unordered_map" |
7 | #include "Inputs/system-header-simulator/sim_vector" |
8 | #include "Inputs/system-header-simulator/sim_algorithm" |
9 | |
10 | template<class T> |
11 | void f(T x); |
12 | |
13 | void PointerIteration() { |
14 | int a = 1, b = 2; |
15 | std::set<int> OrderedIntSet = {a, b}; |
16 | std::set<int *> OrderedPtrSet = {&a, &b}; |
17 | std::unordered_set<int> UnorderedIntSet = {a, b}; |
18 | std::unordered_set<int *> UnorderedPtrSet = {&a, &b}; |
19 | std::map<int, int> IntMap = { std::make_pair(a,a), std::make_pair(b,b) }; |
20 | std::map<int*, int*> PtrMap = { std::make_pair(&a,&a), std::make_pair(&b,&b) }; |
21 | std::unordered_map<int, int> IntUnorderedMap = { std::make_pair(a,a), std::make_pair(b,b) }; |
22 | std::unordered_map<int*, int*> PtrUnorderedMap = { std::make_pair(&a,&a), std::make_pair(&b,&b) }; |
23 | |
24 | for (auto i : OrderedIntSet) // no-warning |
25 | f(x: i); |
26 | |
27 | for (auto i : OrderedPtrSet) // no-warning |
28 | f(x: i); |
29 | |
30 | for (auto i : UnorderedIntSet) // no-warning |
31 | f(x: i); |
32 | |
33 | for (auto i : UnorderedPtrSet) |
34 | f(x: i); |
35 | // CHECK-MESSAGES: :[[@LINE-2]]:17: warning: iteration of pointers is nondeterministic |
36 | |
37 | for (auto &i : UnorderedPtrSet) |
38 | f(x: i); |
39 | // CHECK-MESSAGES: :[[@LINE-2]]:18: warning: iteration of pointers is nondeterministic |
40 | |
41 | for (auto &i : IntMap) // no-warning |
42 | f(x: i); |
43 | |
44 | for (auto &i : PtrMap) // no-warning |
45 | f(x: i); |
46 | |
47 | for (auto &i : IntUnorderedMap) // no-warning |
48 | f(x: i); |
49 | |
50 | for (auto &i : PtrUnorderedMap) |
51 | f(x: i); |
52 | // CHECK-MESSAGES: :[[@LINE-2]]:18: warning: iteration of pointers is nondeterministic |
53 | } |
54 | |
55 | bool g (int *x) { return true; } |
56 | bool h (int x) { return true; } |
57 | |
58 | void PointerSorting() { |
59 | int a = 1, b = 2, c = 3; |
60 | std::vector<int> V1 = {a, b}; |
61 | std::vector<int *> V2 = {&a, &b}; |
62 | |
63 | std::is_sorted(first: V1.begin(), last: V1.end()); // no-warning |
64 | std::nth_element(first: V1.begin(), nth: V1.begin() + 1, last: V1.end()); // no-warning |
65 | std::partial_sort(first: V1.begin(), middle: V1.begin() + 1, last: V1.end()); // no-warning |
66 | std::sort(first: V1.begin(), last: V1.end()); // no-warning |
67 | std::stable_sort(first: V1.begin(), last: V1.end()); // no-warning |
68 | std::partition(first: V1.begin(), last: V1.end(), p: h); // no-warning |
69 | std::stable_partition(first: V1.begin(), last: V1.end(), p: h); // no-warning |
70 | std::is_sorted(first: V2.begin(), last: V2.end()); |
71 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic |
72 | std::nth_element(first: V2.begin(), nth: V2.begin() + 1, last: V2.end()); |
73 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic |
74 | std::partial_sort(first: V2.begin(), middle: V2.begin() + 1, last: V2.end()); |
75 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic |
76 | std::sort(first: V2.begin(), last: V2.end()); |
77 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic |
78 | std::stable_sort(first: V2.begin(), last: V2.end()); |
79 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic |
80 | std::partition(first: V2.begin(), last: V2.end(), p: g); |
81 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic |
82 | std::stable_partition(first: V2.begin(), last: V2.end(), p: g); |
83 | // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic |
84 | } |
85 | |