• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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{};
__anon98a3cd133802lambdas_in_NSDMIs::L496       T t2 = ([](auto a) { return [](auto b) { return b; };})(t)(t);
__anon98a3cd133a02lambdas_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 
__anon98a3cd135d02test_conversion_to_fptr::X772   T (*fp)(T) = [](auto a) { return a; };
773 
774 };
775 
776 X<int> xi;
777 
778 template<class T>
__anon98a3cd135e02(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   }
__anon98a3cd136d02this_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 
__anon98a3cd136e02this_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable932   T t = [](auto a) { f(a); return a; };
__anon98a3cd136f02this_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 
__anon98a3cd137002this_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}}
__anon98a3cd137102this_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 
__anon98a3cd137202this_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 
__anon98a3cd137302this_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;
__anon98a3cd137402this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture979   T t = [](auto a) { return x; }; //expected-error{{'this'}}
__anon98a3cd137502this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture980   T t2 = [](auto b) {  return d; };
__anon98a3cd137602this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture981   T t3 = [this](auto a) {
982           return [=](auto b) {
983             return x;
984          };
985   };
__anon98a3cd137802this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture986   T t4 = [=](auto a) {
987           return [=](auto b) {
988             return x;
989          };
990   };
__anon98a3cd137a02this_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;
__anon98a3cd139f02nsdmi_capturing_this::X1366   int n = [this](auto) { return m; }(20);
1367 };
1368 
1369 template<class T>
1370 struct XT {
1371   T m = 10;
__anon98a3cd13a002nsdmi_capturing_this::XT1372   T n = [this](auto) { return m; }(20);
1373 };
1374 
1375 XT<int> xt{};
1376 
1377 
1378 }
1379