File: const-correctness-pointer-as-values.cpp

package info (click to toggle)
llvm-toolchain-15 1%3A15.0.6-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,554,644 kB
  • sloc: cpp: 5,922,452; ansic: 1,012,136; asm: 674,362; python: 191,568; objc: 73,855; f90: 42,327; lisp: 31,913; pascal: 11,973; javascript: 10,144; sh: 9,421; perl: 7,447; ml: 5,527; awk: 3,523; makefile: 2,520; xml: 885; cs: 573; fortran: 567
file content (74 lines) | stat: -rw-r--r-- 2,898 bytes parent folder | download | duplicates (5)
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
// RUN: %check_clang_tidy %s misc-const-correctness %t \
// RUN: -config='{CheckOptions: \
// RUN:  [{key: "misc-const-correctness.AnalyzeValues", value: true},\
// RUN:   {key: "misc-const-correctness.WarnPointersAsValues", value: true},\
// RUN:   {key: "misc-const-correctness.TransformPointersAsValues", value: true}]}' \
// RUN: -- -fno-delayed-template-parsing

void potential_const_pointer() {
  double np_local0[10] = {0., 1., 2., 3., 4., 5., 6., 7., 8., 9.};
  double *p_local0 = &np_local0[1];
  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: variable 'p_local0' of type 'double *' can be declared 'const'
  // CHECK-FIXES: double *const p_local0

  using doublePtr = double*;
  using doubleArray = double[15];
  doubleArray np_local1;
  doublePtr p_local1 = &np_local1[0];
  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: variable 'p_local1' of type 'doublePtr' (aka 'double *') can be declared 'const'
  // CHECK-FIXES: doublePtr const p_local1
}

void range_for() {
  int np_local0[2] = {1, 2};
  int *p_local0[2] = {&np_local0[0], &np_local0[1]};
  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: variable 'p_local0' of type 'int *[2]' can be declared 'const'
  // CHECK-FIXES: int *const p_local0[2]
  for (const int *p_local1 : p_local0) {
  // CHECK-MESSAGES: [[@LINE-1]]:8: warning: variable 'p_local1' of type 'const int *' can be declared 'const'
  // CHECK-FIXES: for (const int *const p_local1 : p_local0)
  }

  int *p_local2[2] = {nullptr, nullptr};
  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: variable 'p_local2' of type 'int *[2]' can be declared 'const'
  // CHECK-FIXES: int *const p_local2[2]
  for (const auto *con_ptr : p_local2) {
  }

}

template <typename T>
struct SmallVectorBase {
  T data[4];
  void push_back(const T &el) {}
  int size() const { return 4; }
  T *begin() { return data; }
  const T *begin() const { return data; }
  T *end() { return data + 4; }
  const T *end() const { return data + 4; }
};

template <typename T>
struct SmallVector : SmallVectorBase<T> {};

template <class T>
void EmitProtocolMethodList(T &&Methods) {
  // Note: If the template is uninstantiated the analysis does not figure out,
  // that p_local0 could be const. Not sure why, but probably bails because
  // some expressions are type-dependent.
  SmallVector<const int *> p_local0;
  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: variable 'p_local0' of type 'SmallVector<const int *>' can be declared 'const'
  // CHECK-FIXES: SmallVector<const int *> const p_local0
  SmallVector<const int *> np_local0;
  for (const auto *I : Methods) {
    if (I == nullptr)
      np_local0.push_back(I);
  }
  p_local0.size();
}
void instantiate() {
  int *p_local0[4] = {nullptr, nullptr, nullptr, nullptr};
  // CHECK-MESSAGES: [[@LINE-1]]:3: warning: variable 'p_local0' of type 'int *[4]' can be declared 'const'
  // CHECK-FIXES: int *const p_local0[4]
  EmitProtocolMethodList(p_local0);
}