1
1
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wloop-analysis -verify %s
2
2
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wrange-loop-analysis -verify %s
3
+ // RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wloop-analysis -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
3
4
4
5
template <typename return_type>
5
6
struct Iterator {
@@ -67,14 +68,17 @@ void test0() {
67
68
for (const int &x : int_non_ref_container) {}
68
69
// expected-warning@-1 {{loop variable 'x' is always a copy because the range of type 'Container<int>' does not return a reference}}
69
70
// expected-note@-2 {{use non-reference type 'int'}}
71
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
70
72
71
73
for (const double &x : int_container) {}
72
74
// expected-warning@-1 {{loop variable 'x' has type 'const double &' but is initialized with type 'int' resulting in a copy}}
73
75
// expected-note@-2 {{use non-reference type 'double' to keep the copy or type 'const int &' to prevent copying}}
76
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:21-[[@LINE-3]]:22}:""
74
77
75
78
for (const Bar x : bar_container) {}
76
79
// expected-warning@-1 {{loop variable 'x' of type 'const Bar' creates a copy from type 'const Bar'}}
77
80
// expected-note@-2 {{use reference type 'const Bar &' to prevent copying}}
81
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:18}:"&"
78
82
}
79
83
80
84
void test1 () {
@@ -83,6 +87,7 @@ void test1() {
83
87
for (const int &x : A) {}
84
88
// expected-warning@-1 {{always a copy}}
85
89
// expected-note@-2 {{'int'}}
90
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
86
91
for (const int x : A) {}
87
92
// No warning, non-reference type indicates copy is made
88
93
// for (int &x : A) {}
@@ -93,6 +98,7 @@ void test1() {
93
98
for (const double &x : A) {}
94
99
// expected-warning@-1 {{always a copy}}
95
100
// expected-note@-2 {{'double'}}
101
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:21-[[@LINE-3]]:22}:""
96
102
for (const double x : A) {}
97
103
// No warning, non-reference type indicates copy is made
98
104
// for (double &x : A) {}
@@ -103,6 +109,7 @@ void test1() {
103
109
for (const Bar &x : A) {}
104
110
// expected-warning@-1 {{always a copy}}
105
111
// expected-note@-2 {{'Bar'}}
112
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
106
113
for (const Bar x : A) {}
107
114
// No warning, non-reference type indicates copy is made
108
115
// for (Bar &x : A) {}
@@ -126,6 +133,7 @@ void test2() {
126
133
for (const double &x : B) {}
127
134
// expected-warning@-1 {{resulting in a copy}}
128
135
// expected-note-re@-2 {{'double'{{.*}}'const int &'}}
136
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:21-[[@LINE-3]]:22}:""
129
137
for (const double x : B) {}
130
138
// for (double &x : B) {}
131
139
// Binding error
@@ -135,6 +143,7 @@ void test2() {
135
143
for (const Bar &x : B) {}
136
144
// expected-warning@-1 {{resulting in a copy}}
137
145
// expected-note@-2 {{'Bar'}}
146
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
138
147
for (const Bar x : B) {}
139
148
// for (Bar &x : B) {}
140
149
// Binding error
@@ -148,6 +157,7 @@ void test3() {
148
157
for (const Bar &x : C) {}
149
158
// expected-warning@-1 {{always a copy}}
150
159
// expected-note@-2 {{'Bar'}}
160
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
151
161
for (const Bar x : C) {}
152
162
// No warning, non-reference type indicates copy is made
153
163
// for (Bar &x : C) {}
@@ -158,6 +168,7 @@ void test3() {
158
168
for (const int &x : C) {}
159
169
// expected-warning@-1 {{always a copy}}
160
170
// expected-note@-2 {{'int'}}
171
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
161
172
for (const int x : C) {}
162
173
// No warning, copy made
163
174
// for (int &x : C) {}
@@ -174,6 +185,7 @@ void test4() {
174
185
for (const Bar x : D) {}
175
186
// expected-warning@-1 {{creates a copy}}
176
187
// expected-note@-2 {{'const Bar &'}}
188
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:18}:"&"
177
189
for (Bar &x : D) {}
178
190
// No warning
179
191
for (Bar x : D) {}
@@ -182,6 +194,7 @@ void test4() {
182
194
for (const int &x : D) {}
183
195
// expected-warning@-1 {{resulting in a copy}}
184
196
// expected-note-re@-2 {{'int'{{.*}}'const Bar &'}}
197
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
185
198
for (const int x : D) {}
186
199
// No warning
187
200
// for (int &x : D) {}
@@ -196,6 +209,7 @@ void test5() {
196
209
for (const Bar &x : E) {}
197
210
// expected-warning@-1 {{always a copy}}
198
211
// expected-note@-2 {{'Bar'}}
212
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
199
213
for (const Bar x : E) {}
200
214
// No warning, non-reference type indicates copy is made
201
215
// for (Bar &x : E) {}
@@ -210,6 +224,7 @@ void test6() {
210
224
for (const Bar &x : F) {}
211
225
// expected-warning@-1 {{resulting in a copy}}
212
226
// expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}}
227
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
213
228
for (const Bar x : F) {}
214
229
// No warning.
215
230
// for (Bar &x : F) {}
@@ -233,6 +248,7 @@ void test7() {
233
248
for (const int &x : G) {}
234
249
// expected-warning@-1 {{resulting in a copy}}
235
250
// expected-note-re@-2 {{'int'{{.*}}'const double &'}}
251
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
236
252
for (const int x : G) {}
237
253
// No warning
238
254
// for (int &x : G) {}
@@ -243,6 +259,7 @@ void test7() {
243
259
for (const Bar &x : G) {}
244
260
// expected-warning@-1 {{resulting in a copy}}
245
261
// expected-note-re@-2 {{'Bar'{{.*}}'const double &'}}
262
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
246
263
for (const Bar x : G) {}
247
264
// No warning
248
265
// for (int &Bar : G) {}
@@ -266,6 +283,7 @@ void test8() {
266
283
for (const Bar &x : H) {}
267
284
// expected-warning@-1 {{resulting in a copy}}
268
285
// expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}}
286
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
269
287
for (const Bar x : H) {}
270
288
// No warning
271
289
// for (Bar &x: H) {}
@@ -282,6 +300,7 @@ void test9() {
282
300
for (const Bar x : I) {}
283
301
// expected-warning@-1 {{creates a copy}}
284
302
// expected-note@-2 {{'const Bar &'}}
303
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:18}:"&"
285
304
for (Bar &x : I) {}
286
305
// No warning
287
306
for (Bar x : I) {}
@@ -290,10 +309,35 @@ void test9() {
290
309
for (const int &x : I) {}
291
310
// expected-warning@-1 {{resulting in a copy}}
292
311
// expected-note-re@-2 {{'int'{{.*}}'const Bar &'}}
312
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
293
313
for (const int x : I) {}
294
314
// No warning
295
315
// for (int &x : I) {}
296
316
// Binding error
297
317
for (int x : I) {}
298
318
// No warning
299
319
}
320
+
321
+ void test10 () {
322
+ Container<Bar> C;
323
+
324
+ for (const Bar &x : C) {}
325
+ // expected-warning@-1 {{always a copy}}
326
+ // expected-note@-2 {{'Bar'}}
327
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
328
+
329
+ for (const Bar& x : C) {}
330
+ // expected-warning@-1 {{always a copy}}
331
+ // expected-note@-2 {{'Bar'}}
332
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:17-[[@LINE-3]]:18}:""
333
+
334
+ for (const Bar & x : C) {}
335
+ // expected-warning@-1 {{always a copy}}
336
+ // expected-note@-2 {{'Bar'}}
337
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:20}:""
338
+
339
+ for (const Bar&x : C) {}
340
+ // expected-warning@-1 {{always a copy}}
341
+ // expected-note@-2 {{'Bar'}}
342
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:17-[[@LINE-3]]:18}:" "
343
+ }
0 commit comments