// 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 }