@@ -84,34 +84,46 @@ void test0() {
84
84
void test1 () {
85
85
Container<int > A;
86
86
87
+ for (const int &&x : A) {}
88
+ // No warning, rvalue-reference to the temporary
87
89
for (const int &x : A) {}
88
90
// expected-warning@-1 {{always a copy}}
89
91
// expected-note@-2 {{'int'}}
90
92
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
91
93
for (const int x : A) {}
92
94
// No warning, non-reference type indicates copy is made
95
+ for (int && x : A) {}
96
+ // No warning, rvalue-reference to the temporary
93
97
// for (int &x : A) {}
94
98
// Binding error
95
99
for (int x : A) {}
96
100
// No warning, non-reference type indicates copy is made
97
101
102
+ for (const double &&x : A) {}
103
+ // No warning, rvalue-reference to the temporary
98
104
for (const double &x : A) {}
99
105
// expected-warning@-1 {{always a copy}}
100
106
// expected-note@-2 {{'double'}}
101
107
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:21-[[@LINE-3]]:22}:""
102
108
for (const double x : A) {}
103
109
// No warning, non-reference type indicates copy is made
110
+ for (double &&x : A) {}
111
+ // No warning, rvalue-reference to the temporary
104
112
// for (double &x : A) {}
105
113
// Binding error
106
114
for (double x : A) {}
107
115
// No warning, non-reference type indicates copy is made
108
116
117
+ for (const Bar &&x : A) {}
118
+ // No warning, rvalue-reference to the temporary
109
119
for (const Bar &x : A) {}
110
120
// expected-warning@-1 {{always a copy}}
111
121
// expected-note@-2 {{'Bar'}}
112
122
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
113
123
for (const Bar x : A) {}
114
124
// No warning, non-reference type indicates copy is made
125
+ for (Bar &&x : A) {}
126
+ // No warning, rvalue-reference to the temporary
115
127
// for (Bar &x : A) {}
116
128
// Binding error
117
129
for (Bar x : A) {}
@@ -121,30 +133,50 @@ void test1() {
121
133
void test2 () {
122
134
Container<int &> B;
123
135
136
+ // for (const int &&x : B) {}
137
+ // Binding error
124
138
for (const int &x : B) {}
125
139
// No warning, this reference is not a temporary
126
140
for (const int x : B) {}
127
141
// No warning on POD copy
142
+ // for (int &x : B) {}
143
+ // Binding error
128
144
for (int &x : B) {}
129
145
// No warning
130
146
for (int x : B) {}
131
147
// No warning
132
148
149
+ for (const double &&x : B) {}
150
+ // expected-warning@-1 {{resulting in a copy}}
151
+ // expected-note-re@-2 {{'double'{{.*}}'const int &'}}
152
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:21-[[@LINE-3]]:23}:""
133
153
for (const double &x : B) {}
134
154
// expected-warning@-1 {{resulting in a copy}}
135
155
// expected-note-re@-2 {{'double'{{.*}}'const int &'}}
136
156
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:21-[[@LINE-3]]:22}:""
137
157
for (const double x : B) {}
158
+ for (double &&x : B) {}
159
+ // expected-warning@-1 {{resulting in a copy}}
160
+ // expected-note-re@-2 {{'double'{{.*}}'const int &'}}
161
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:15-[[@LINE-3]]:17}:""
138
162
// for (double &x : B) {}
139
163
// Binding error
140
164
for (double x : B) {}
141
165
// No warning
142
166
167
+ for (const Bar &&x : B) {}
168
+ // expected-warning@-1 {{resulting in a copy}}
169
+ // expected-note@-2 {{'Bar'}}
170
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:20}:""
143
171
for (const Bar &x : B) {}
144
172
// expected-warning@-1 {{resulting in a copy}}
145
173
// expected-note@-2 {{'Bar'}}
146
174
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
147
175
for (const Bar x : B) {}
176
+ for (Bar &&x : B) {}
177
+ // expected-warning@-1 {{resulting in a copy}}
178
+ // expected-note@-2 {{'Bar'}}
179
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:14}:""
148
180
// for (Bar &x : B) {}
149
181
// Binding error
150
182
for (Bar x : B) {}
@@ -154,23 +186,31 @@ void test2() {
154
186
void test3 () {
155
187
Container<Bar> C;
156
188
189
+ for (const Bar &&x : C) {}
190
+ // No warning, rvalue-reference to the temporary
157
191
for (const Bar &x : C) {}
158
192
// expected-warning@-1 {{always a copy}}
159
193
// expected-note@-2 {{'Bar'}}
160
194
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
161
195
for (const Bar x : C) {}
162
196
// No warning, non-reference type indicates copy is made
197
+ for (Bar &&x : C) {}
198
+ // No warning, rvalue-reference to the temporary
163
199
// for (Bar &x : C) {}
164
200
// Binding error
165
201
for (Bar x : C) {}
166
202
// No warning, non-reference type indicates copy is made
167
203
204
+ for (const int &&x : C) {}
205
+ // No warning, rvalue-reference to the temporary
168
206
for (const int &x : C) {}
169
207
// expected-warning@-1 {{always a copy}}
170
208
// expected-note@-2 {{'int'}}
171
209
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
172
210
for (const int x : C) {}
173
211
// No warning, copy made
212
+ for (int &&x : C) {}
213
+ // No warning, rvalue-reference to the temporary
174
214
// for (int &x : C) {}
175
215
// Binding error
176
216
for (int x : C) {}
@@ -180,23 +220,35 @@ void test3() {
180
220
void test4 () {
181
221
Container<Bar&> D;
182
222
223
+ // for (const Bar &&x : D) {}
224
+ // Binding error
183
225
for (const Bar &x : D) {}
184
226
// No warning, this reference is not a temporary
185
227
for (const Bar x : D) {}
186
228
// expected-warning@-1 {{creates a copy}}
187
229
// expected-note@-2 {{'const Bar &'}}
188
230
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:18}:"&"
231
+ // for (Bar &&x : D) {}
232
+ // Binding error
189
233
for (Bar &x : D) {}
190
234
// No warning
191
235
for (Bar x : D) {}
192
236
// No warning
193
237
238
+ for (const int &&x : D) {}
239
+ // expected-warning@-1 {{resulting in a copy}}
240
+ // expected-note-re@-2 {{'int'{{.*}}'const Bar &'}}
241
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:20}:""
194
242
for (const int &x : D) {}
195
243
// expected-warning@-1 {{resulting in a copy}}
196
244
// expected-note-re@-2 {{'int'{{.*}}'const Bar &'}}
197
245
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
198
246
for (const int x : D) {}
199
247
// No warning
248
+ for (int &&x : D) {}
249
+ // expected-warning@-1 {{resulting in a copy}}
250
+ // expected-note-re@-2 {{'int'{{.*}}'const Bar &'}}
251
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:14}:""
200
252
// for (int &x : D) {}
201
253
// Binding error
202
254
for (int x : D) {}
@@ -206,12 +258,16 @@ void test4() {
206
258
void test5 () {
207
259
Container<Foo> E;
208
260
261
+ for (const Bar &&x : E) {}
262
+ // No warning, rvalue-reference to the temporary
209
263
for (const Bar &x : E) {}
210
264
// expected-warning@-1 {{always a copy}}
211
265
// expected-note@-2 {{'Bar'}}
212
266
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
213
267
for (const Bar x : E) {}
214
268
// No warning, non-reference type indicates copy is made
269
+ for (Bar &&x : E) {}
270
+ // No warning, rvalue-reference to the temporary
215
271
// for (Bar &x : E) {}
216
272
// Binding error
217
273
for (Bar x : E) {}
@@ -221,12 +277,20 @@ void test5() {
221
277
void test6 () {
222
278
Container<Foo&> F;
223
279
280
+ for (const Bar &&x : F) {}
281
+ // expected-warning@-1 {{resulting in a copy}}
282
+ // expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}}
283
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:20}:""
224
284
for (const Bar &x : F) {}
225
285
// expected-warning@-1 {{resulting in a copy}}
226
286
// expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}}
227
287
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
228
288
for (const Bar x : F) {}
229
289
// No warning.
290
+ for (Bar &&x : F) {}
291
+ // expected-warning@-1 {{resulting in a copy}}
292
+ // expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}}
293
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:14}:""
230
294
// for (Bar &x : F) {}
231
295
// Binding error
232
296
for (Bar x : F) {}
@@ -236,56 +300,88 @@ void test6() {
236
300
void test7 () {
237
301
double G[2 ];
238
302
303
+ // for (const double &&x : G) {}
304
+ // Binding error
239
305
for (const double &x : G) {}
240
306
// No warning
241
307
for (const double x : G) {}
242
308
// No warning on POD copy
309
+ // for (double &&x : G) {}
310
+ // Binding error
243
311
for (double &x : G) {}
244
312
// No warning
245
313
for (double x : G) {}
246
314
// No warning
247
315
316
+ for (const int &&x : G) {}
317
+ // expected-warning@-1 {{resulting in a copy}}
318
+ // expected-note-re@-2 {{'int'{{.*}}'const double &'}}
319
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:20}:""
248
320
for (const int &x : G) {}
249
321
// expected-warning@-1 {{resulting in a copy}}
250
322
// expected-note-re@-2 {{'int'{{.*}}'const double &'}}
251
323
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
252
324
for (const int x : G) {}
253
325
// No warning
326
+ for (int &&x : G) {}
327
+ // expected-warning@-1 {{resulting in a copy}}
328
+ // expected-note-re@-2 {{'int'{{.*}}'const double &'}}
329
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:14}:""
254
330
// for (int &x : G) {}
255
331
// Binding error
256
332
for (int x : G) {}
257
333
// No warning
258
334
335
+ for (const Bar &&x : G) {}
336
+ // expected-warning@-1 {{resulting in a copy}}
337
+ // expected-note-re@-2 {{'Bar'{{.*}}'const double &'}}
338
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:20}:""
259
339
for (const Bar &x : G) {}
260
340
// expected-warning@-1 {{resulting in a copy}}
261
341
// expected-note-re@-2 {{'Bar'{{.*}}'const double &'}}
262
342
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
263
343
for (const Bar x : G) {}
264
344
// No warning
265
- // for (int &Bar : G) {}
345
+ for (Bar &&x : G) {}
346
+ // expected-warning@-1 {{resulting in a copy}}
347
+ // expected-note-re@-2 {{'Bar'{{.*}}'const double &'}}
348
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:14}:""
349
+ // for (Bar &x : G) {}
266
350
// Binding error
267
- for (int Bar : G) {}
351
+ for (Bar x : G) {}
268
352
// No warning
269
353
}
270
354
271
355
void test8 () {
272
356
Foo H[2 ];
273
357
358
+ // for (const Foo &&x : H) {}
359
+ // Binding error
274
360
for (const Foo &x : H) {}
275
361
// No warning
276
362
for (const Foo x : H) {}
277
363
// No warning on POD copy
364
+ // for (Foo &&x : H) {}
365
+ // Binding error
278
366
for (Foo &x : H) {}
279
367
// No warning
280
368
for (Foo x : H) {}
281
369
// No warning
282
370
371
+ for (const Bar &&x : H) {}
372
+ // expected-warning@-1 {{resulting in a copy}}
373
+ // expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}}
374
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:20}:""
283
375
for (const Bar &x : H) {}
284
376
// expected-warning@-1 {{resulting in a copy}}
285
377
// expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}}
286
378
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
287
379
for (const Bar x : H) {}
288
380
// No warning
381
+ for (Bar &&x: H) {}
382
+ // expected-warning@-1 {{resulting in a copy}}
383
+ // expected-note-re@-2 {{'Bar'{{.*}}'const Foo &'}}
384
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:14}:""
289
385
// for (Bar &x: H) {}
290
386
// Binding error
291
387
for (Bar x: H) {}
@@ -295,23 +391,35 @@ void test8() {
295
391
void test9 () {
296
392
Bar I[2 ] = {1 ,2 };
297
393
394
+ // for (const Bar &&x : I) {}
395
+ // Binding error
298
396
for (const Bar &x : I) {}
299
397
// No warning
300
398
for (const Bar x : I) {}
301
399
// expected-warning@-1 {{creates a copy}}
302
400
// expected-note@-2 {{'const Bar &'}}
303
401
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:18}:"&"
402
+ // for (Bar &&x : I) {}
403
+ // Binding error
304
404
for (Bar &x : I) {}
305
405
// No warning
306
406
for (Bar x : I) {}
307
407
// No warning
308
408
409
+ for (const int &&x : I) {}
410
+ // expected-warning@-1 {{resulting in a copy}}
411
+ // expected-note-re@-2 {{'int'{{.*}}'const Bar &'}}
412
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:20}:""
309
413
for (const int &x : I) {}
310
414
// expected-warning@-1 {{resulting in a copy}}
311
415
// expected-note-re@-2 {{'int'{{.*}}'const Bar &'}}
312
416
// CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:18-[[@LINE-3]]:19}:""
313
417
for (const int x : I) {}
314
418
// No warning
419
+ for (int &&x : I) {}
420
+ // expected-warning@-1 {{resulting in a copy}}
421
+ // expected-note-re@-2 {{'int'{{.*}}'const Bar &'}}
422
+ // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:14}:""
315
423
// for (int &x : I) {}
316
424
// Binding error
317
425
for (int x : I) {}
0 commit comments