1 // RUN: %check_clang_tidy %s cppcoreguidelines-pro-bounds-pointer-arithmetic %t
2 
3 enum E {
4   ENUM_LITERAL = 1
5 };
6 
7 int i = 4;
8 int j = 1;
9 int *p = 0;
10 int *q = 0;
11 
fail()12 void fail() {
13   q = p + 4;
14   // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic [cppcoreguidelines-pro-bounds-pointer-arithmetic]
15   p = q + i;
16   // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
17   p = q + ENUM_LITERAL;
18   // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
19 
20   q = p - 1;
21   // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
22   p = q - i;
23   // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
24   p = q - ENUM_LITERAL;
25   // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
26 
27   p += 4;
28   // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
29   p += i;
30   // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
31   p += ENUM_LITERAL;
32   // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
33 
34   q -= 1;
35   // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
36   q -= i;
37   // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
38   q -= ENUM_LITERAL;
39   // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use pointer arithmetic
40 
41   p++;
42   // CHECK-MESSAGES: :[[@LINE-1]]:4: warning: do not use pointer arithmetic
43   ++p;
44   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use pointer arithmetic
45 
46   p--;
47   // CHECK-MESSAGES: :[[@LINE-1]]:4: warning: do not use pointer arithmetic
48   --p;
49   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use pointer arithmetic
50 
51   i = p[1];
52   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not use pointer arithmetic
53 }
54 
55 struct S {
56   operator int() const;
57 };
58 
f(S & s)59 void f(S &s) {
60   int *i;
61   i = i + s;
62   // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not use pointer arithmetic
63 }
64 
f2(int i[])65 void f2(int i[]) {
66   i[1] = 0;
67   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use pointer arithmetic
68 }
69 
okay()70 void okay() {
71   int a[3];
72   i = a[2]; // OK, access to array
73 
74   p = q;
75   p = &i;
76 
77   i++;
78   ++i;
79   i--;
80   --i;
81   i += 1;
82   i -= 1;
83   i = j + 1;
84   i = j - 1;
85 
86   auto diff = p - q; // OK, result is arithmetic
87 
88   for(int ii : a) ; // OK, pointer arithmetic generated by compiler
89 }
90