1 | // RUN: %check_clang_tidy %s modernize-loop-convert %t |
2 | |
3 | template <class T> |
4 | struct Vector { |
5 | using iterator = T*; |
6 | unsigned size() const; |
7 | const T &operator[](int) const; |
8 | T &operator[](int); |
9 | T *begin(); |
10 | T *end(); |
11 | const T *begin() const; |
12 | const T *end() const; |
13 | }; |
14 | |
15 | template <typename T> |
16 | void copyArg(T); |
17 | |
18 | class TestArrayOfVector { |
19 | Vector<int> W[2]; |
20 | |
21 | void foo() const { |
22 | for (int I = 0; I < W[0].size(); ++I) { |
23 | if (W[0][I]) |
24 | copyArg(W[0][I]); |
25 | } |
26 | // CHECK-MESSAGES: :[[@LINE-4]]:5: warning: use range-based for loop |
27 | // CHECK-FIXES: for (int I : W[0]) { |
28 | // CHECK-FIXES-NEXT: if (I) |
29 | // CHECK-FIXES-NEXT: copyArg(I); |
30 | } |
31 | }; |
32 | |
33 | class TestVectorOfVector { |
34 | Vector<Vector<int>> X; |
35 | |
36 | void foo() const { |
37 | for (int J = 0; J < X[0].size(); ++J) { |
38 | if (X[0][J]) |
39 | copyArg(X[0][J]); |
40 | } |
41 | // CHECK-MESSAGES: :[[@LINE-4]]:5: warning: use range-based for loop |
42 | // CHECK-FIXES: for (int J : X[0]) { |
43 | // CHECK-FIXES-NEXT: if (J) |
44 | // CHECK-FIXES-NEXT: copyArg(J); |
45 | } |
46 | }; |
47 | |
48 | void testVectorOfVectorOfVector() { |
49 | Vector<Vector<Vector<int>>> Y; |
50 | for (int J = 0; J < Y[3].size(); ++J) { |
51 | if (Y[3][J][7]) |
52 | copyArg(Y[3][J][8]); |
53 | } |
54 | // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop |
55 | // CHECK-FIXES: for (auto & J : Y[3]) { |
56 | // CHECK-FIXES-NEXT: if (J[7]) |
57 | // CHECK-FIXES-NEXT: copyArg(J[8]); |
58 | |
59 | for (int J = 0; J < Y[3][4].size(); ++J) { |
60 | if (Y[3][4][J]) |
61 | copyArg(Y[3][4][J]); |
62 | } |
63 | // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop |
64 | // CHECK-FIXES: for (int J : Y[3][4]) { |
65 | // CHECK-FIXES-NEXT: if (J) |
66 | // CHECK-FIXES-NEXT: copyArg(J); |
67 | } |
68 | |
69 | void testVectorOfVectorIterator() { |
70 | Vector<Vector<int>> Z; |
71 | for (Vector<int>::iterator it = Z[4].begin(); it != Z[4].end(); ++it) { |
72 | if (*it) |
73 | copyArg(*it); |
74 | } |
75 | // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop |
76 | // CHECK-FIXES: for (int & it : Z[4]) { |
77 | // CHECK-FIXES-NEXT: if (it) |
78 | // CHECK-FIXES-NEXT: copyArg(it); |
79 | } |
80 | |