File: nondeterministic-pointer-iteration-order.cpp

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.8-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,388 kB
  • sloc: cpp: 7,438,767; ansic: 1,393,871; asm: 1,012,926; python: 241,728; f90: 86,635; objc: 75,411; lisp: 42,144; pascal: 17,286; sh: 10,027; ml: 5,082; perl: 4,730; awk: 3,523; makefile: 3,349; javascript: 2,251; xml: 892; fortran: 672
file content (84 lines) | stat: -rw-r--r-- 3,399 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// RUN: %check_clang_tidy %s bugprone-nondeterministic-pointer-iteration-order %t -- -- -I%S -std=c++!4

#include "Inputs/system-header-simulator/sim_set"
#include "Inputs/system-header-simulator/sim_unordered_set"
#include "Inputs/system-header-simulator/sim_map"
#include "Inputs/system-header-simulator/sim_unordered_map"
#include "Inputs/system-header-simulator/sim_vector"
#include "Inputs/system-header-simulator/sim_algorithm"

template<class T>
void f(T x);

void PointerIteration() {
  int a = 1, b = 2;
  std::set<int> OrderedIntSet = {a, b};
  std::set<int *> OrderedPtrSet = {&a, &b};
  std::unordered_set<int> UnorderedIntSet = {a, b};
  std::unordered_set<int *> UnorderedPtrSet = {&a, &b};
  std::map<int, int> IntMap = { std::make_pair(a,a), std::make_pair(b,b) };
  std::map<int*, int*> PtrMap = { std::make_pair(&a,&a), std::make_pair(&b,&b) };
  std::unordered_map<int, int> IntUnorderedMap = { std::make_pair(a,a), std::make_pair(b,b) };
  std::unordered_map<int*, int*> PtrUnorderedMap = { std::make_pair(&a,&a), std::make_pair(&b,&b) };

  for (auto i : OrderedIntSet) // no-warning
    f(i);

  for (auto i : OrderedPtrSet) // no-warning
    f(i);

  for (auto i : UnorderedIntSet) // no-warning
    f(i);

  for (auto i : UnorderedPtrSet)
    f(i);
  // CHECK-MESSAGES: :[[@LINE-2]]:17: warning: iteration of pointers is nondeterministic

  for (auto &i : UnorderedPtrSet)
    f(i);
  // CHECK-MESSAGES: :[[@LINE-2]]:18: warning: iteration of pointers is nondeterministic

  for (auto &i : IntMap) // no-warning
    f(i);

  for (auto &i : PtrMap) // no-warning
    f(i);

  for (auto &i : IntUnorderedMap) // no-warning
    f(i);

  for (auto &i : PtrUnorderedMap)
    f(i);
  // CHECK-MESSAGES: :[[@LINE-2]]:18: warning: iteration of pointers is nondeterministic
}

bool g (int *x) { return true; }
bool h (int x) { return true; }

void PointerSorting() {
  int a = 1, b = 2, c = 3;
  std::vector<int> V1 = {a, b};
  std::vector<int *> V2 = {&a, &b};

  std::is_sorted(V1.begin(), V1.end());                    // no-warning
  std::nth_element(V1.begin(), V1.begin() + 1, V1.end());  // no-warning
  std::partial_sort(V1.begin(), V1.begin() + 1, V1.end()); // no-warning
  std::sort(V1.begin(), V1.end());                         // no-warning
  std::stable_sort(V1.begin(), V1.end());                  // no-warning
  std::partition(V1.begin(), V1.end(), h);                 // no-warning
  std::stable_partition(V1.begin(), V1.end(), h);          // no-warning
  std::is_sorted(V2.begin(), V2.end());
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic
  std::nth_element(V2.begin(), V2.begin() + 1, V2.end());
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic
  std::partial_sort(V2.begin(), V2.begin() + 1, V2.end());
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic
  std::sort(V2.begin(), V2.end());
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic
  std::stable_sort(V2.begin(), V2.end());
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic
  std::partition(V2.begin(), V2.end(), g);
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic
  std::stable_partition(V2.begin(), V2.end(), g);
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: sorting pointers is nondeterministic
}