xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/loop-convert-const.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s modernize-loop-convert %t
2*89a1d03eSRichard 
3*89a1d03eSRichard struct Str {
4*89a1d03eSRichard   Str() = default;
5*89a1d03eSRichard   Str(const Str &) = default;
6*89a1d03eSRichard   void constMember(int) const;
7*89a1d03eSRichard   void nonConstMember(int);
8*89a1d03eSRichard   bool operator<(const Str &str) const;     // const operator.
9*89a1d03eSRichard   Str &operator=(const Str &str) = default; // non const operator.
10*89a1d03eSRichard };
11*89a1d03eSRichard 
12*89a1d03eSRichard // This class is non-trivially copyable because the copy-constructor and copy
13*89a1d03eSRichard // assignment take non-const references and are user-provided.
14*89a1d03eSRichard struct ModifiesRightSide {
15*89a1d03eSRichard   ModifiesRightSide() = default;
16*89a1d03eSRichard   ModifiesRightSide(ModifiesRightSide &);
17*89a1d03eSRichard   bool operator<(ModifiesRightSide &) const;
18*89a1d03eSRichard   ModifiesRightSide &operator=(ModifiesRightSide &);
19*89a1d03eSRichard };
20*89a1d03eSRichard 
21*89a1d03eSRichard template <typename T>
22*89a1d03eSRichard void copyArg(T);
23*89a1d03eSRichard 
24*89a1d03eSRichard template <typename T>
25*89a1d03eSRichard void nonConstRefArg(T &);
26*89a1d03eSRichard 
27*89a1d03eSRichard // If we define this as a template, the type is deduced to "T&",
28*89a1d03eSRichard // and "const (T&) &" is the same as "T& &", and this collapses to "T&".
29*89a1d03eSRichard void constRefArg(const Str &);
30*89a1d03eSRichard void constRefArg(const ModifiesRightSide &);
31*89a1d03eSRichard void constRefArg(const int &);
32*89a1d03eSRichard 
33*89a1d03eSRichard void foo();
34*89a1d03eSRichard 
35*89a1d03eSRichard const int N = 10;
36*89a1d03eSRichard Str Array[N], OtherStr;
37*89a1d03eSRichard ModifiesRightSide Right[N], OtherRight;
38*89a1d03eSRichard int Ints[N], OtherInt;
39*89a1d03eSRichard 
memberFunctionsAndOperators()40*89a1d03eSRichard void memberFunctionsAndOperators() {
41*89a1d03eSRichard   // Calling const member functions or operator is a const usage.
42*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
43*89a1d03eSRichard     Array[I].constMember(0);
44*89a1d03eSRichard   }
45*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead [modernize-loop-convert]
46*89a1d03eSRichard   // CHECK-FIXES: for (auto I : Array)
47*89a1d03eSRichard   // CHECK-FIXES-NEXT: I.constMember(0);
48*89a1d03eSRichard 
49*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
50*89a1d03eSRichard     if (Array[I] < OtherStr)
51*89a1d03eSRichard       foo();
52*89a1d03eSRichard   }
53*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
54*89a1d03eSRichard   // CHECK-FIXES: for (auto I : Array)
55*89a1d03eSRichard   // CHECK-FIXES-NEXT: if (I < OtherStr)
56*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
57*89a1d03eSRichard     if (Right[I] < OtherRight)
58*89a1d03eSRichard       foo();
59*89a1d03eSRichard   }
60*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
61*89a1d03eSRichard   // CHECK-FIXES: for (const auto & I : Right)
62*89a1d03eSRichard   // CHECK-FIXES-NEXT: if (I < OtherRight)
63*89a1d03eSRichard 
64*89a1d03eSRichard   // Calling non-const member functions is not.
65*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
66*89a1d03eSRichard     Array[I].nonConstMember(0);
67*89a1d03eSRichard   }
68*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
69*89a1d03eSRichard   // CHECK-FIXES: for (auto & I : Array)
70*89a1d03eSRichard   // CHECK-FIXES-NEXT: I.nonConstMember(0);
71*89a1d03eSRichard 
72*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
73*89a1d03eSRichard     Array[I] = OtherStr;
74*89a1d03eSRichard   }
75*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
76*89a1d03eSRichard   // CHECK-FIXES: for (auto & I : Array)
77*89a1d03eSRichard   // CHECK-FIXES-NEXT: I = OtherStr;
78*89a1d03eSRichard 
79*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
80*89a1d03eSRichard     Right[I] = OtherRight;
81*89a1d03eSRichard   }
82*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
83*89a1d03eSRichard   // CHECK-FIXES: for (auto & I : Right)
84*89a1d03eSRichard   // CHECK-FIXES-NEXT: I = OtherRight;
85*89a1d03eSRichard }
86*89a1d03eSRichard 
usedAsParameterToFunctionOrOperator()87*89a1d03eSRichard void usedAsParameterToFunctionOrOperator() {
88*89a1d03eSRichard   // Copying is OK, as long as the copy constructor takes a const-reference.
89*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
90*89a1d03eSRichard     copyArg(Array[I]);
91*89a1d03eSRichard   }
92*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
93*89a1d03eSRichard   // CHECK-FIXES: for (auto I : Array)
94*89a1d03eSRichard   // CHECK-FIXES-NEXT: copyArg(I);
95*89a1d03eSRichard 
96*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
97*89a1d03eSRichard     copyArg(Right[I]);
98*89a1d03eSRichard   }
99*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
100*89a1d03eSRichard   // CHECK-FIXES: for (auto & I : Right)
101*89a1d03eSRichard   // CHECK-FIXES-NEXT: copyArg(I);
102*89a1d03eSRichard 
103*89a1d03eSRichard   // Using as a const reference argument is allowed.
104*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
105*89a1d03eSRichard     constRefArg(Array[I]);
106*89a1d03eSRichard   }
107*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
108*89a1d03eSRichard   // CHECK-FIXES: for (auto I : Array)
109*89a1d03eSRichard   // CHECK-FIXES-NEXT: constRefArg(I);
110*89a1d03eSRichard 
111*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
112*89a1d03eSRichard     if (OtherStr < Array[I])
113*89a1d03eSRichard       foo();
114*89a1d03eSRichard   }
115*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
116*89a1d03eSRichard   // CHECK-FIXES: for (auto I : Array)
117*89a1d03eSRichard   // CHECK-FIXES-NEXT: if (OtherStr < I)
118*89a1d03eSRichard 
119*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
120*89a1d03eSRichard     constRefArg(Right[I]);
121*89a1d03eSRichard   }
122*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
123*89a1d03eSRichard   // CHECK-FIXES: for (const auto & I : Right)
124*89a1d03eSRichard   // CHECK-FIXES-NEXT: constRefArg(I);
125*89a1d03eSRichard 
126*89a1d03eSRichard   // Using as a non-const reference is not.
127*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
128*89a1d03eSRichard     nonConstRefArg(Array[I]);
129*89a1d03eSRichard   }
130*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
131*89a1d03eSRichard   // CHECK-FIXES: for (auto & I : Array)
132*89a1d03eSRichard   // CHECK-FIXES-NEXT: nonConstRefArg(I);
133*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
134*89a1d03eSRichard     nonConstRefArg(Right[I]);
135*89a1d03eSRichard   }
136*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
137*89a1d03eSRichard   // CHECK-FIXES: for (auto & I : Right)
138*89a1d03eSRichard   // CHECK-FIXES-NEXT: nonConstRefArg(I);
139*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
140*89a1d03eSRichard     if (OtherRight < Right[I])
141*89a1d03eSRichard       foo();
142*89a1d03eSRichard   }
143*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
144*89a1d03eSRichard   // CHECK-FIXES: for (auto & I : Right)
145*89a1d03eSRichard   // CHECK-FIXES-NEXT: if (OtherRight < I)
146*89a1d03eSRichard }
147*89a1d03eSRichard 
primitiveTypes()148*89a1d03eSRichard void primitiveTypes() {
149*89a1d03eSRichard   // As argument to a function.
150*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
151*89a1d03eSRichard     copyArg(Ints[I]);
152*89a1d03eSRichard   }
153*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
154*89a1d03eSRichard   // CHECK-FIXES: for (int Int : Ints)
155*89a1d03eSRichard   // CHECK-FIXES-NEXT: copyArg(Int);
156*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
157*89a1d03eSRichard     constRefArg(Ints[I]);
158*89a1d03eSRichard   }
159*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
160*89a1d03eSRichard   // CHECK-FIXES: for (int Int : Ints)
161*89a1d03eSRichard   // CHECK-FIXES-NEXT: constRefArg(Int);
162*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
163*89a1d03eSRichard     nonConstRefArg(Ints[I]);
164*89a1d03eSRichard   }
165*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
166*89a1d03eSRichard   // CHECK-FIXES: for (int & Int : Ints)
167*89a1d03eSRichard   // CHECK-FIXES-NEXT: nonConstRefArg(Int);
168*89a1d03eSRichard 
169*89a1d03eSRichard   // Builtin operators.
170*89a1d03eSRichard   // Comparisons.
171*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
172*89a1d03eSRichard     if (Ints[I] < N)
173*89a1d03eSRichard       foo();
174*89a1d03eSRichard   }
175*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
176*89a1d03eSRichard   // CHECK-FIXES: for (int Int : Ints)
177*89a1d03eSRichard   // CHECK-FIXES-NEXT: if (Int < N)
178*89a1d03eSRichard 
179*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
180*89a1d03eSRichard     if (N == Ints[I])
181*89a1d03eSRichard       foo();
182*89a1d03eSRichard   }
183*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
184*89a1d03eSRichard   // CHECK-FIXES: for (int Int : Ints)
185*89a1d03eSRichard   // CHECK-FIXES-NEXT: if (N == Int)
186*89a1d03eSRichard 
187*89a1d03eSRichard   // Assignment.
188*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
189*89a1d03eSRichard     Ints[I] = OtherInt;
190*89a1d03eSRichard   }
191*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
192*89a1d03eSRichard   // CHECK-FIXES: for (int & Int : Ints)
193*89a1d03eSRichard   // CHECK-FIXES-NEXT: Int = OtherInt;
194*89a1d03eSRichard 
195*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
196*89a1d03eSRichard     OtherInt = Ints[I];
197*89a1d03eSRichard   }
198*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
199*89a1d03eSRichard   // CHECK-FIXES: for (int Int : Ints)
200*89a1d03eSRichard   // CHECK-FIXES-NEXT: OtherInt = Int;
201*89a1d03eSRichard 
202*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
203*89a1d03eSRichard     OtherInt = Ints[I] = OtherInt;
204*89a1d03eSRichard   }
205*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
206*89a1d03eSRichard   // CHECK-FIXES: for (int & Int : Ints)
207*89a1d03eSRichard   // CHECK-FIXES-NEXT: OtherInt = Int = OtherInt;
208*89a1d03eSRichard 
209*89a1d03eSRichard   // Arithmetic operations.
210*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
211*89a1d03eSRichard     OtherInt += Ints[I];
212*89a1d03eSRichard   }
213*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
214*89a1d03eSRichard   // CHECK-FIXES: for (int Int : Ints)
215*89a1d03eSRichard   // CHECK-FIXES-NEXT: OtherInt += Int;
216*89a1d03eSRichard 
217*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
218*89a1d03eSRichard     Ints[I] += Ints[I];
219*89a1d03eSRichard   }
220*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
221*89a1d03eSRichard   // CHECK-FIXES: for (int & Int : Ints)
222*89a1d03eSRichard   // CHECK-FIXES-NEXT: Int += Int;
223*89a1d03eSRichard 
224*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
225*89a1d03eSRichard     int Res = 5 * (Ints[I] + 1) - Ints[I];
226*89a1d03eSRichard   }
227*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
228*89a1d03eSRichard   // CHECK-FIXES: for (int Int : Ints)
229*89a1d03eSRichard   // CHECK-FIXES-NEXT: int Res = 5 * (Int + 1) - Int;
230*89a1d03eSRichard }
231*89a1d03eSRichard 
takingReferences()232*89a1d03eSRichard void takingReferences() {
233*89a1d03eSRichard   // We do it twice to prevent the check from thinking that they are aliases.
234*89a1d03eSRichard 
235*89a1d03eSRichard   // Class type.
236*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
237*89a1d03eSRichard     Str &J = Array[I];
238*89a1d03eSRichard     Str &K = Array[I];
239*89a1d03eSRichard   }
240*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
241*89a1d03eSRichard   // CHECK-FIXES: for (auto & I : Array)
242*89a1d03eSRichard   // CHECK-FIXES-NEXT: Str &J = I;
243*89a1d03eSRichard   // CHECK-FIXES-NEXT: Str &K = I;
244*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
245*89a1d03eSRichard     const Str &J = Array[I];
246*89a1d03eSRichard     const Str &K = Array[I];
247*89a1d03eSRichard   }
248*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
249*89a1d03eSRichard   // CHECK-FIXES: for (auto I : Array)
250*89a1d03eSRichard   // CHECK-FIXES-NEXT: const Str &J = I;
251*89a1d03eSRichard   // CHECK-FIXES-NEXT: const Str &K = I;
252*89a1d03eSRichard 
253*89a1d03eSRichard   // Primitive type.
254*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
255*89a1d03eSRichard     int &J = Ints[I];
256*89a1d03eSRichard     int &K = Ints[I];
257*89a1d03eSRichard   }
258*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
259*89a1d03eSRichard   // CHECK-FIXES: for (int & Int : Ints)
260*89a1d03eSRichard   // CHECK-FIXES-NEXT: int &J = Int;
261*89a1d03eSRichard   // CHECK-FIXES-NEXT: int &K = Int;
262*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
263*89a1d03eSRichard     const int &J = Ints[I];
264*89a1d03eSRichard     const int &K = Ints[I];
265*89a1d03eSRichard   }
266*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
267*89a1d03eSRichard   // CHECK-FIXES: for (int Int : Ints)
268*89a1d03eSRichard   // CHECK-FIXES-NEXT: const int &J = Int;
269*89a1d03eSRichard   // CHECK-FIXES-NEXT: const int &K = Int;
270*89a1d03eSRichard 
271*89a1d03eSRichard   // Aliases.
272*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
273*89a1d03eSRichard     const Str &J = Array[I];
274*89a1d03eSRichard     (void)J;
275*89a1d03eSRichard   }
276*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
277*89a1d03eSRichard   // CHECK-FIXES: for (auto J : Array)
278*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
279*89a1d03eSRichard     Str &J = Array[I];
280*89a1d03eSRichard     (void)J;
281*89a1d03eSRichard   }
282*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
283*89a1d03eSRichard   // CHECK-FIXES: for (auto & J : Array)
284*89a1d03eSRichard 
285*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
286*89a1d03eSRichard     const int &J = Ints[I];
287*89a1d03eSRichard     (void)J;
288*89a1d03eSRichard   }
289*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
290*89a1d03eSRichard   // CHECK-FIXES: for (int J : Ints)
291*89a1d03eSRichard 
292*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
293*89a1d03eSRichard     int &J = Ints[I];
294*89a1d03eSRichard     (void)J;
295*89a1d03eSRichard   }
296*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
297*89a1d03eSRichard   // CHECK-FIXES: for (int & J : Ints)
298*89a1d03eSRichard }
299*89a1d03eSRichard 
300*89a1d03eSRichard template <class T>
301*89a1d03eSRichard struct vector {
302*89a1d03eSRichard   unsigned size() const;
303*89a1d03eSRichard   const T &operator[](int) const;
304*89a1d03eSRichard   T &operator[](int);
305*89a1d03eSRichard   T *begin();
306*89a1d03eSRichard   T *end();
307*89a1d03eSRichard   const T *begin() const;
308*89a1d03eSRichard   const T *end() const;
309*89a1d03eSRichard };
310*89a1d03eSRichard 
311*89a1d03eSRichard // If the elements are already constant, we won't do any ImplicitCast to const.
testContainerOfConstIents()312*89a1d03eSRichard void testContainerOfConstIents() {
313*89a1d03eSRichard   const int Ints[N]{};
314*89a1d03eSRichard   for (int I = 0; I < N; ++I) {
315*89a1d03eSRichard     OtherInt -= Ints[I];
316*89a1d03eSRichard   }
317*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop
318*89a1d03eSRichard   // CHECK-FIXES: for (int Int : Ints)
319*89a1d03eSRichard 
320*89a1d03eSRichard   vector<const Str> Strs;
321*89a1d03eSRichard   for (int I = 0; I < Strs.size(); ++I) {
322*89a1d03eSRichard     Strs[I].constMember(0);
323*89a1d03eSRichard     constRefArg(Strs[I]);
324*89a1d03eSRichard   }
325*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop
326*89a1d03eSRichard   // CHECK-FIXES: for (auto Str : Strs)
327*89a1d03eSRichard }
328*89a1d03eSRichard 
329*89a1d03eSRichard // When we are inside a const-qualified member functions, all the data members
330*89a1d03eSRichard // are implicitly set as const. As before, there won't be any ImplicitCast to
331*89a1d03eSRichard // const in their usages.
332*89a1d03eSRichard class TestInsideConstFunction {
333*89a1d03eSRichard   const static int N = 10;
334*89a1d03eSRichard   int Ints[N];
335*89a1d03eSRichard   Str Array[N];
336*89a1d03eSRichard   vector<int> V;
337*89a1d03eSRichard 
foo() const338*89a1d03eSRichard   void foo() const {
339*89a1d03eSRichard     for (int I = 0; I < N; ++I) {
340*89a1d03eSRichard       if (Ints[I])
341*89a1d03eSRichard         copyArg(Ints[I]);
342*89a1d03eSRichard     }
343*89a1d03eSRichard     // CHECK-MESSAGES: :[[@LINE-4]]:5: warning: use range-based for loop
344*89a1d03eSRichard     // CHECK-FIXES: for (int Int : Ints)
345*89a1d03eSRichard 
346*89a1d03eSRichard     for (int I = 0; I < N; ++I) {
347*89a1d03eSRichard       Array[I].constMember(0);
348*89a1d03eSRichard       constRefArg(Array[I]);
349*89a1d03eSRichard     }
350*89a1d03eSRichard     // CHECK-MESSAGES: :[[@LINE-4]]:5: warning: use range-based for loop
351*89a1d03eSRichard     // CHECK-FIXES: for (auto I : Array)
352*89a1d03eSRichard 
353*89a1d03eSRichard     for (int I = 0; I < V.size(); ++I) {
354*89a1d03eSRichard       if (V[I])
355*89a1d03eSRichard         copyArg(V[I]);
356*89a1d03eSRichard     }
357*89a1d03eSRichard     // CHECK-MESSAGES: :[[@LINE-4]]:5: warning: use range-based for loop
358*89a1d03eSRichard     // CHECK-FIXES: for (int I : V)
359*89a1d03eSRichard   }
360*89a1d03eSRichard };
361