| 12
 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
 85
 86
 87
 88
 89
 
 | // RUN: %check_clang_tidy %s cppcoreguidelines-pro-bounds-pointer-arithmetic %t
enum E {
  ENUM_LITERAL = 1
};
int i = 4;
int j = 1;
int *p = 0;
int *q = 0;
void fail() {
  q = p + 4;
  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic [cppcoreguidelines-pro-bounds-pointer-arithmetic]
  p = q + i;
  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
  p = q + ENUM_LITERAL;
  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
  q = p - 1;
  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
  p = q - i;
  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
  p = q - ENUM_LITERAL;
  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
  p += 4;
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
  p += i;
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
  p += ENUM_LITERAL;
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
  q -= 1;
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
  q -= i;
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
  q -= ENUM_LITERAL;
  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
  p++;
  // CHECK-MESSAGES: :[[@LINE-1]]:4: warning: do not use pointer arithmetic
  ++p;
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use pointer arithmetic
  p--;
  // CHECK-MESSAGES: :[[@LINE-1]]:4: warning: do not use pointer arithmetic
  --p;
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use pointer arithmetic
  i = p[1];
  // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not use pointer arithmetic
}
struct S {
  operator int() const;
};
void f(S &s) {
  int *i;
  i = i + s;
  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
}
void f2(int i[]) {
  i[1] = 0;
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use pointer arithmetic
}
void okay() {
  int a[3];
  i = a[2]; // OK, access to array
  p = q;
  p = &i;
  i++;
  ++i;
  i--;
  --i;
  i += 1;
  i -= 1;
  i = j + 1;
  i = j - 1;
  auto diff = p - q; // OK, result is arithmetic
  for(int ii : a) ; // OK, pointer arithmetic generated by compiler
}
 |