brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.5 KiB · ffcf84e Raw
469 lines · cpp
1// RUN: %check_clang_tidy %s readability-qualified-auto %t \2// RUN: -config='{CheckOptions: { \3// RUN:   readability-qualified-auto.AllowedTypes: "[iI]terator$;my::ns::Ignored1;std::array<.*>::Ignored2;MyIgnoredPtr" \4// RUN: }}'5// RUN: %check_clang_tidy %s readability-qualified-auto %t \6// RUN: -config='{CheckOptions: { \7// RUN:   readability-qualified-auto.AllowedTypes: "[iI]terator$;my::ns::Ignored1;std::array<.*>::Ignored2;MyIgnoredPtr", \8// RUN:   readability-qualified-auto.IgnoreAliasing: false \9// RUN: }}' -check-suffix=ALIAS -- 10 11namespace typedefs {12typedef int *MyPtr;13typedef int &MyRef;14typedef const int *CMyPtr;15typedef const int &CMyRef;16 17MyPtr getPtr();18MyPtr* getPtrPtr();19MyRef getRef();20CMyPtr getCPtr();21CMyPtr* getCPtrPtr();22CMyRef getCRef();23 24void foo() {25  auto TdNakedPtr = getPtr();26  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedPtr' can be declared as 'auto *TdNakedPtr'27  // CHECK-FIXES: auto *TdNakedPtr = getPtr();28  auto TdNakedPtrPtr = getPtrPtr();29  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedPtrPtr' can be declared as 'auto *TdNakedPtrPtr'30  // CHECK-FIXES: auto *TdNakedPtrPtr = getPtrPtr();31  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto TdNakedPtrPtr' can be declared as 'auto *TdNakedPtrPtr'32  // CHECK-FIXES-ALIAS: auto *TdNakedPtrPtr = getPtrPtr();33  auto &TdNakedRef = getRef();34  auto TdNakedRefDeref = getRef();35  auto TdNakedCPtr = getCPtr();36  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedCPtr' can be declared as 'const auto *TdNakedCPtr'37  // CHECK-FIXES: const auto *TdNakedCPtr = getCPtr();38  auto TdNakedCPtrPtr = getCPtrPtr();39  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto TdNakedCPtrPtr' can be declared as 'auto *TdNakedCPtrPtr'40  // CHECK-FIXES: auto *TdNakedCPtrPtr = getCPtrPtr();41  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto TdNakedCPtrPtr' can be declared as 'auto *TdNakedCPtrPtr'42  // CHECK-FIXES-ALIAS: auto *TdNakedCPtrPtr = getCPtrPtr();43  auto &TdNakedCRef = getCRef();44  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto &TdNakedCRef' can be declared as 'const auto &TdNakedCRef'45  // CHECK-FIXES: const auto &TdNakedCRef = getCRef();46  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto &TdNakedCRef' can be declared as 'const auto &TdNakedCRef'47  // CHECK-FIXES-ALIAS: const auto &TdNakedCRef = getCRef();48  auto TdNakedCRefDeref = getCRef();49}50 51}; // namespace typedefs52 53namespace usings {54using MyPtr = int *;55using MyRef = int &;56using CMyPtr = const int *;57using CMyRef = const int &;58 59MyPtr getPtr();60MyPtr* getPtrPtr();61MyRef getRef();62CMyPtr getCPtr();63CMyRef getCRef();64 65void foo() {66  auto UNakedPtr = getPtr();67  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto UNakedPtr' can be declared as 'auto *UNakedPtr'68  // CHECK-FIXES: auto *UNakedPtr = getPtr();69  auto UNakedPtrPtr = getPtrPtr();70  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto UNakedPtrPtr' can be declared as 'auto *UNakedPtrPtr'71  // CHECK-FIXES: auto *UNakedPtrPtr = getPtrPtr();72  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto UNakedPtrPtr' can be declared as 'auto *UNakedPtrPtr'73  // CHECK-FIXES-ALIAS: auto *UNakedPtrPtr = getPtrPtr();74  auto &UNakedRef = getRef();75  auto UNakedRefDeref = getRef();76  auto UNakedCPtr = getCPtr();77  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto UNakedCPtr' can be declared as 'const auto *UNakedCPtr'78  // CHECK-FIXES: const auto *UNakedCPtr = getCPtr();79  auto &UNakedCRef = getCRef();80  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto &UNakedCRef' can be declared as 'const auto &UNakedCRef'81  // CHECK-FIXES: const auto &UNakedCRef = getCRef();82  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto &UNakedCRef' can be declared as 'const auto &UNakedCRef'83  // CHECK-FIXES-ALIAS: const auto &UNakedCRef = getCRef();84  auto UNakedCRefDeref = getCRef();85}86 87}; // namespace usings88 89int getInt();90int *getIntPtr();91const int *getCIntPtr();92 93void foo() {94  // make sure check disregards named types95  int TypedInt = getInt();96  int *TypedPtr = getIntPtr();97  const int *TypedConstPtr = getCIntPtr();98  int &TypedRef = *getIntPtr();99  const int &TypedConstRef = *getCIntPtr();100 101  // make sure check disregards auto types that aren't pointers or references102  auto AutoInt = getInt();103 104  auto NakedPtr = getIntPtr();105  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto NakedPtr' can be declared as 'auto *NakedPtr'106  // CHECK-FIXES: auto *NakedPtr = getIntPtr();107  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto NakedPtr' can be declared as 'auto *NakedPtr'108  // CHECK-FIXES-ALIAS: auto *NakedPtr = getIntPtr();109  auto NakedCPtr = getCIntPtr();110  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto NakedCPtr' can be declared as 'const auto *NakedCPtr'111  // CHECK-FIXES: const auto *NakedCPtr = getCIntPtr();112  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto NakedCPtr' can be declared as 'const auto *NakedCPtr'113  // CHECK-FIXES-ALIAS: const auto *NakedCPtr = getCIntPtr();114 115  const auto ConstPtr = getIntPtr();116  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'const auto ConstPtr' can be declared as 'auto *const ConstPtr'117  // CHECK-FIXES: auto *const ConstPtr = getIntPtr();118  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'const auto ConstPtr' can be declared as 'auto *const ConstPtr'119  // CHECK-FIXES-ALIAS: auto *const ConstPtr = getIntPtr();120  const auto ConstCPtr = getCIntPtr();121  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'const auto ConstCPtr' can be declared as 'const auto *const ConstCPtr'122  // CHECK-FIXES: const auto *const ConstCPtr = getCIntPtr();123  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'const auto ConstCPtr' can be declared as 'const auto *const ConstCPtr'124  // CHECK-FIXES-ALIAS: const auto *const ConstCPtr = getCIntPtr();125 126  volatile auto VolatilePtr = getIntPtr();127  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'volatile auto VolatilePtr' can be declared as 'auto *volatile VolatilePtr'128  // CHECK-FIXES: auto *volatile VolatilePtr = getIntPtr();129  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'volatile auto VolatilePtr' can be declared as 'auto *volatile VolatilePtr'130  // CHECK-FIXES-ALIAS: auto *volatile VolatilePtr = getIntPtr();131  volatile auto VolatileCPtr = getCIntPtr();132  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'volatile auto VolatileCPtr' can be declared as 'const auto *volatile VolatileCPtr'133  // CHECK-FIXES: const auto *volatile VolatileCPtr = getCIntPtr();134  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'volatile auto VolatileCPtr' can be declared as 'const auto *volatile VolatileCPtr'135  // CHECK-FIXES-ALIAS: const auto *volatile VolatileCPtr = getCIntPtr();136 137  auto *QualPtr = getIntPtr();138  auto *QualCPtr = getCIntPtr();139  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto *QualCPtr' can be declared as 'const auto *QualCPtr'140  // CHECK-FIXES: const auto *QualCPtr = getCIntPtr();141  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto *QualCPtr' can be declared as 'const auto *QualCPtr'142  // CHECK-FIXES-ALIAS: const auto *QualCPtr = getCIntPtr();143  auto *const ConstantQualCPtr = getCIntPtr();144  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto *const ConstantQualCPtr' can be declared as 'const auto *const ConstantQualCPtr'145  // CHECK-FIXES: const auto *const ConstantQualCPtr = getCIntPtr();146  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto *const ConstantQualCPtr' can be declared as 'const auto *const ConstantQualCPtr'147  // CHECK-FIXES-ALIAS: const auto *const ConstantQualCPtr = getCIntPtr();148  auto *volatile VolatileQualCPtr = getCIntPtr();149  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto *volatile VolatileQualCPtr' can be declared as 'const auto *volatile VolatileQualCPtr'150  // CHECK-FIXES: const auto *volatile VolatileQualCPtr = getCIntPtr();151  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto *volatile VolatileQualCPtr' can be declared as 'const auto *volatile VolatileQualCPtr'152  // CHECK-FIXES-ALIAS: const auto *volatile VolatileQualCPtr = getCIntPtr();153  const auto *ConstQualCPtr = getCIntPtr();154 155  auto &Ref = *getIntPtr();156  auto &CRef = *getCIntPtr();157  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto &CRef' can be declared as 'const auto &CRef'158  // CHECK-FIXES: const auto &CRef = *getCIntPtr();159  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto &CRef' can be declared as 'const auto &CRef'160  // CHECK-FIXES-ALIAS: const auto &CRef = *getCIntPtr();161  const auto &ConstCRef = *getCIntPtr();162 163  if (auto X = getCIntPtr()) {164    // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: 'auto X' can be declared as 'const auto *X'165    // CHECK-FIXES: if (const auto *X = getCIntPtr()) {166    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:7: warning: 'auto X' can be declared as 'const auto *X'167    // CHECK-FIXES-ALIAS: if (const auto *X = getCIntPtr()) {168  }169}170 171void macroTest() {172#define _AUTO auto173#define _CONST const174  _AUTO AutoMACROPtr = getIntPtr();175  const _AUTO ConstAutoMacroPtr = getIntPtr();176  _CONST _AUTO ConstMacroAutoMacroPtr = getIntPtr();177  _CONST auto ConstMacroAutoPtr = getIntPtr();178#undef _AUTO179#undef _CONST180}181 182namespace std {183template <typename T>184class vector { // dummy impl185  T _data[1];186 187public:188  T *begin() { return _data; }189  const T *begin() const { return _data; }190  T *end() { return &_data[1]; }191  const T *end() const { return &_data[1]; }192};193} // namespace std194 195void change(int &);196void observe(const int &);197 198void loopRef(std::vector<int> &Mutate, const std::vector<int> &Constant) {199  for (auto &Data : Mutate) {200    change(Data);201  }202  for (auto &Data : Constant) {203    // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto &Data' can be declared as 'const auto &Data'204    // CHECK-FIXES: for (const auto &Data : Constant) {205    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto &Data' can be declared as 'const auto &Data'206    // CHECK-FIXES-ALIAS: for (const auto &Data : Constant) {207    observe(Data);208  }209}210 211void loopPtr(const std::vector<int *> &Mutate, const std::vector<const int *> &Constant) {212  for (auto Data : Mutate) {213    // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'auto *Data'214    // CHECK-FIXES: for (auto *Data : Mutate) {215    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'auto *Data'216    // CHECK-FIXES-ALIAS: for (auto *Data : Mutate) {217    change(*Data);218  }219  for (auto Data : Constant) {220    // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'const auto *Data'221    // CHECK-FIXES: for (const auto *Data : Constant) {222    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'const auto *Data'223    // CHECK-FIXES-ALIAS: for (const auto *Data : Constant) {224    observe(*Data);225  }226}227 228template <typename T>229void tempLoopPtr(std::vector<T *> &MutateTemplate, std::vector<const T *> &ConstantTemplate) {230  for (auto Data : MutateTemplate) {231    // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'auto *Data'232    // CHECK-FIXES: for (auto *Data : MutateTemplate) {233    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'auto *Data'234    // CHECK-FIXES-ALIAS: for (auto *Data : MutateTemplate) {235    change(*Data);236  }237  //FixMe238  for (auto Data : ConstantTemplate) {239    // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: 'auto Data' can be declared as 'const auto *Data'240    // CHECK-FIXES: for (const auto *Data : ConstantTemplate) {241    // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:8: warning: 'auto Data' can be declared as 'const auto *Data'242    // CHECK-FIXES-ALIAS: for (const auto *Data : ConstantTemplate) {243    observe(*Data);244  }245}246 247template <typename T>248class TemplateLoopPtr {249public:250  void operator()(const std::vector<T *> &MClassTemplate, const std::vector<const T *> &CClassTemplate) {251    for (auto Data : MClassTemplate) {252      // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: 'auto Data' can be declared as 'auto *Data'253      // CHECK-FIXES: for (auto *Data : MClassTemplate) {254      // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:10: warning: 'auto Data' can be declared as 'auto *Data'255      // CHECK-FIXES-ALIAS: for (auto *Data : MClassTemplate) {256      change(*Data);257    }258    //FixMe259    for (auto Data : CClassTemplate) {260      // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: 'auto Data' can be declared as 'const auto *Data'261      // CHECK-FIXES: for (const auto *Data : CClassTemplate) {262      // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:10: warning: 'auto Data' can be declared as 'const auto *Data'263      // CHECK-FIXES-ALIAS: for (const auto *Data : CClassTemplate) {264      observe(*Data);265    }266  }267};268 269void bar() {270  std::vector<int> Vec;271  std::vector<int *> PtrVec;272  std::vector<const int *> CPtrVec;273  loopRef(Vec, Vec);274  loopPtr(PtrVec, CPtrVec);275  tempLoopPtr(PtrVec, CPtrVec);276  TemplateLoopPtr<int>()(PtrVec, CPtrVec);277}278 279typedef int *(*functionRetPtr)();280typedef int (*functionRetVal)();281 282functionRetPtr getPtrFunction();283functionRetVal getValFunction();284 285void baz() {286  auto MyFunctionPtr = getPtrFunction();287  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto MyFunctionPtr' can be declared as 'auto *MyFunctionPtr'288  // CHECK-FIXES-NOT: auto *MyFunctionPtr = getPtrFunction();289  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-1]]:3: warning: 'auto MyFunctionPtr' can be declared as 'auto *MyFunctionPtr'290  // CHECK-FIXES-NOT-ALIAS: auto *MyFunctionPtr = getPtrFunction();291  auto MyFunctionVal = getValFunction();292  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto MyFunctionVal' can be declared as 'auto *MyFunctionVal'293  // CHECK-FIXES-NOT: auto *MyFunctionVal = getValFunction();294  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto MyFunctionVal' can be declared as 'auto *MyFunctionVal'295  // CHECK-FIXES-NOT-ALIAS: auto *MyFunctionVal = getValFunction();296 297  auto LambdaTest = [] { return 0; };298  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto LambdaTest' can be declared as 'auto *LambdaTest'299  // CHECK-FIXES-NOT: auto *LambdaTest = [] { return 0; };300  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto LambdaTest' can be declared as 'auto *LambdaTest'301  // CHECK-FIXES-NOT-ALIAS: auto *LambdaTest = [] { return 0; };302 303  auto LambdaTest2 = +[] { return 0; };304  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto LambdaTest2' can be declared as 'auto *LambdaTest2'305  // CHECK-FIXES-NOT: auto *LambdaTest2 = +[] { return 0; };306  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto LambdaTest2' can be declared as 'auto *LambdaTest2'307  // CHECK-FIXES-NOT-ALIAS: auto *LambdaTest2 = +[] { return 0; };308 309  auto MyFunctionRef = *getPtrFunction();310  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:3: warning: 'auto MyFunctionRef' can be declared as 'auto *MyFunctionRef'311  // CHECK-FIXES-NOT: auto *MyFunctionRef = *getPtrFunction();312  // CHECK-MESSAGES-NOT-ALIAS: :[[@LINE-3]]:3: warning: 'auto MyFunctionRef' can be declared as 'auto *MyFunctionRef'313  // CHECK-FIXES-NOT-ALIAS: auto *MyFunctionRef = *getPtrFunction();314 315  auto &MyFunctionRef2 = *getPtrFunction();316}317 318namespace std {319 320template<typename T, int N>321struct array {322  typedef T value_type;323 324  typedef value_type* iterator;325  typedef value_type* Iterator;326  using using_iterator = T*;327  typedef const value_type* const_iterator;328  typedef const value_type* constIterator;329 330  struct Ignored2 {};331  using NotIgnored2 = Ignored2;332 333  iterator begin() { return nullptr; }334  const_iterator begin() const { return nullptr; }335  iterator end() { return nullptr; }336  const_iterator end() const { return nullptr; }337};338 339struct Iterator {};340 341struct Ignored2 {}; // should not be ignored342 343} // namespace std344 345typedef std::Iterator iterator;346 347namespace my {348namespace ns {349 350struct Ignored1 {};351 352using NotIgnored1 = Ignored1;353typedef Ignored1 NotIgnored2;354 355} // namespace ns356 357struct Ignored1 {}; // should not be ignored358 359} // namespace my360 361typedef int *MyIgnoredPtr;362MyIgnoredPtr getIgnoredPtr();363 364void ignored_types() {365  auto ignored_ptr = getIgnoredPtr();366  // CHECK-MESSAGES-NOT: warning: 'auto ignored_ptr' can be declared as 'auto *ignored_ptr'367  // CHECK-FIXES-NOT: auto *ignored_ptr = getIgnoredPtr();368 369  std::array<int, 4> arr;370  std::array<int, 4> carr;371 372  auto it1 = arr.begin();373  // CHECK-MESSAGES-NOT: warning: 'auto it' can be declared as 'auto *it'374  // CHECK-FIXES-NOT: auto *it = vec.it_begin();375  376  auto it2 = carr.begin();377  // CHECK-MESSAGES-NOT: warning: 'auto it2' can be declared as 'auto *it2'378  // CHECK-FIXES-NOT: auto *it2 = carr.begin();379 380  auto it3 = std::array<int, 4>::iterator{};381  // CHECK-MESSAGES-NOT: warning: 'auto it3' can be declared as 'auto *it3'382  // CHECK-FIXES-NOT: auto *it3 = std::array<int, 4>::iterator{};383 384  auto it4 = std::array<int, 4>::Iterator{};385  // CHECK-MESSAGES-NOT: warning: 'auto it4' can be declared as 'auto *it4'386  // CHECK-FIXES-NOT: auto *it4 = std::array<int, 4>::Iterator{};387 388  auto it5 = std::array<int, 4>::using_iterator{};389  // CHECK-MESSAGES-NOT: warning: 'auto it5' can be declared as 'auto *it5'390  // CHECK-FIXES-NOT: auto *it5 = std::array<int, 4>::using_iterator{};391 392  auto it6 = std::array<int, 4>::const_iterator{};393  // CHECK-MESSAGES-NOT: warning: 'auto it6' can be declared as 'auto *it6'394  // CHECK-FIXES-NOT: auto *it6 = std::array<int, 4>::const_iterator{};395 396  auto it7 = std::array<int, 4>::constIterator{};397  // CHECK-MESSAGES-NOT: warning: 'auto it7' can be declared as 'auto *it7'398  // CHECK-FIXES-NOT: auto *it7 = std::array<int, 4>::constIterator{};399 400  auto it8 = new std::Iterator();401  // CHECK-MESSAGES-NOT: warning: 'auto it8' can be declared as 'auto *it8'402  // CHECK-FIXES-NOT: auto *it8 = new std::Iterator();403 404  auto it9 = new iterator();405  // CHECK-MESSAGES-NOT: warning: 'auto it9' can be declared as 'auto *it9'406  // CHECK-FIXES-NOT: auto *it9 = new iterator();407 408  auto arr_ignored2 = new std::array<int, 4>::Ignored2();409  // CHECK-MESSAGES-NOT: warning: 'auto arr_ignored2' can be declared as 'auto *arr_ignored2'410  // CHECK-FIXES-NOT: auto *arr_ignored2 = new std::array<int, 4>::Ignored2();411 412  auto arr_not_ignored2 = new std::array<int, 4>::NotIgnored2();413  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto arr_not_ignored2' can be declared as 'auto *arr_not_ignored2'414  // CHECK-FIXES: auto *arr_not_ignored2 = new std::array<int, 4>::NotIgnored2();415  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto arr_not_ignored2' can be declared as 'auto *arr_not_ignored2'416  // CHECK-FIXES-ALIAS: auto *arr_not_ignored2 = new std::array<int, 4>::NotIgnored2();417 418  auto not_ignored2 = new std::Ignored2();419  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not_ignored2' can be declared as 'auto *not_ignored2'420  // CHECK-FIXES: auto *not_ignored2 = new std::Ignored2();421  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not_ignored2' can be declared as 'auto *not_ignored2'422  // CHECK-FIXES-ALIAS: auto *not_ignored2 = new std::Ignored2();423 424  auto ignored1 = new my::ns::Ignored1();425  // CHECK-MESSAGES-NOT: warning: 'auto ignored1' can be declared as 'auto *ignored1'426  // CHECK-FIXES-NOT: auto *ignored1 = new my::ns::Ignored1();427 428  auto not_ignored1 = new my::ns::NotIgnored1();429  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not_ignored1' can be declared as 'auto *not_ignored1'430  // CHECK-FIXES: auto *not_ignored1 = new my::ns::NotIgnored1();431  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not_ignored1' can be declared as 'auto *not_ignored1'432  // CHECK-FIXES-ALIAS: auto *not_ignored1 = new my::ns::NotIgnored1();433 434  auto not2_ignored1 = new my::ns::NotIgnored2();435  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not2_ignored1' can be declared as 'auto *not2_ignored1'436  // CHECK-FIXES: auto *not2_ignored1 = new my::ns::NotIgnored2();437  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not2_ignored1' can be declared as 'auto *not2_ignored1'438  // CHECK-FIXES-ALIAS: auto *not2_ignored1 = new my::ns::NotIgnored2();439 440  auto not3_ignored1 = new my::Ignored1();441  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: 'auto not3_ignored1' can be declared as 'auto *not3_ignored1'442  // CHECK-FIXES: auto *not3_ignored1 = new my::Ignored1();443  // CHECK-MESSAGES-ALIAS: :[[@LINE-3]]:3: warning: 'auto not3_ignored1' can be declared as 'auto *not3_ignored1'444  // CHECK-FIXES-ALIAS: auto *not3_ignored1 = new my::Ignored1();445}446 447template <typename T>448void ignored_types_template(std::array<T, 4> arr, const std::array<T, 4>& carr) {449  auto it1 = arr.begin();450  // CHECK-MESSAGES-NOT: warning: 'auto it' can be declared as 'auto *it'451  // CHECK-FIXES-NOT: auto *it = arr.it_begin();452  453  auto it2 = carr.begin();454  // CHECK-MESSAGES-NOT: warning: 'auto it2' can be declared as 'auto *it2'455  // CHECK-FIXES-NOT: auto *it2 = carr.begin();456 457  for (auto Data : arr) {458    // CHECK-MESSAGES-NOT: warning: 'auto Data' can be declared as 'auto *Data'459    // CHECK-FIXES-NOT: for (auto *Data : MClassTemplate) {460    change(*Data);461  }462 463  for (auto Data : carr) {464    // CHECK-MESSAGES-NOT: warning: 'auto Data' can be declared as 'const auto *Data'465    // CHECK-FIXES-NOT: for (const auto *Data : MClassTemplate) {466    change(*Data);467  }468}469