brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 6ca3229 Raw
81 lines · cpp
1// RUN: %check_clang_tidy %s cppcoreguidelines-pro-bounds-constant-array-index %t -- \2// RUN:     -config='{CheckOptions: {cppcoreguidelines-pro-bounds-constant-array-index.GslHeader: "dir1/gslheader.h"}}'3// CHECK-FIXES: #include "dir1/gslheader.h"4 5typedef __SIZE_TYPE__ size_t;6 7namespace std {8  template<typename T, size_t N>9  struct array {10    T& operator[](size_t n);11    T& at(size_t n);12  };13}14 15 16namespace gsl {17  template<class T, size_t N>18  T& at( T(&a)[N], size_t index );19 20  template<class T, size_t N>21  T& at( std::array<T, N> &a, size_t index );22}23 24constexpr int const_index(int base) {25  return base + 3;26}27 28void f(std::array<int, 10> a, int pos) {29  a [ pos / 2 /*comment*/] = 1;30  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not use array subscript when the index is not an integer constant expression [cppcoreguidelines-pro-bounds-constant-array-index]31  // CHECK-FIXES: gsl::at(a,  pos / 2 /*comment*/) = 1;32  int j = a[pos - 1];33  // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not use array subscript when the index is not an integer constant expression34  // CHECK-FIXES: int j = gsl::at(a, pos - 1);35 36  a.at(pos-1) = 2; // OK, at() instead of []37  gsl::at(a, pos-1) = 2; // OK, gsl::at() instead of []38 39  a[-1] = 3;40  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: std::array<> index -1 is negative [cppcoreguidelines-pro-bounds-constant-array-index]41  a[10] = 4;42  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: std::array<> index 10 is past the end of the array (which contains 10 elements) [cppcoreguidelines-pro-bounds-constant-array-index]43 44  a[const_index(7)] = 3;45  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: std::array<> index 10 is past the end of the array (which contains 10 elements)46 47  a[0] = 3; // OK, constant index and inside bounds48  a[1] = 3; // OK, constant index and inside bounds49  a[9] = 3; // OK, constant index and inside bounds50  a[const_index(6)] = 3; // OK, constant index and inside bounds51}52 53void g() {54  int a[10];55  for (int i = 0; i < 10; ++i) {56    a[i] = i;57    // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not use array subscript when the index is not an integer constant expression58    // CHECK-FIXES: gsl::at(a, i) = i;59    gsl::at(a, i) = i; // OK, gsl::at() instead of []60  }61 62  a[-1] = 3; // flagged by clang-diagnostic-array-bounds63  a[10] = 4; // flagged by clang-diagnostic-array-bounds64  a[const_index(7)] = 3; // flagged by clang-diagnostic-array-bounds65 66  a[0] = 3; // OK, constant index and inside bounds67  a[1] = 3; // OK, constant index and inside bounds68  a[9] = 3; // OK, constant index and inside bounds69  a[const_index(6)] = 3; // OK, constant index and inside bounds70}71 72struct S {73  int& operator[](int i);74};75 76void customOperator() {77  S s;78  int i = 0;79  s[i] = 3; // OK, custom operator80}81