brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · e5ad6f9 Raw
109 lines · cpp
1// RUN: %check_clang_tidy %s readability-simplify-subscript-expr %t \2// RUN: -config="{CheckOptions: \3// RUN: {readability-simplify-subscript-expr.Types: \4// RUN:    '::std::basic_string;::std::basic_string_view;MyVector'}}" --5 6namespace std {7 8template <class T>9class basic_string {10 public:11   using size_type = unsigned;12   using value_type = T;13   using reference = value_type&;14   using const_reference = const value_type&;15 16   reference operator[](size_type);17   const_reference operator[](size_type) const;18   T* data();19   const T* data() const;20};21 22using string = basic_string<char>;23 24template <class T>25class basic_string_view {26 public:27  using size_type = unsigned;28  using const_reference = const T&;29  using const_pointer = const T*;30 31  constexpr const_reference operator[](size_type) const;32  constexpr const_pointer data() const noexcept;33};34 35using string_view = basic_string_view<char>;36 37}38 39template <class T>40class MyVector {41 public:42  using size_type = unsigned;43  using const_reference = const T&;44  using const_pointer = const T*;45 46  const_reference operator[](size_type) const;47  const T* data() const noexcept;48};49 50#define DO(x) do { x; } while (false)51#define ACCESS(x) (x)52#define GET(x, i) (x).data()[i]53 54template <class T>55class Foo {56 public:57  char bar(int i) {58    return x.data()[i];59  }60 private:61  T x;62};63 64void f(int i) {65  MyVector<int> v;66  int x = v.data()[i];67  // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: accessing an element of the container does not require a call to 'data()'; did you mean to use 'operator[]'? [readability-simplify-subscript-expr]68  // CHECK-FIXES: int x = v[i];69 70  std::string s;71  char c1 = s.data()[i];72  // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: accessing an element73  // CHECK-FIXES: char c1 = s[i];74 75  std::string_view sv;76  char c2 = sv.data()[i];77  // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: accessing an element78  // CHECK-FIXES: char c2 = sv[i];79 80  std::string* ps = &s;81  char c3 = ps->data()[i];82  // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: accessing an element83  // CHECK-FIXES: char c3 = (*ps)[i];84 85  char c4 = (*ps).data()[i];86  // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: accessing an element87  // CHECK-FIXES: char c4 = (*ps)[i];88 89  DO(char c5 = s.data()[i]);90  // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: accessing an element91  // CHECK-FIXES: DO(char c5 = s[i]);92 93  char c6 = ACCESS(s).data()[i];94  // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: accessing an element95  // CHECK-FIXES: char c6 = ACCESS(s)[i];96 97  char c7 = ACCESS(s.data())[i];98  // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: accessing an element99  // CHECK-FIXES: char c7 = ACCESS(s)[i];100 101  char c8 = ACCESS(s.data()[i]);102  // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: accessing an element103  // CHECK-FIXES: char c8 = ACCESS(s[i]);104 105  char c9 = GET(s, i);106 107  char c10 = Foo<std::string>{}.bar(i);108}109