1 // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -emit-llvm-only %s
2 // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing %s -DDELAYED_TEMPLATE_PARSING
3 // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fms-extensions %s -DMS_EXTENSIONS
4 // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing -fms-extensions %s -DMS_EXTENSIONS -DDELAYED_TEMPLATE_PARSING
5
6 constexpr int ODRUSE_SZ = sizeof(char);
7
8 template<class T, int N>
f(T,const int (&)[N])9 void f(T, const int (&)[N]) { }
10
11 template<class T>
f(const T &,const int (&)[ODRUSE_SZ])12 void f(const T&, const int (&)[ODRUSE_SZ]) { }
13
14 #define DEFINE_SELECTOR(x) \
15 int selector_ ## x[sizeof(x) == ODRUSE_SZ ? ODRUSE_SZ : ODRUSE_SZ + 5]
16
17 #define F_CALL(x, a) f(x, selector_ ## a)
18
19 // This is a risky assumption, because if an empty class gets captured by value
20 // the lambda's size will still be '1'
21 #define ASSERT_NO_CAPTURES(L) static_assert(sizeof(L) == 1, "size of closure with no captures must be 1")
22 #define ASSERT_CLOSURE_SIZE_EXACT(L, N) static_assert(sizeof(L) == (N), "size of closure must be " #N)
23 #define ASSERT_CLOSURE_SIZE(L, N) static_assert(sizeof(L) >= (N), "size of closure must be >=" #N)
24
25
26 namespace sample {
27 struct X {
28 int i;
Xsample::X29 X(int i) : i(i) { }
30 };
31 }
32
33 namespace test_transformations_in_templates {
foo(T t)34 template<class T> void foo(T t) {
35 auto L = [](auto a) { return a; };
36 }
foo2(T t)37 template<class T> void foo2(T t) {
38 auto L = [](auto a) -> void {
39 auto M = [](char b) -> void {
40 auto N = [](auto c) -> void {
41 int selector[sizeof(c) == 1 ?
42 (sizeof(b) == 1 ? 1 : 2)
43 : 2
44 ]{};
45 };
46 N('a');
47 };
48 };
49 L(3.14);
50 }
51
doit()52 void doit() {
53 foo(3);
54 foo('a');
55 foo2('A');
56 }
57 }
58
59 namespace test_return_type_deduction {
60
doit()61 void doit() {
62
63 auto L = [](auto a, auto b) {
64 if ( a > b ) return a;
65 return b;
66 };
67 L(2, 4);
68 {
69 auto L2 = [](auto a, int i) {
70 return a + i;
71 };
72 L2(3.14, 2);
73 }
74 {
75 int a; //expected-note{{declared here}}
76 auto B = []() { return ^{ return a; }; }; //expected-error{{cannot be implicitly capture}}\
77 //expected-note{{begins here}}
78 //[](){ return ({int b = 5; return 'c'; 'x';}); };
79
80 //auto X = ^{ return a; };
81
82 //auto Y = []() -> auto { return 3; return 'c'; };
83
84 }
85 }
86 }
87
88
89 namespace test_no_capture{
doit()90 void doit() {
91 const int x = 10; //expected-note{{declared here}}
92 {
93 // should not capture 'x' - variable undergoes lvalue-to-rvalue
94 auto L = [=](auto a) {
95 int y = x;
96 return a + y;
97 };
98 ASSERT_NO_CAPTURES(L);
99 }
100 {
101 // should not capture 'x' - even though certain instantiations require
102 auto L = [](auto a) { //expected-note{{begins here}}
103 DEFINE_SELECTOR(a);
104 F_CALL(x, a); //expected-error{{'x' cannot be implicitly captured}}
105 };
106 ASSERT_NO_CAPTURES(L);
107 L('s'); //expected-note{{in instantiation of}}
108 }
109 {
110 // Does not capture because no default capture in inner most lambda 'b'
111 auto L = [=](auto a) {
112 return [=](int p) {
113 return [](auto b) {
114 DEFINE_SELECTOR(a);
115 F_CALL(x, a);
116 return 0;
117 };
118 };
119 };
120 ASSERT_NO_CAPTURES(L);
121 }
122 } // doit
123 } // namespace
124
125 namespace test_capture_of_potentially_evaluated_expression {
doit()126 void doit() {
127 const int x = 5;
128 {
129 auto L = [=](auto a) {
130 DEFINE_SELECTOR(a);
131 F_CALL(x, a);
132 };
133 static_assert(sizeof(L) == 4, "Must be captured");
134 }
135 {
136 int j = 0; //expected-note{{declared}}
137 auto L = [](auto a) { //expected-note{{begins here}}
138 return j + 1; //expected-error{{cannot be implicitly captured}}
139 };
140 }
141 {
142 const int x = 10;
143 auto L = [](auto a) {
144 //const int y = 20;
145 return [](int p) {
146 return [](auto b) {
147 DEFINE_SELECTOR(a);
148 F_CALL(x, a);
149 return 0;
150 };
151 };
152 };
153 auto M = L(3);
154 auto N = M(5);
155
156 }
157
158 { // if the nested capture does not implicitly or explicitly allow any captures
159 // nothing should capture - and instantiations will create errors if needed.
160 const int x = 0;
161 auto L = [=](auto a) { // <-- #A
162 const int y = 0;
163 return [](auto b) { // <-- #B
164 int c[sizeof(b)];
165 f(x, c);
166 f(y, c);
167 int i = x;
168 };
169 };
170 ASSERT_NO_CAPTURES(L);
171 auto M_int = L(2);
172 ASSERT_NO_CAPTURES(M_int);
173 }
174 { // Permutations of this example must be thoroughly tested!
175 const int x = 0;
176 sample::X cx{5};
177 auto L = [=](auto a) {
178 const int z = 3;
179 return [&,a](auto b) {
180 const int y = 5;
181 return [=](auto c) {
182 int d[sizeof(a) == sizeof(c) || sizeof(c) == sizeof(b) ? 2 : 1];
183 f(x, d);
184 f(y, d);
185 f(z, d);
186 decltype(a) A = a;
187 decltype(b) B = b;
188 const int &i = cx.i;
189 };
190 };
191 };
192 auto M = L(3)(3.5);
193 M(3.14);
194 }
195 }
196 namespace Test_no_capture_of_clearly_no_odr_use {
foo()197 auto foo() {
198 const int x = 10;
199 auto L = [=](auto a) {
200 return [=](auto b) {
201 return [=](auto c) {
202 int A = x;
203 return A;
204 };
205 };
206 };
207 auto M = L(1);
208 auto N = M(2.14);
209 ASSERT_NO_CAPTURES(L);
210 ASSERT_NO_CAPTURES(N);
211
212 return 0;
213 }
214 }
215
216 namespace Test_capture_of_odr_use_var {
foo()217 auto foo() {
218 const int x = 10;
219 auto L = [=](auto a) {
220 return [=](auto b) {
221 return [=](auto c) {
222 int A = x;
223 const int &i = x;
224 decltype(a) A2 = a;
225 return A;
226 };
227 };
228 };
229 auto M_int = L(1);
230 auto N_int_int = M_int(2);
231 ASSERT_CLOSURE_SIZE_EXACT(L, sizeof(x));
232 // M_int captures both a & x
233 ASSERT_CLOSURE_SIZE_EXACT(M_int, sizeof(x) + sizeof(int));
234 // N_int_int captures both a & x
235 ASSERT_CLOSURE_SIZE_EXACT(N_int_int, sizeof(x) + sizeof(int));
236 auto M_double = L(3.14);
237 ASSERT_CLOSURE_SIZE(M_double, sizeof(x) + sizeof(double));
238
239 return 0;
240 }
241 auto run = foo();
242 }
243
244 }
245 namespace more_nested_captures_1 {
246 template<class T> struct Y {
fmore_nested_captures_1::Y247 static void f(int, double, ...) { }
248 template<class R>
fmore_nested_captures_1::Y249 static void f(const int&, R, ...) { }
250 template<class R>
foomore_nested_captures_1::Y251 void foo(R t) {
252 const int x = 10; //expected-note{{declared here}}
253 auto L = [](auto a) {
254 return [=](auto b) {
255 return [=](auto c) {
256 f(x, c, b, a); //expected-error{{reference to local variable 'x'}}
257 return 0;
258 };
259 };
260 };
261 auto M = L(t);
262 auto N = M('b');
263 N(3.14);
264 N(5); //expected-note{{in instantiation of}}
265 }
266 };
267 Y<int> yi;
268 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
269 }
270
271
272 namespace more_nested_captures_1_1 {
273 template<class T> struct Y {
fmore_nested_captures_1_1::Y274 static void f(int, double, ...) { }
275 template<class R>
fmore_nested_captures_1_1::Y276 static void f(const int&, R, ...) { }
277 template<class R>
foomore_nested_captures_1_1::Y278 void foo(R t) {
279 const int x = 10; //expected-note{{declared here}}
280 auto L = [](auto a) {
281 return [=](char b) {
282 return [=](auto c) {
283 f(x, c, b, a); //expected-error{{reference to local variable 'x'}}
284 return 0;
285 };
286 };
287 };
288 auto M = L(t);
289 auto N = M('b');
290 N(3.14);
291 N(5); //expected-note{{in instantiation of}}
292 }
293 };
294 Y<int> yi;
295 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
296 }
297 namespace more_nested_captures_1_2 {
298 template<class T> struct Y {
fmore_nested_captures_1_2::Y299 static void f(int, double, ...) { }
300 template<class R>
fmore_nested_captures_1_2::Y301 static void f(const int&, R, ...) { }
302 template<class R>
foomore_nested_captures_1_2::Y303 void foo(R t) {
304 const int x = 10;
305 auto L = [=](auto a) {
306 return [=](char b) {
307 return [=](auto c) {
308 f(x, c, b, a);
309 return 0;
310 };
311 };
312 };
313 auto M = L(t);
314 auto N = M('b');
315 N(3.14);
316 N(5);
317 }
318 };
319 Y<int> yi;
320 int run = (yi.foo(3.14), 0);
321 }
322
323 namespace more_nested_captures_1_3 {
324 template<class T> struct Y {
fmore_nested_captures_1_3::Y325 static void f(int, double, ...) { }
326 template<class R>
fmore_nested_captures_1_3::Y327 static void f(const int&, R, ...) { }
328 template<class R>
foomore_nested_captures_1_3::Y329 void foo(R t) {
330 const int x = 10; //expected-note{{declared here}}
331 auto L = [=](auto a) {
332 return [](auto b) {
333 const int y = 0;
334 return [=](auto c) {
335 f(x, c, b); //expected-error{{reference to local variable 'x'}}
336 f(y, b, c);
337 return 0;
338 };
339 };
340 };
341 auto M = L(t);
342 auto N = M('b');
343 N(3.14);
344 N(5); //expected-note{{in instantiation of}}
345 }
346 };
347 Y<int> yi;
348 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
349 }
350
351
352 namespace more_nested_captures_1_4 {
353 template<class T> struct Y {
fmore_nested_captures_1_4::Y354 static void f(int, double, ...) { }
355 template<class R>
fmore_nested_captures_1_4::Y356 static void f(const int&, R, ...) { }
357 template<class R>
foomore_nested_captures_1_4::Y358 void foo(R t) {
359 const int x = 10; //expected-note{{declared here}}
360 auto L = [=](auto a) {
361 T t2{t};
362 return [](auto b) {
363 const int y = 0; //expected-note{{declared here}}
364 return [](auto c) { //expected-note 2{{lambda expression begins here}}
365 f(x, c); //expected-error{{variable 'x'}}
366 f(y, c); //expected-error{{variable 'y'}}
367 return 0;
368 };
369 };
370 };
371 auto M = L(t);
372 auto N_char = M('b');
373 N_char(3.14);
374 auto N_double = M(3.14);
375 N_double(3.14);
376 N_char(3); //expected-note{{in instantiation of}}
377 }
378 };
379 Y<int> yi;
380 int run = (yi.foo('a'), 0); //expected-note{{in instantiation of}}
381 }
382
383
384 namespace more_nested_captures_2 {
385 template<class T> struct Y {
fmore_nested_captures_2::Y386 static void f(int, double) { }
387 template<class R>
fmore_nested_captures_2::Y388 static void f(const int&, R) { }
389 template<class R>
foomore_nested_captures_2::Y390 void foo(R t) {
391 const int x = 10;
392 auto L = [=](auto a) {
393 return [=](auto b) {
394 return [=](auto c) {
395 f(x, c);
396 return 0;
397 };
398 };
399 };
400 auto M = L(t);
401 auto N = M('b');
402 N(3);
403 N(3.14);
404 }
405 };
406 Y<int> yi;
407 int run = (yi.foo(3.14), 0);
408
409 }
410
411 namespace more_nested_captures_3 {
412 template<class T> struct Y {
fmore_nested_captures_3::Y413 static void f(int, double) { }
414 template<class R>
fmore_nested_captures_3::Y415 static void f(const int&, R) { }
416 template<class R>
foomore_nested_captures_3::Y417 void foo(R t) {
418 const int x = 10; //expected-note{{declared here}}
419 auto L = [](auto a) {
420 return [=](auto b) {
421 return [=](auto c) {
422 f(x, c); //expected-error{{reference to local variable 'x'}}
423 return 0;
424 };
425 };
426 };
427 auto M = L(t);
428 auto N = M('b');
429 N(3); //expected-note{{in instantiation of}}
430 N(3.14);
431 }
432 };
433 Y<int> yi;
434 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
435
436 }
437
438 namespace more_nested_captures_4 {
439 template<class T> struct Y {
fmore_nested_captures_4::Y440 static void f(int, double) { }
441 template<class R>
fmore_nested_captures_4::Y442 static void f(const int&, R) { }
443 template<class R>
foomore_nested_captures_4::Y444 void foo(R t) {
445 const int x = 10; //expected-note{{'x' declared here}}
446 auto L = [](auto a) {
447 return [=](char b) {
448 return [=](auto c) {
449 f(x, c); //expected-error{{reference to local variable 'x'}}
450 return 0;
451 };
452 };
453 };
454 auto M = L(t);
455 auto N = M('b');
456 N(3); //expected-note{{in instantiation of}}
457 N(3.14);
458 }
459 };
460 Y<int> yi;
461 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
462
463 }
464
465 namespace more_nested_captures_5 {
466 template<class T> struct Y {
fmore_nested_captures_5::Y467 static void f(int, double) { }
468 template<class R>
fmore_nested_captures_5::Y469 static void f(const int&, R) { }
470 template<class R>
foomore_nested_captures_5::Y471 void foo(R t) {
472 const int x = 10;
473 auto L = [=](auto a) {
474 return [=](char b) {
475 return [=](auto c) {
476 f(x, c);
477 return 0;
478 };
479 };
480 };
481 auto M = L(t);
482 auto N = M('b');
483 N(3);
484 N(3.14);
485 }
486 };
487 Y<int> yi;
488 int run = (yi.foo(3.14), 0);
489
490 }
491
492 namespace lambdas_in_NSDMIs {
493 template<class T>
494 struct L {
495 T t{};
__anon0221a3cf3802lambdas_in_NSDMIs::L496 T t2 = ([](auto a) { return [](auto b) { return b; };})(t)(t);
__anon0221a3cf3a02lambdas_in_NSDMIs::L497 T t3 = ([](auto a) { return a; })(t);
498 };
499 L<int> l;
500 int run = l.t2;
501 }
502 namespace test_nested_decltypes_in_trailing_return_types {
foo()503 int foo() {
504 auto L = [](auto a) {
505 return [](auto b, decltype(a) b2) -> decltype(a) {
506 return decltype(a){};
507 };
508 };
509 auto M = L(3.14);
510 M('a', 6.26);
511 return 0;
512 }
513 }
514
515 namespace more_this_capture_1 {
516 struct X {
fmore_this_capture_1::X517 void f(int) { }
fmore_this_capture_1::X518 static void f(double) { }
foomore_this_capture_1::X519 void foo() {
520 {
521 auto L = [=](auto a) {
522 f(a);
523 };
524 L(3);
525 L(3.13);
526 }
527 {
528 auto L = [](auto a) {
529 f(a); //expected-error{{this}}
530 };
531 L(3.13);
532 L(2); //expected-note{{in instantiation}}
533 }
534 }
535
gmore_this_capture_1::X536 int g() {
537 auto L = [=](auto a) {
538 return [](int i) {
539 return [=](auto b) {
540 f(b);
541 int x = i;
542 };
543 };
544 };
545 auto M = L(0.0);
546 auto N = M(3);
547 N(5.32); // OK
548 return 0;
549 }
550 };
551 int run = X{}.g();
552 }
553 namespace more_this_capture_1_1 {
554 struct X {
fmore_this_capture_1_1::X555 void f(int) { }
fmore_this_capture_1_1::X556 static void f(double) { }
557
gmore_this_capture_1_1::X558 int g() {
559 auto L = [=](auto a) {
560 return [](int i) {
561 return [=](auto b) {
562 f(decltype(a){}); //expected-error{{this}}
563 int x = i;
564 };
565 };
566 };
567 auto M = L(0.0);
568 auto N = M(3);
569 N(5.32); // OK
570 L(3); // expected-note{{instantiation}}
571 return 0;
572 }
573 };
574 int run = X{}.g();
575 }
576
577 namespace more_this_capture_1_1_1 {
578 struct X {
fmore_this_capture_1_1_1::X579 void f(int) { }
fmore_this_capture_1_1_1::X580 static void f(double) { }
581
gmore_this_capture_1_1_1::X582 int g() {
583 auto L = [=](auto a) {
584 return [](auto b) {
585 return [=](int i) {
586 f(b);
587 f(decltype(a){}); //expected-error{{this}}
588 };
589 };
590 };
591 auto M = L(0.0); // OK
592 auto N = M(3.3); //OK
593 auto M_int = L(0); //expected-note{{instantiation}}
594 return 0;
595 }
596 };
597 int run = X{}.g();
598 }
599
600
601 namespace more_this_capture_1_1_1_1 {
602 struct X {
fmore_this_capture_1_1_1_1::X603 void f(int) { }
fmore_this_capture_1_1_1_1::X604 static void f(double) { }
605
gmore_this_capture_1_1_1_1::X606 int g() {
607 auto L = [=](auto a) {
608 return [](auto b) {
609 return [=](int i) {
610 f(b); //expected-error{{this}}
611 f(decltype(a){});
612 };
613 };
614 };
615 auto M_double = L(0.0); // OK
616 auto N = M_double(3); //expected-note{{instantiation}}
617
618 return 0;
619 }
620 };
621 int run = X{}.g();
622 }
623
624 namespace more_this_capture_2 {
625 struct X {
fmore_this_capture_2::X626 void f(int) { }
fmore_this_capture_2::X627 static void f(double) { }
628
gmore_this_capture_2::X629 int g() {
630 auto L = [=](auto a) {
631 return [](int i) {
632 return [=](auto b) {
633 f(b); //expected-error{{'this' cannot}}
634 int x = i;
635 };
636 };
637 };
638 auto M = L(0.0);
639 auto N = M(3);
640 N(5); // NOT OK expected-note{{in instantiation of}}
641 return 0;
642 }
643 };
644 int run = X{}.g();
645 }
646 namespace diagnose_errors_early_in_generic_lambdas {
647
foo()648 int foo()
649 {
650
651 { // This variable is used and must be caught early, do not need instantiation
652 const int x = 0; //expected-note{{declared}}
653 auto L = [](auto a) { //expected-note{{begins}}
654 const int &r = x; //expected-error{{variable}}
655 };
656 }
657 { // This variable is not used
658 const int x = 0;
659 auto L = [](auto a) {
660 int i = x;
661 };
662 }
663 {
664
665 const int x = 0; //expected-note{{declared}}
666 auto L = [=](auto a) { // <-- #A
667 const int y = 0;
668 return [](auto b) { //expected-note{{begins}}
669 int c[sizeof(b)];
670 f(x, c);
671 f(y, c);
672 int i = x;
673 // This use will always be an error regardless of instantatiation
674 // so diagnose this early.
675 const int &r = x; //expected-error{{variable}}
676 };
677 };
678
679 }
680 return 0;
681 }
682
683 int run = foo();
684 }
685
686 namespace generic_nongenerics_interleaved_1 {
foo()687 int foo() {
688 {
689 auto L = [](int a) {
690 int y = 10;
691 return [=](auto b) {
692 return a + y;
693 };
694 };
695 auto M = L(3);
696 M(5);
697 }
698 {
699 int x;
700 auto L = [](int a) {
701 int y = 10;
702 return [=](auto b) {
703 return a + y;
704 };
705 };
706 auto M = L(3);
707 M(5);
708 }
709 {
710 // FIXME: why are there 2 error messages here?
711 int x;
712 auto L = [](auto a) { //expected-note {{declared here}}
713 int y = 10; //expected-note {{declared here}}
714 return [](int b) { //expected-note 2{{expression begins here}}
715 return [=] (auto c) {
716 return a + y; //expected-error 2{{cannot be implicitly captured}}
717 };
718 };
719 };
720 }
721 {
722 int x;
723 auto L = [](auto a) {
724 int y = 10;
725 return [=](int b) {
726 return [=] (auto c) {
727 return a + y;
728 };
729 };
730 };
731 }
732 return 1;
733 }
734
735 int run = foo();
736 }
737 namespace dont_capture_refs_if_initialized_with_constant_expressions {
738
foo(int i)739 auto foo(int i) {
740 // This is surprisingly not odr-used within the lambda!
741 static int j;
742 j = i;
743 int &ref_j = j;
744 return [](auto a) { return ref_j; }; // ok
745 }
746
747 template<class T>
foo2(T t)748 auto foo2(T t) {
749 // This is surprisingly not odr-used within the lambda!
750 static T j;
751 j = t;
752 T &ref_j = j;
753 return [](auto a) { return ref_j; }; // ok
754 }
755
do_test()756 int do_test() {
757 auto L = foo(3);
758 auto L_int = L(3);
759 auto L_char = L('a');
760 auto L1 = foo2(3.14);
761 auto L1_int = L1(3);
762 auto L1_char = L1('a');
763 return 0;
764 }
765
766 } // dont_capture_refs_if_initialized_with_constant_expressions
767
768 namespace test_conversion_to_fptr {
769
770 template<class T> struct X {
771
__anon0221a3cf5d02test_conversion_to_fptr::X772 T (*fp)(T) = [](auto a) { return a; };
773
774 };
775
776 X<int> xi;
777
778 template<class T>
__anon0221a3cf5e02(auto a) 779 void fooT(T t, T (*fp)(T) = [](auto a) { return a; }) {
780 fp(t);
781 }
782
test()783 int test() {
784 {
785 auto L = [](auto a) { return a; };
786 int (*fp)(int) = L;
787 fp(5);
788 L(3);
789 char (*fc)(char) = L;
790 fc('b');
791 L('c');
792 double (*fd)(double) = L;
793 fd(3.14);
794 fd(6.26);
795 L(4.25);
796 }
797 {
798 auto L = [](auto a) ->int { return a; }; //expected-note 2{{candidate template ignored}}
799 int (*fp)(int) = L;
800 char (*fc)(char) = L; //expected-error{{no viable conversion}}
801 double (*fd)(double) = L; //expected-error{{no viable conversion}}
802 }
803 {
804 int x = 5;
805 auto L = [=](auto b, char c = 'x') {
806 int i = x;
807 return [](auto a) ->decltype(a) { return a; };
808 };
809 int (*fp)(int) = L(8);
810 fp(5);
811 L(3);
812 char (*fc)(char) = L('a');
813 fc('b');
814 L('c');
815 double (*fd)(double) = L(3.14);
816 fd(3.14);
817 fd(6.26);
818
819 }
820 {
821 auto L = [=](auto b) {
822 return [](auto a) ->decltype(b)* { return (decltype(b)*)0; };
823 };
824 int* (*fp)(int) = L(8);
825 fp(5);
826 L(3);
827 char* (*fc)(char) = L('a');
828 fc('b');
829 L('c');
830 double* (*fd)(double) = L(3.14);
831 fd(3.14);
832 fd(6.26);
833 }
834 {
835 auto L = [=](auto b) {
836 return [](auto a) ->decltype(b)* { return (decltype(b)*)0; }; //expected-note{{candidate template ignored}}
837 };
838 char* (*fp)(int) = L('8');
839 fp(5);
840 char* (*fc)(char) = L('a');
841 fc('b');
842 double* (*fi)(int) = L(3.14);
843 fi(5);
844 int* (*fi2)(int) = L(3.14); //expected-error{{no viable conversion}}
845 }
846
847 {
848 auto L = [=](auto b) {
849 return [](auto a) {
850 return [=](auto c) {
851 return [](auto d) ->decltype(a + b + c + d) { return d; };
852 };
853 };
854 };
855 int (*fp)(int) = L('8')(3)(short{});
856 double (*fs)(char) = L(3.14)(short{})('4');
857 }
858
859 fooT(3);
860 fooT('a');
861 fooT(3.14);
862 fooT("abcdefg");
863 return 0;
864 }
865 int run2 = test();
866
867 }
868
869
870 namespace this_capture {
f(char,int)871 void f(char, int) { }
872 template<class T>
f(T,const int &)873 void f(T, const int&) { }
874
875 struct X {
876 int x = 0;
foothis_capture::X877 void foo() {
878 auto L = [=](auto a) {
879 return [=](auto b) {
880 //f(a, x++);
881 x++;
882 };
883 };
884 L('a')(5);
885 L('b')(4);
886 L(3.14)('3');
887
888 }
889
890 };
891
892 int run = (X{}.foo(), 0);
893
894 namespace this_capture_unresolvable {
895 struct X {
fthis_capture::this_capture_unresolvable::X896 void f(int) { }
fthis_capture::this_capture_unresolvable::X897 static void f(double) { }
898
gthis_capture::this_capture_unresolvable::X899 int g() {
900 auto lam = [=](auto a) { f(a); }; // captures 'this'
901 lam(0); // ok.
902 lam(0.0); // ok.
903 return 0;
904 }
g2this_capture::this_capture_unresolvable::X905 int g2() {
906 auto lam = [](auto a) { f(a); }; // expected-error{{'this'}}
907 lam(0); // expected-note{{in instantiation of}}
908 lam(0.0); // ok.
909 return 0;
910 }
__anon0221a3cf6d02this_capture::this_capture_unresolvable::X911 double (*fd)(double) = [](auto a) { f(a); return a; };
912
913 };
914
915 int run = X{}.g();
916
917 }
918
919 namespace check_nsdmi_and_this_capture_of_member_functions {
920
921 struct FunctorDouble {
FunctorDoublethis_capture::check_nsdmi_and_this_capture_of_member_functions::FunctorDouble922 template<class T> FunctorDouble(T t) { t(2.14); };
923 };
924 struct FunctorInt {
FunctorIntthis_capture::check_nsdmi_and_this_capture_of_member_functions::FunctorInt925 template<class T> FunctorInt(T t) { t(2); }; //expected-note{{in instantiation of}}
926 };
927
928 template<class T> struct YUnresolvable {
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable929 void f(int) { }
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable930 static void f(double) { }
931
__anon0221a3cf6e02this_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable932 T t = [](auto a) { f(a); return a; };
__anon0221a3cf6f02this_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable933 T t2 = [=](auto b) { f(b); return b; };
934 };
935
936 template<class T> struct YUnresolvable2 {
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable2937 void f(int) { }
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable2938 static void f(double) { }
939
__anon0221a3cf7002this_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable2940 T t = [](auto a) { f(a); return a; }; //expected-error{{'this'}} \
941 //expected-note{{in instantiation of}}
__anon0221a3cf7102this_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable2942 T t2 = [=](auto b) { f(b); return b; };
943 };
944
945
946 YUnresolvable<FunctorDouble> yud;
947 // This will cause an error since it call's with an int and calls a member function.
948 YUnresolvable2<FunctorInt> yui;
949
950
951 template<class T> struct YOnlyStatic {
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YOnlyStatic952 static void f(double) { }
953
__anon0221a3cf7202this_capture::check_nsdmi_and_this_capture_of_member_functions::YOnlyStatic954 T t = [](auto a) { f(a); return a; };
955 };
956 YOnlyStatic<FunctorDouble> yos;
957 template<class T> struct YOnlyNonStatic {
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YOnlyNonStatic958 void f(int) { }
959
__anon0221a3cf7302this_capture::check_nsdmi_and_this_capture_of_member_functions::YOnlyNonStatic960 T t = [](auto a) { f(a); return a; }; //expected-error{{'this'}}
961 };
962
963
964 }
965
966
967 namespace check_nsdmi_and_this_capture_of_data_members {
968
969 struct FunctorDouble {
FunctorDoublethis_capture::check_nsdmi_and_this_capture_of_data_members::FunctorDouble970 template<class T> FunctorDouble(T t) { t(2.14); };
971 };
972 struct FunctorInt {
FunctorIntthis_capture::check_nsdmi_and_this_capture_of_data_members::FunctorInt973 template<class T> FunctorInt(T t) { t(2); };
974 };
975
976 template<class T> struct YThisCapture {
977 const int x = 10;
978 static double d;
__anon0221a3cf7402this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture979 T t = [](auto a) { return x; }; //expected-error{{'this'}}
__anon0221a3cf7502this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture980 T t2 = [](auto b) { return d; };
__anon0221a3cf7602this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture981 T t3 = [this](auto a) {
982 return [=](auto b) {
983 return x;
984 };
985 };
__anon0221a3cf7802this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture986 T t4 = [=](auto a) {
987 return [=](auto b) {
988 return x;
989 };
990 };
__anon0221a3cf7a02this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture991 T t5 = [](auto a) {
992 return [=](auto b) {
993 return x; //expected-error{{'this'}}
994 };
995 };
996 };
997
998 template<class T> double YThisCapture<T>::d = 3.14;
999
1000
1001 }
1002
1003
1004 #ifdef DELAYED_TEMPLATE_PARSING
foo_no_error(T t)1005 template<class T> void foo_no_error(T t) {
1006 auto L = []()
1007 { return t; };
1008 }
foo(T t)1009 template<class T> void foo(T t) { //expected-note 2{{declared here}}
1010 auto L = []() //expected-note 2{{begins here}}
1011 { return t; }; //expected-error 2{{cannot be implicitly captured}}
1012 }
1013 template void foo(int); //expected-note{{in instantiation of}}
1014
1015 #else
1016
foo(T t)1017 template<class T> void foo(T t) { //expected-note{{declared here}}
1018 auto L = []() //expected-note{{begins here}}
1019 { return t; }; //expected-error{{cannot be implicitly captured}}
1020 }
1021
1022 #endif
1023 }
1024
1025 namespace no_this_capture_for_static {
1026
1027 struct X {
fno_this_capture_for_static::X1028 static void f(double) { }
1029
gno_this_capture_for_static::X1030 int g() {
1031 auto lam = [=](auto a) { f(a); };
1032 lam(0); // ok.
1033 ASSERT_NO_CAPTURES(lam);
1034 return 0;
1035 }
1036 };
1037
1038 int run = X{}.g();
1039 }
1040
1041 namespace this_capture_for_non_static {
1042
1043 struct X {
fthis_capture_for_non_static::X1044 void f(double) { }
1045
gthis_capture_for_non_static::X1046 int g() {
1047 auto L = [=](auto a) { f(a); };
1048 L(0);
1049 auto L2 = [](auto a) { f(a); }; //expected-error {{cannot be implicitly captured}}
1050 return 0;
1051 }
1052 };
1053
1054 int run = X{}.g();
1055 }
1056
1057 namespace this_captures_with_num_args_disambiguation {
1058
1059 struct X {
fthis_captures_with_num_args_disambiguation::X1060 void f(int) { }
fthis_captures_with_num_args_disambiguation::X1061 static void f(double, int i) { }
gthis_captures_with_num_args_disambiguation::X1062 int g() {
1063 auto lam = [](auto a) { f(a, a); };
1064 lam(0);
1065 return 0;
1066 }
1067 };
1068
1069 int run = X{}.g();
1070 }
1071 namespace enclosing_function_is_template_this_capture {
1072 // Only error if the instantiation tries to use the member function.
1073 struct X {
fenclosing_function_is_template_this_capture::X1074 void f(int) { }
fenclosing_function_is_template_this_capture::X1075 static void f(double) { }
1076 template<class T>
genclosing_function_is_template_this_capture::X1077 int g(T t) {
1078 auto L = [](auto a) { f(a); }; //expected-error{{'this'}}
1079 L(t); // expected-note{{in instantiation of}}
1080 return 0;
1081 }
1082 };
1083
1084 int run = X{}.g(0.0); // OK.
1085 int run2 = X{}.g(0); // expected-note{{in instantiation of}}
1086
1087
1088 }
1089
1090 namespace enclosing_function_is_template_this_capture_2 {
1091 // This should error, even if not instantiated, since
1092 // this would need to be captured.
1093 struct X {
fenclosing_function_is_template_this_capture_2::X1094 void f(int) { }
1095 template<class T>
genclosing_function_is_template_this_capture_2::X1096 int g(T t) {
1097 auto L = [](auto a) { f(a); }; //expected-error{{'this'}}
1098 L(t);
1099 return 0;
1100 }
1101 };
1102
1103 }
1104
1105
1106 namespace enclosing_function_is_template_this_capture_3 {
1107 // This should not error, this does not need to be captured.
1108 struct X {
fenclosing_function_is_template_this_capture_3::X1109 static void f(int) { }
1110 template<class T>
genclosing_function_is_template_this_capture_3::X1111 int g(T t) {
1112 auto L = [](auto a) { f(a); };
1113 L(t);
1114 return 0;
1115 }
1116 };
1117
1118 int run = X{}.g(0.0); // OK.
1119 int run2 = X{}.g(0); // OK.
1120
1121 }
1122
1123 namespace nested_this_capture_1 {
1124 struct X {
fnested_this_capture_1::X1125 void f(int) { }
fnested_this_capture_1::X1126 static void f(double) { }
1127
gnested_this_capture_1::X1128 int g() {
1129 auto L = [=](auto a) {
1130 return [this]() {
1131 return [=](auto b) {
1132 f(b);
1133 };
1134 };
1135 };
1136 auto M = L(0);
1137 auto N = M();
1138 N(5);
1139 return 0;
1140 }
1141 };
1142
1143 int run = X{}.g();
1144
1145 }
1146
1147
1148 namespace nested_this_capture_2 {
1149 struct X {
fnested_this_capture_2::X1150 void f(int) { }
fnested_this_capture_2::X1151 static void f(double) { }
1152
gnested_this_capture_2::X1153 int g() {
1154 auto L = [=](auto a) {
1155 return [&]() {
1156 return [=](auto b) {
1157 f(b);
1158 };
1159 };
1160 };
1161 auto M = L(0);
1162 auto N = M();
1163 N(5);
1164 N(3.14);
1165 return 0;
1166 }
1167 };
1168
1169 int run = X{}.g();
1170
1171 }
1172
1173 namespace nested_this_capture_3_1 {
1174 struct X {
1175 template<class T>
fnested_this_capture_3_1::X1176 void f(int, T t) { }
1177 template<class T>
fnested_this_capture_3_1::X1178 static void f(double, T t) { }
1179
gnested_this_capture_3_1::X1180 int g() {
1181 auto L = [=](auto a) {
1182 return [&](auto c) {
1183 return [=](auto b) {
1184 f(b, c);
1185 };
1186 };
1187 };
1188 auto M = L(0);
1189 auto N = M('a');
1190 N(5);
1191 N(3.14);
1192 return 0;
1193 }
1194 };
1195
1196 int run = X{}.g();
1197
1198 }
1199
1200
1201 namespace nested_this_capture_3_2 {
1202 struct X {
fnested_this_capture_3_2::X1203 void f(int) { }
fnested_this_capture_3_2::X1204 static void f(double) { }
1205
gnested_this_capture_3_2::X1206 int g() {
1207 auto L = [=](auto a) {
1208 return [](int i) {
1209 return [=](auto b) {
1210 f(b); //expected-error {{'this' cannot}}
1211 int x = i;
1212 };
1213 };
1214 };
1215 auto M = L(0.0);
1216 auto N = M(3);
1217 N(5); //expected-note {{in instantiation of}}
1218 N(3.14); // OK.
1219 return 0;
1220 }
1221 };
1222
1223 int run = X{}.g();
1224
1225 }
1226
1227 namespace nested_this_capture_4 {
1228 struct X {
fnested_this_capture_4::X1229 void f(int) { }
fnested_this_capture_4::X1230 static void f(double) { }
1231
gnested_this_capture_4::X1232 int g() {
1233 auto L = [](auto a) {
1234 return [=](auto i) {
1235 return [=](auto b) {
1236 f(b); //expected-error {{'this' cannot}}
1237 int x = i;
1238 };
1239 };
1240 };
1241 auto M = L(0.0);
1242 auto N = M(3);
1243 N(5); //expected-note {{in instantiation of}}
1244 N(3.14); // OK.
1245 return 0;
1246 }
1247 };
1248
1249 int run = X{}.g();
1250
1251 }
1252 namespace capture_enclosing_function_parameters {
1253
1254
foo(int x)1255 inline auto foo(int x) {
1256 int i = 10;
1257 auto lambda = [=](auto z) { return x + z; };
1258 return lambda;
1259 }
1260
foo2()1261 int foo2() {
1262 auto L = foo(3);
1263 L(4);
1264 L('a');
1265 L(3.14);
1266 return 0;
1267 }
1268
foo3(int x)1269 inline auto foo3(int x) {
1270 int local = 1;
1271 auto L = [=](auto a) {
1272 int i = a[local];
1273 return [=](auto b) mutable {
1274 auto n = b;
1275 return [&, n](auto c) mutable {
1276 ++local;
1277 return ++x;
1278 };
1279 };
1280 };
1281 auto M = L("foo-abc");
1282 auto N = M("foo-def");
1283 auto O = N("foo-ghi");
1284
1285 return L;
1286 }
1287
main()1288 int main() {
1289 auto L3 = foo3(3);
1290 auto M3 = L3("L3-1");
1291 auto N3 = M3("M3-1");
1292 auto O3 = N3("N3-1");
1293 N3("N3-2");
1294 M3("M3-2");
1295 M3("M3-3");
1296 L3("L3-2");
1297 }
1298 } // end ns
1299
1300 namespace capture_arrays {
1301
sum_array(int n)1302 inline int sum_array(int n) {
1303 int array2[5] = { 1, 2, 3, 4, 5};
1304
1305 auto L = [=](auto N) -> int {
1306 int sum = 0;
1307 int array[5] = { 1, 2, 3, 4, 5 };
1308 sum += array2[sum];
1309 sum += array2[N];
1310 return 0;
1311 };
1312 L(2);
1313 return L(n);
1314 }
1315 }
1316
1317 namespace capture_non_odr_used_variable_because_named_in_instantiation_dependent_expressions {
1318
1319 // even though 'x' is not odr-used, it should be captured.
1320
test()1321 int test() {
1322 const int x = 10;
1323 auto L = [=](auto a) {
1324 (void) +x + a;
1325 };
1326 ASSERT_CLOSURE_SIZE_EXACT(L, sizeof(x));
1327 }
1328
1329 } //end ns
1330 #ifdef MS_EXTENSIONS
1331 namespace explicit_spec {
1332 template<class R> struct X {
fooexplicit_spec::X1333 template<class T> int foo(T t) {
1334 auto L = [](auto a) { return a; };
1335 L(&t);
1336 return 0;
1337 }
1338
fooexplicit_spec::X1339 template<> int foo<char>(char c) { //expected-warning{{explicit specialization}}
1340 const int x = 10;
1341 auto LC = [](auto a) { return a; };
1342 R r;
1343 LC(&r);
1344 auto L = [=](auto a) {
1345 return [=](auto b) {
1346 int d[sizeof(a)];
1347 f(x, d);
1348 };
1349 };
1350 auto M = L(1);
1351
1352 ASSERT_NO_CAPTURES(M);
1353 return 0;
1354 }
1355
1356 };
1357
1358 int run_char = X<int>{}.foo('a');
1359 int run_int = X<double>{}.foo(4);
1360 }
1361 #endif // MS_EXTENSIONS
1362
1363 namespace nsdmi_capturing_this {
1364 struct X {
1365 int m = 10;
__anon0221a3cf9f02nsdmi_capturing_this::X1366 int n = [this](auto) { return m; }(20);
1367 };
1368
1369 template<class T>
1370 struct XT {
1371 T m = 10;
__anon0221a3cfa002nsdmi_capturing_this::XT1372 T n = [this](auto) { return m; }(20);
1373 };
1374
1375 XT<int> xt{};
1376
1377
1378 }
1379