brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.3 KiB · a928b33 Raw
321 lines · cpp
1// RUN: %check_clang_tidy -std=c++11,c++14 %s modernize-use-auto %t -- -- -I %S/Inputs/use-auto2// FIXME: Fix the checker to work in C++17 mode.3 4#include "containers.h"5 6void f_array() {7  std::array<int, 4> C;8  std::array<int, 4>::iterator ArrayI1 = C.begin();9  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators [modernize-use-auto]10  // CHECK-FIXES: auto ArrayI1 = C.begin();11 12  std::array<int, 5>::reverse_iterator ArrayI2 = C.rbegin();13  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators14  // CHECK-FIXES: auto ArrayI2 = C.rbegin();15 16  const std::array<int, 3> D;17  std::array<int, 3>::const_iterator ArrayI3 = D.begin();18  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators19  // CHECK-FIXES: auto ArrayI3 = D.begin();20 21  std::array<int, 5>::const_reverse_iterator ArrayI4 = D.rbegin();22  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators23  // CHECK-FIXES: auto ArrayI4 = D.rbegin();24}25 26void f_deque() {27  std::deque<int> C;28  std::deque<int>::iterator DequeI1 = C.begin();29  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators30  // CHECK-FIXES: auto DequeI1 = C.begin();31 32  std::deque<int>::reverse_iterator DequeI2 = C.rbegin();33  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators34  // CHECK-FIXES: auto DequeI2 = C.rbegin();35 36  const std::deque<int> D;37  std::deque<int>::const_iterator DequeI3 = D.begin();38  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators39  // CHECK-FIXES: auto DequeI3 = D.begin();40 41  std::deque<int>::const_reverse_iterator DequeI4 = D.rbegin();42  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators43  // CHECK-FIXES: auto DequeI4 = D.rbegin();44}45 46void f_forward_list() {47  std::forward_list<int> C;48  std::forward_list<int>::iterator FListI1 = C.begin();49  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators50  // CHECK-FIXES: auto FListI1 = C.begin();51 52  const std::forward_list<int> D;53  std::forward_list<int>::const_iterator FListI2 = D.begin();54  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators55  // CHECK-FIXES: auto FListI2 = D.begin();56}57 58void f_list() {59  std::list<int> C;60  std::list<int>::iterator ListI1 = C.begin();61  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators62  // CHECK-FIXES: auto ListI1 = C.begin();63  std::list<int>::reverse_iterator ListI2 = C.rbegin();64  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators65  // CHECK-FIXES: auto ListI2 = C.rbegin();66 67  const std::list<int> D;68  std::list<int>::const_iterator ListI3 = D.begin();69  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators70  // CHECK-FIXES: auto ListI3 = D.begin();71  std::list<int>::const_reverse_iterator ListI4 = D.rbegin();72  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators73  // CHECK-FIXES: auto ListI4 = D.rbegin();74}75 76void f_vector() {77  std::vector<int> C;78  std::vector<int>::iterator VecI1 = C.begin();79  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators80  // CHECK-FIXES: auto VecI1 = C.begin();81 82  std::vector<int>::reverse_iterator VecI2 = C.rbegin();83  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators84  // CHECK-FIXES: auto VecI2 = C.rbegin();85 86  const std::vector<int> D;87  std::vector<int>::const_iterator VecI3 = D.begin();88  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators89  // CHECK-FIXES: auto VecI3 = D.begin();90 91  std::vector<int>::const_reverse_iterator VecI4 = D.rbegin();92  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators93  // CHECK-FIXES: auto VecI4 = D.rbegin();94}95 96void f_map() {97  std::map<int, int> C;98  std::map<int, int>::iterator MapI1 = C.begin();99  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators100  // CHECK-FIXES: auto MapI1 = C.begin();101 102  std::map<int, int>::reverse_iterator MapI2 = C.rbegin();103  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators104  // CHECK-FIXES: auto MapI2 = C.rbegin();105 106  const std::map<int, int> D;107  std::map<int, int>::const_iterator MapI3 = D.begin();108  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators109  // CHECK-FIXES: auto MapI3 = D.begin();110 111  std::map<int, int>::const_reverse_iterator MapI4 = D.rbegin();112  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators113  // CHECK-FIXES: auto MapI4 = D.rbegin();114}115 116void f_multimap() {117  std::multimap<int, int> C;118  std::multimap<int, int>::iterator MMapI1 = C.begin();119  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators120  // CHECK-FIXES: auto MMapI1 = C.begin();121 122  std::multimap<int, int>::reverse_iterator MMapI2 = C.rbegin();123  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators124  // CHECK-FIXES: auto MMapI2 = C.rbegin();125 126  const std::multimap<int, int> D;127  std::multimap<int, int>::const_iterator MMapI3 = D.begin();128  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators129  // CHECK-FIXES: auto MMapI3 = D.begin();130 131  std::multimap<int, int>::const_reverse_iterator MMapI4 = D.rbegin();132  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators133  // CHECK-FIXES: auto MMapI4 = D.rbegin();134}135 136void f_set() {137  std::set<int> C;138  std::set<int>::iterator SetI1 = C.begin();139  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators140  // CHECK-FIXES: auto SetI1 = C.begin();141 142  std::set<int>::reverse_iterator SetI2 = C.rbegin();143  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators144  // CHECK-FIXES: auto SetI2 = C.rbegin();145 146  const std::set<int> D;147  std::set<int>::const_iterator SetI3 = D.begin();148  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators149  // CHECK-FIXES: auto SetI3 = D.begin();150 151  std::set<int>::const_reverse_iterator SetI4 = D.rbegin();152  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators153  // CHECK-FIXES: auto SetI4 = D.rbegin();154}155 156void f_multiset() {157  std::multiset<int> C;158  std::multiset<int>::iterator MSetI1 = C.begin();159  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators160  // CHECK-FIXES: auto MSetI1 = C.begin();161 162  std::multiset<int>::reverse_iterator MSetI2 = C.rbegin();163  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators164  // CHECK-FIXES: auto MSetI2 = C.rbegin();165 166  const std::multiset<int> D;167  std::multiset<int>::const_iterator MSetI3 = D.begin();168  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators169  // CHECK-FIXES: auto MSetI3 = D.begin();170 171  std::multiset<int>::const_reverse_iterator MSetI4 = D.rbegin();172  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators173  // CHECK-FIXES: auto MSetI4 = D.rbegin();174}175 176void f_unordered_map() {177  std::unordered_map<int, int> C;178  std::unordered_map<int, int>::iterator UMapI1 = C.begin();179  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators180  // CHECK-FIXES: auto UMapI1 = C.begin();181 182  const std::unordered_map<int, int> D;183  std::unordered_map<int, int>::const_iterator UMapI2 = D.begin();184  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators185  // CHECK-FIXES: auto UMapI2 = D.begin();186}187 188void f_unordered_multimap() {189  std::unordered_multimap<int, int> C;190  std::unordered_multimap<int, int>::iterator UMMapI1 = C.begin();191  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators192  // CHECK-FIXES: auto UMMapI1 = C.begin();193 194  const std::unordered_multimap<int, int> D;195  std::unordered_multimap<int, int>::const_iterator UMMapI2 = D.begin();196  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators197  // CHECK-FIXES: auto UMMapI2 = D.begin();198}199 200void f_unordered_set() {201  std::unordered_set<int> C;202  std::unordered_set<int>::iterator USetI1 = C.begin();203  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators204  // CHECK-FIXES: auto USetI1 = C.begin();205 206  const std::unordered_set<int> D;207  std::unordered_set<int>::const_iterator USetI2 = D.begin();208  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators209  // CHECK-FIXES: auto USetI2 = D.begin();210}211 212void f_unordered_multiset() {213  std::unordered_multiset<int> C;214  std::unordered_multiset<int>::iterator UMSetI1 = C.begin();215  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators216  // CHECK-FIXES: auto UMSetI1 = C.begin();217 218  const std::unordered_multiset<int> D;219  std::unordered_multiset<int>::const_iterator UMSetI2 = D.begin();220  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators221  // CHECK-FIXES: auto UMSetI2 = D.begin();222}223 224typedef std::vector<int>::iterator int_iterator;225 226std::vector<int> Vec;227std::unordered_map<int, int> Map;228 229void sugar() {230  // Types with more sugar should work. Types with less should not.231  int_iterator more_sugar = Vec.begin();232  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators233  // CHECK-FIXES: auto more_sugar = Vec.begin();234}235 236void initializer_list() {237  // Initialization from initializer lists isn't allowed. Using 'auto' would238  // result in std::initializer_list being deduced for the type.239  std::unordered_map<int, int>::iterator I{Map.begin()};240  std::unordered_map<int, int>::iterator I2 = {Map.begin()};241}242 243void construction() {244  // Various forms of construction. Default constructors and constructors with245  // all-default parameters shouldn't get transformed. Construction from other246  // types is also not allowed.247 248  std::unordered_map<int, int>::iterator copy(Map.begin());249  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators250  // CHECK-FIXES: auto copy(Map.begin());251 252  std::unordered_map<int, int>::iterator def;253  std::unordered_map<int, int>::const_iterator constI;254 255  // Implicit conversion.256  std::unordered_map<int, int>::const_iterator constI2 = def;257  std::unordered_map<int, int>::const_iterator constI3(def);258 259  // Explicit conversion260  std::unordered_map<int, int>::const_iterator constI4261      = std::unordered_map<int, int>::const_iterator(def);262  // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use auto when declaring iterators263  // CHECK-FIXES: auto constI4264  // CHECK-FIXES-NEXT: = std::unordered_map<int, int>::const_iterator(def);265}266 267void pointer_to_iterator() {268  int_iterator I = Vec.begin();269  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators270  // CHECK-FIXES: auto I = Vec.begin();271 272  // Pointers and references to iterators are not transformed.273  int_iterator *IPtr = &I;274  int_iterator &IRef = I;275}276 277void loop() {278  for (std::vector<int>::iterator I = Vec.begin(); I != Vec.end(); ++I) {279    // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use auto when declaring iterators280    // CHECK-FIXES: for (auto I = Vec.begin(); I != Vec.end(); ++I) {281  }282 283  for (int_iterator I = Vec.begin(), E = Vec.end(); I != E; ++I) {284    // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use auto when declaring iterators285    // CHECK-FIXES: for (auto I = Vec.begin(), E = Vec.end(); I != E; ++I) {286  }287 288  std::vector<std::vector<int>::iterator> IterVec;289  for (std::vector<int>::iterator I : IterVec) {290    // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use auto when declaring iterators291    // CHECK-FIXES: for (auto I : IterVec) {292  }293}294 295void cv_qualifiers() {296  // Make sure references and cv qualifiers don't get removed (i.e. replaced297  // with just 'auto').298  const auto & I = Vec.begin();299  auto && I2 = Vec.begin();300}301 302void cleanup() {303  // Passing a string as an argument to introduce a temporary object that will304  // create an expression with cleanups.305  std::map<std::string, int> MapFind;306  std::map<std::string, int>::iterator I = MapFind.find("foo");307  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators308  // CHECK-FIXES: auto I = MapFind.find("foo");309}310 311void declaration_lists() {312  // Declaration lists that match the declaration type with written no-list313  // initializer are transformed.314  std::vector<int>::iterator I = Vec.begin(), E = Vec.end();315  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use auto when declaring iterators316  // CHECK-FIXES: auto I = Vec.begin(), E = Vec.end();317 318  // Declaration lists with non-initialized variables should not be transformed.319  std::vector<int>::iterator J = Vec.begin(), K;320}321