1 // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -emit-llvm-only %s
2 // RUN: %clang_cc1 -std=c++2a -verify -fsyntax-only -fblocks -emit-llvm-only %s
3 // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing %s -DDELAYED_TEMPLATE_PARSING
4 // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fms-extensions %s -DMS_EXTENSIONS
5 // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing -fms-extensions %s -DMS_EXTENSIONS -DDELAYED_TEMPLATE_PARSING
6 
7 constexpr int ODRUSE_SZ = sizeof(char);
8 
9 template<class T, int N>
f(T,const int (&)[N])10 void f(T, const int (&)[N]) { }
11 
12 template<class T>
f(const T &,const int (&)[ODRUSE_SZ])13 void f(const T&, const int (&)[ODRUSE_SZ]) { }
14 
15 #define DEFINE_SELECTOR(x)   \
16   int selector_ ## x[sizeof(x) == ODRUSE_SZ ? ODRUSE_SZ : ODRUSE_SZ + 5]
17 
18 #define F_CALL(x, a) f(x, selector_ ## a)
19 
20 // This is a risky assumption, because if an empty class gets captured by value
21 // the lambda's size will still be '1'
22 #define ASSERT_NO_CAPTURES(L) static_assert(sizeof(L) == 1, "size of closure with no captures must be 1")
23 #define ASSERT_CLOSURE_SIZE_EXACT(L, N) static_assert(sizeof(L) == (N), "size of closure must be " #N)
24 #define ASSERT_CLOSURE_SIZE(L, N) static_assert(sizeof(L) >= (N), "size of closure must be >=" #N)
25 
26 
27 namespace sample {
28   struct X {
29     int i;
Xsample::X30     X(int i) : i(i) { }
31   };
32 }
33 
34 namespace test_transformations_in_templates {
foo(T t)35 template<class T> void foo(T t) {
36   auto L = [](auto a) { return a; };
37 }
foo2(T t)38 template<class T> void foo2(T t) {
39   auto L = [](auto a) -> void {
40     auto M = [](char b) -> void {
41       auto N = [](auto c) -> void {
42         int selector[sizeof(c) == 1 ?
43                       (sizeof(b) == 1 ? 1 : 2)
44                       : 2
45                     ]{};
46       };
47       N('a');
48     };
49   };
50   L(3.14);
51 }
52 
doit()53 void doit() {
54   foo(3);
55   foo('a');
56   foo2('A');
57 }
58 }
59 
60 namespace test_return_type_deduction {
61 
doit()62 void doit() {
63 
64   auto L = [](auto a, auto b) {
65     if ( a > b ) return a;
66     return b;
67   };
68   L(2, 4);
69   {
70     auto L2 = [](auto a, int i) {
71       return a + i;
72     };
73     L2(3.14, 2);
74   }
75   {
76     int a; //expected-note{{declared here}}
77     auto B = []() { return ^{ return a; }; }; //expected-error{{cannot be implicitly capture}}\
78                                               //expected-note{{begins here}}
79   //[](){ return ({int b = 5; return 'c'; 'x';}); };
80 
81   //auto X = ^{ return a; };
82 
83   //auto Y = []() -> auto { return 3; return 'c'; };
84 
85   }
86 }
87 }
88 
89 
90 namespace test_no_capture{
doit()91 void doit() {
92   const int x = 10; //expected-note{{declared here}}
93   {
94     // should not capture 'x' - variable undergoes lvalue-to-rvalue
95     auto L = [=](auto a) {
96       int y = x;
97       return a + y;
98     };
99     ASSERT_NO_CAPTURES(L);
100   }
101   {
102     // should not capture 'x' - even though certain instantiations require
103     auto L = [](auto a) { //expected-note{{begins here}}
104       DEFINE_SELECTOR(a);
105       F_CALL(x, a); //expected-error{{'x' cannot be implicitly captured}}
106     };
107     ASSERT_NO_CAPTURES(L);
108     L('s'); //expected-note{{in instantiation of}}
109   }
110   {
111     // Does not capture because no default capture in inner most lambda 'b'
112     auto L = [=](auto a) {
113       return [=](int p) {
114         return [](auto b) {
115           DEFINE_SELECTOR(a);
116           F_CALL(x, a);
117           return 0;
118         };
119       };
120     };
121     ASSERT_NO_CAPTURES(L);
122   }
123 }  // doit
124 } // namespace
125 
126 namespace test_capture_of_potentially_evaluated_expression {
doit()127 void doit() {
128   const int x = 5;
129   {
130     auto L = [=](auto a) {
131       DEFINE_SELECTOR(a);
132       F_CALL(x, a);
133     };
134     static_assert(sizeof(L) == 4, "Must be captured");
135   }
136   {
137     int j = 0; //expected-note{{declared}}
138     auto L = [](auto a) {  //expected-note{{begins here}}
139       return j + 1; //expected-error{{cannot be implicitly captured}}
140     };
141   }
142   {
143     const int x = 10;
144     auto L = [](auto a) {
145       //const int y = 20;
146       return [](int p) {
147         return [](auto b) {
148           DEFINE_SELECTOR(a);
149           F_CALL(x, a);
150           return 0;
151         };
152       };
153     };
154     auto M = L(3);
155     auto N = M(5);
156 
157   }
158 
159   { // if the nested capture does not implicitly or explicitly allow any captures
160     // nothing should capture - and instantiations will create errors if needed.
161     const int x = 0;
162     auto L = [=](auto a) { // <-- #A
163       const int y = 0;
164       return [](auto b) { // <-- #B
165         int c[sizeof(b)];
166         f(x, c);
167         f(y, c);
168         int i = x;
169       };
170     };
171     ASSERT_NO_CAPTURES(L);
172     auto M_int = L(2);
173     ASSERT_NO_CAPTURES(M_int);
174   }
175   { // Permutations of this example must be thoroughly tested!
176     const int x = 0;
177     sample::X cx{5};
178     auto L = [=](auto a) {
179       const int z = 3;
180       // FIXME: The warning below is correct but for some reason doesn't show
181       // up in C++17 mode.
182       return [&,a](auto b) {
183 #if __cplusplus > 201702L
184         // expected-warning@-2 {{address of stack memory associated with local variable 'z' returned}}
185         // expected-note@#call {{in instantiation of}}
186 #endif
187         const int y = 5;
188         return [=](auto c) {
189           int d[sizeof(a) == sizeof(c) || sizeof(c) == sizeof(b) ? 2 : 1];
190           f(x, d);
191           f(y, d);
192           f(z, d);
193           decltype(a) A = a;
194           decltype(b) B = b;
195           const int &i = cx.i;
196         };
197       };
198     };
199     auto M = L(3)(3.5); // #call
200     M(3.14);
201   }
202 }
203 namespace Test_no_capture_of_clearly_no_odr_use {
foo()204 auto foo() {
205  const int x = 10;
206  auto L = [=](auto a) {
207     return  [=](auto b) {
208       return [=](auto c) {
209         int A = x;
210         return A;
211       };
212     };
213   };
214   auto M = L(1);
215   auto N = M(2.14);
216   ASSERT_NO_CAPTURES(L);
217   ASSERT_NO_CAPTURES(N);
218 
219   return 0;
220 }
221 }
222 
223 namespace Test_capture_of_odr_use_var {
foo()224 auto foo() {
225  const int x = 10;
226  auto L = [=](auto a) {
227     return  [=](auto b) {
228       return [=](auto c) {
229         int A = x;
230         const int &i = x;
231         decltype(a) A2 = a;
232         return A;
233       };
234     };
235   };
236   auto M_int = L(1);
237   auto N_int_int = M_int(2);
238   ASSERT_CLOSURE_SIZE_EXACT(L, sizeof(x));
239   // M_int captures both a & x
240   ASSERT_CLOSURE_SIZE_EXACT(M_int, sizeof(x) + sizeof(int));
241   // N_int_int captures both a & x
242   ASSERT_CLOSURE_SIZE_EXACT(N_int_int, sizeof(x) + sizeof(int));
243   auto M_double = L(3.14);
244   ASSERT_CLOSURE_SIZE(M_double, sizeof(x) + sizeof(double));
245 
246   return 0;
247 }
248 auto run = foo();
249 }
250 
251 }
252 namespace more_nested_captures_1 {
253 template<class T> struct Y {
fmore_nested_captures_1::Y254   static void f(int, double, ...) { }
255   template<class R>
fmore_nested_captures_1::Y256   static void f(const int&, R, ...) { }
257   template<class R>
foomore_nested_captures_1::Y258   void foo(R t) {
259     const int x = 10; //expected-note{{declared here}}
260     auto L = [](auto a) {
261        return [=](auto b) {
262         return [=](auto c) {
263           f(x, c, b, a);  //expected-error{{reference to local variable 'x'}}
264           return 0;
265         };
266       };
267     };
268     auto M = L(t);
269     auto N = M('b');
270     N(3.14);
271     N(5);  //expected-note{{in instantiation of}}
272   }
273 };
274 Y<int> yi;
275 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
276 }
277 
278 
279 namespace more_nested_captures_1_1 {
280 template<class T> struct Y {
fmore_nested_captures_1_1::Y281   static void f(int, double, ...) { }
282   template<class R>
fmore_nested_captures_1_1::Y283   static void f(const int&, R, ...) { }
284   template<class R>
foomore_nested_captures_1_1::Y285   void foo(R t) {
286     const int x = 10; //expected-note{{declared here}}
287     auto L = [](auto a) {
288        return [=](char b) {
289         return [=](auto c) {
290           f(x, c, b, a);  //expected-error{{reference to local variable 'x'}}
291           return 0;
292         };
293       };
294     };
295     auto M = L(t);
296     auto N = M('b');
297     N(3.14);
298     N(5);  //expected-note{{in instantiation of}}
299   }
300 };
301 Y<int> yi;
302 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
303 }
304 namespace more_nested_captures_1_2 {
305 template<class T> struct Y {
fmore_nested_captures_1_2::Y306   static void f(int, double, ...) { }
307   template<class R>
fmore_nested_captures_1_2::Y308   static void f(const int&, R, ...) { }
309   template<class R>
foomore_nested_captures_1_2::Y310   void foo(R t) {
311     const int x = 10;
312     auto L = [=](auto a) {
313        return [=](char b) {
314         return [=](auto c) {
315           f(x, c, b, a);
316           return 0;
317         };
318       };
319     };
320     auto M = L(t);
321     auto N = M('b');
322     N(3.14);
323     N(5);
324   }
325 };
326 Y<int> yi;
327 int run = (yi.foo(3.14), 0);
328 }
329 
330 namespace more_nested_captures_1_3 {
331 template<class T> struct Y {
fmore_nested_captures_1_3::Y332   static void f(int, double, ...) { }
333   template<class R>
fmore_nested_captures_1_3::Y334   static void f(const int&, R, ...) { }
335   template<class R>
foomore_nested_captures_1_3::Y336   void foo(R t) {
337     const int x = 10; //expected-note{{declared here}}
338     auto L = [=](auto a) {
339        return [](auto b) {
340         const int y = 0;
341         return [=](auto c) {
342           f(x, c, b);  //expected-error{{reference to local variable 'x'}}
343           f(y, b, c);
344           return 0;
345         };
346       };
347     };
348     auto M = L(t);
349     auto N = M('b');
350     N(3.14);
351     N(5);  //expected-note{{in instantiation of}}
352   }
353 };
354 Y<int> yi;
355 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
356 }
357 
358 
359 namespace more_nested_captures_1_4 {
360 template<class T> struct Y {
fmore_nested_captures_1_4::Y361   static void f(int, double, ...) { }
362   template<class R>
fmore_nested_captures_1_4::Y363   static void f(const int&, R, ...) { }
364   template<class R>
foomore_nested_captures_1_4::Y365   void foo(R t) {
366     const int x = 10; //expected-note{{declared here}}
367     auto L = [=](auto a) {
368        T t2{t};
369        return [](auto b) {
370         const int y = 0; //expected-note{{declared here}}
371         return [](auto c) { //expected-note 2{{lambda expression begins here}}
372           f(x, c);  //expected-error{{variable 'x'}}
373           f(y, c);  //expected-error{{variable 'y'}}
374           return 0;
375         };
376       };
377     };
378     auto M = L(t);
379     auto N_char = M('b');
380     N_char(3.14);
381     auto N_double = M(3.14);
382     N_double(3.14);
383     N_char(3);  //expected-note{{in instantiation of}}
384   }
385 };
386 Y<int> yi;
387 int run = (yi.foo('a'), 0); //expected-note{{in instantiation of}}
388 }
389 
390 
391 namespace more_nested_captures_2 {
392 template<class T> struct Y {
fmore_nested_captures_2::Y393   static void f(int, double) { }
394   template<class R>
fmore_nested_captures_2::Y395   static void f(const int&, R) { }
396   template<class R>
foomore_nested_captures_2::Y397   void foo(R t) {
398     const int x = 10;
399     auto L = [=](auto a) {
400        return [=](auto b) {
401         return [=](auto c) {
402           f(x, c);
403           return 0;
404         };
405       };
406     };
407     auto M = L(t);
408     auto N = M('b');
409     N(3);
410     N(3.14);
411   }
412 };
413 Y<int> yi;
414 int run = (yi.foo(3.14), 0);
415 
416 }
417 
418 namespace more_nested_captures_3 {
419 template<class T> struct Y {
fmore_nested_captures_3::Y420   static void f(int, double) { }
421   template<class R>
fmore_nested_captures_3::Y422   static void f(const int&, R) { }
423   template<class R>
foomore_nested_captures_3::Y424   void foo(R t) {
425     const int x = 10; //expected-note{{declared here}}
426     auto L = [](auto a) {
427        return [=](auto b) {
428         return [=](auto c) {
429           f(x, c);   //expected-error{{reference to local variable 'x'}}
430           return 0;
431         };
432       };
433     };
434     auto M = L(t);
435     auto N = M('b');
436     N(3); //expected-note{{in instantiation of}}
437     N(3.14);
438   }
439 };
440 Y<int> yi;
441 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
442 
443 }
444 
445 namespace more_nested_captures_4 {
446 template<class T> struct Y {
fmore_nested_captures_4::Y447   static void f(int, double) { }
448   template<class R>
fmore_nested_captures_4::Y449   static void f(const int&, R) { }
450   template<class R>
foomore_nested_captures_4::Y451   void foo(R t) {
452     const int x = 10;  //expected-note{{'x' declared here}}
453     auto L = [](auto a) {
454        return [=](char b) {
455         return [=](auto c) {
456           f(x, c);  //expected-error{{reference to local variable 'x'}}
457           return 0;
458         };
459       };
460     };
461     auto M = L(t);
462     auto N = M('b');
463     N(3); //expected-note{{in instantiation of}}
464     N(3.14);
465   }
466 };
467 Y<int> yi;
468 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}}
469 
470 }
471 
472 namespace more_nested_captures_5 {
473 template<class T> struct Y {
fmore_nested_captures_5::Y474   static void f(int, double) { }
475   template<class R>
fmore_nested_captures_5::Y476   static void f(const int&, R) { }
477   template<class R>
foomore_nested_captures_5::Y478   void foo(R t) {
479     const int x = 10;
480     auto L = [=](auto a) {
481        return [=](char b) {
482         return [=](auto c) {
483           f(x, c);
484           return 0;
485         };
486       };
487     };
488     auto M = L(t);
489     auto N = M('b');
490     N(3);
491     N(3.14);
492   }
493 };
494 Y<int> yi;
495 int run = (yi.foo(3.14), 0);
496 
497 }
498 
499 namespace lambdas_in_NSDMIs {
500 template<class T>
501   struct L {
502       T t{};
__anon16590c1d3902(auto b) 503       T t2 = ([](auto a) { return [](auto b) { return b; };})(t)(t);
__anon16590c1d3a02lambdas_in_NSDMIs::L504       T t3 = ([](auto a) { return a; })(t);
505   };
506   L<int> l;
507   int run = l.t2;
508 }
509 namespace test_nested_decltypes_in_trailing_return_types {
foo()510 int foo() {
511   auto L = [](auto a) {
512       return [](auto b, decltype(a) b2) -> decltype(a) {
513         return decltype(a){};
514       };
515   };
516   auto M = L(3.14);
517   M('a', 6.26);
518   return 0;
519 }
520 }
521 
522 namespace more_this_capture_1 {
523 struct X {
fmore_this_capture_1::X524   void f(int) { }
fmore_this_capture_1::X525   static void f(double) { }
foomore_this_capture_1::X526   void foo() {
527     {
528       auto L = [=](auto a) {
529         f(a);
530       };
531       L(3);
532       L(3.13);
533     }
534     {
535       auto L = [](auto a) {
536         f(a); //expected-error{{this}}
537       };
538       L(3.13);
539       L(2); //expected-note{{in instantiation}}
540     }
541   }
542 
gmore_this_capture_1::X543   int g() {
544     auto L = [=](auto a) {
545       return [](int i) {
546         return [=](auto b) {
547           f(b);
548           int x = i;
549         };
550       };
551     };
552     auto M = L(0.0);
553     auto N = M(3);
554     N(5.32); // OK
555     return 0;
556   }
557 };
558 int run = X{}.g();
559 }
560 namespace more_this_capture_1_1 {
561 struct X {
fmore_this_capture_1_1::X562   void f(int) { }
fmore_this_capture_1_1::X563   static void f(double) { }
564 
gmore_this_capture_1_1::X565   int g() {
566     auto L = [=](auto a) {
567       return [](int i) {
568         return [=](auto b) {
569           f(decltype(a){}); //expected-error{{this}}
570           int x = i;
571         };
572       };
573     };
574     auto M = L(0.0);
575     auto N = M(3);
576     N(5.32); // OK
577     L(3); // expected-note{{instantiation}}
578     return 0;
579   }
580 };
581 int run = X{}.g();
582 }
583 
584 namespace more_this_capture_1_1_1 {
585 struct X {
fmore_this_capture_1_1_1::X586   void f(int) { }
fmore_this_capture_1_1_1::X587   static void f(double) { }
588 
gmore_this_capture_1_1_1::X589   int g() {
590     auto L = [=](auto a) {
591       return [](auto b) {
592         return [=](int i) {
593           f(b);
594           f(decltype(a){}); //expected-error{{this}}
595         };
596       };
597     };
598     auto M = L(0.0);  // OK
599     auto N = M(3.3); //OK
600     auto M_int = L(0); //expected-note{{instantiation}}
601     return 0;
602   }
603 };
604 int run = X{}.g();
605 }
606 
607 
608 namespace more_this_capture_1_1_1_1 {
609 struct X {
fmore_this_capture_1_1_1_1::X610   void f(int) { }
fmore_this_capture_1_1_1_1::X611   static void f(double) { }
612 
gmore_this_capture_1_1_1_1::X613   int g() {
614     auto L = [=](auto a) {
615       return [](auto b) {
616         return [=](int i) {
617           f(b); //expected-error{{this}}
618           f(decltype(a){});
619         };
620       };
621     };
622     auto M_double = L(0.0);  // OK
623     auto N = M_double(3); //expected-note{{instantiation}}
624 
625     return 0;
626   }
627 };
628 int run = X{}.g();
629 }
630 
631 namespace more_this_capture_2 {
632 struct X {
fmore_this_capture_2::X633   void f(int) { }
fmore_this_capture_2::X634   static void f(double) { }
635 
gmore_this_capture_2::X636   int g() {
637     auto L = [=](auto a) {
638       return [](int i) {
639         return [=](auto b) {
640           f(b); //expected-error{{'this' cannot}}
641           int x = i;
642         };
643       };
644     };
645     auto M = L(0.0);
646     auto N = M(3);
647     N(5); // NOT OK expected-note{{in instantiation of}}
648     return 0;
649   }
650 };
651 int run = X{}.g();
652 }
653 namespace diagnose_errors_early_in_generic_lambdas {
654 
foo()655 int foo()
656 {
657 
658   { // This variable is used and must be caught early, do not need instantiation
659     const int x = 0; //expected-note{{declared}}
660     auto L = [](auto a) { //expected-note{{begins}}
661       const int &r = x; //expected-error{{variable}}
662     };
663   }
664   { // This variable is not used
665     const int x = 0;
666     auto L = [](auto a) {
667       int i = x;
668     };
669   }
670   {
671 
672     const int x = 0; //expected-note{{declared}}
673     auto L = [=](auto a) { // <-- #A
674       const int y = 0;
675       return [](auto b) { //expected-note{{begins}}
676         int c[sizeof(b)];
677         f(x, c);
678         f(y, c);
679         int i = x;
680         // This use will always be an error regardless of instantatiation
681         // so diagnose this early.
682         const int &r = x; //expected-error{{variable}}
683       };
684     };
685 
686   }
687   return 0;
688 }
689 
690 int run = foo();
691 }
692 
693 namespace generic_nongenerics_interleaved_1 {
foo()694 int foo() {
695   {
696     auto L = [](int a) {
697       int y = 10;
698       return [=](auto b) {
699         return a + y;
700       };
701     };
702     auto M = L(3);
703     M(5);
704   }
705   {
706     int x;
707     auto L = [](int a) {
708       int y = 10;
709       return [=](auto b) {
710         return a + y;
711       };
712     };
713     auto M = L(3);
714     M(5);
715   }
716   {
717     // FIXME: why are there 2 error messages here?
718     int x;
719     auto L = [](auto a) { //expected-note {{declared here}}
720       int y = 10; //expected-note {{declared here}}
721       return [](int b) { //expected-note 2{{expression begins here}}
722         return [=] (auto c) {
723           return a + y; //expected-error 2{{cannot be implicitly captured}}
724         };
725       };
726     };
727   }
728   {
729     int x;
730     auto L = [](auto a) {
731       int y = 10;
732       return [=](int b) {
733         return [=] (auto c) {
734           return a + y;
735         };
736       };
737     };
738   }
739   return 1;
740 }
741 
742 int run = foo();
743 }
744 namespace dont_capture_refs_if_initialized_with_constant_expressions {
745 
foo(int i)746 auto foo(int i) {
747   // This is surprisingly not odr-used within the lambda!
748   static int j;
749   j = i;
750   int &ref_j = j;
751   return [](auto a) { return ref_j; }; // ok
752 }
753 
754 template<class T>
foo2(T t)755 auto foo2(T t) {
756   // This is surprisingly not odr-used within the lambda!
757   static T j;
758   j = t;
759   T &ref_j = j;
760   return [](auto a) { return ref_j; }; // ok
761 }
762 
do_test()763 int do_test() {
764   auto L = foo(3);
765   auto L_int = L(3);
766   auto L_char = L('a');
767   auto L1 = foo2(3.14);
768   auto L1_int = L1(3);
769   auto L1_char = L1('a');
770   return 0;
771 }
772 
773 } // dont_capture_refs_if_initialized_with_constant_expressions
774 
775 namespace test_conversion_to_fptr {
776 
777 template<class T> struct X {
778 
__anon16590c1d5d02test_conversion_to_fptr::X779   T (*fp)(T) = [](auto a) { return a; };
780 
781 };
782 
783 X<int> xi;
784 
785 template<class T>
__anon16590c1d5e02(auto a) 786 void fooT(T t, T (*fp)(T) = [](auto a) { return a; }) {
787   fp(t);
788 }
789 
test()790 int test() {
791 {
792   auto L = [](auto a) { return a; };
793   int (*fp)(int) = L;
794   fp(5);
795   L(3);
796   char (*fc)(char) = L;
797   fc('b');
798   L('c');
799   double (*fd)(double) = L;
800   fd(3.14);
801   fd(6.26);
802   L(4.25);
803 }
804 {
805   auto L = [](auto a) ->int { return a; }; //expected-note 2{{candidate template ignored}}
806   int (*fp)(int) = L;
807   char (*fc)(char) = L; //expected-error{{no viable conversion}}
808   double (*fd)(double) = L; //expected-error{{no viable conversion}}
809 }
810 {
811   int x = 5;
812   auto L = [=](auto b, char c = 'x') {
813     int i = x;
814     return [](auto a) ->decltype(a) { return a; };
815   };
816   int (*fp)(int) = L(8);
817   fp(5);
818   L(3);
819   char (*fc)(char) = L('a');
820   fc('b');
821   L('c');
822   double (*fd)(double) = L(3.14);
823   fd(3.14);
824   fd(6.26);
825 
826 }
827 {
828  auto L = [=](auto b) {
829     return [](auto a) ->decltype(b)* { return (decltype(b)*)0; };
830   };
831   int* (*fp)(int) = L(8);
832   fp(5);
833   L(3);
834   char* (*fc)(char) = L('a');
835   fc('b');
836   L('c');
837   double* (*fd)(double) = L(3.14);
838   fd(3.14);
839   fd(6.26);
840 }
841 {
842  auto L = [=](auto b) {
843     return [](auto a) ->decltype(b)* { return (decltype(b)*)0; }; //expected-note{{candidate template ignored}}
844   };
845   char* (*fp)(int) = L('8');
846   fp(5);
847   char* (*fc)(char) = L('a');
848   fc('b');
849   double* (*fi)(int) = L(3.14);
850   fi(5);
851   int* (*fi2)(int) = L(3.14); //expected-error{{no viable conversion}}
852 }
853 
854 {
855  auto L = [=](auto b) {
856     return [](auto a) {
857       return [=](auto c) {
858         return [](auto d) ->decltype(a + b + c + d) { return d; };
859       };
860     };
861   };
862   int (*fp)(int) = L('8')(3)(short{});
863   double (*fs)(char) = L(3.14)(short{})('4');
864 }
865 
866   fooT(3);
867   fooT('a');
868   fooT(3.14);
869   fooT("abcdefg");
870   return 0;
871 }
872 int run2 = test();
873 
874 }
875 
876 
877 namespace this_capture {
f(char,int)878 void f(char, int) { }
879 template<class T>
f(T,const int &)880 void f(T, const int&) { }
881 
882 struct X {
883   int x = 0;
foothis_capture::X884   void foo() {
885     auto L = [=](auto a) {
886          return [=](auto b) {
887             //f(a, x++);
888             x++;
889          };
890     };
891     L('a')(5);
892     L('b')(4);
893     L(3.14)('3');
894 
895   }
896 
897 };
898 
899 int run = (X{}.foo(), 0);
900 
901 namespace this_capture_unresolvable {
902 struct X {
fthis_capture::this_capture_unresolvable::X903   void f(int) { }
fthis_capture::this_capture_unresolvable::X904   static void f(double) { }
905 
gthis_capture::this_capture_unresolvable::X906   int g() {
907     auto lam = [=](auto a) { f(a); }; // captures 'this'
908     lam(0); // ok.
909     lam(0.0); // ok.
910     return 0;
911   }
g2this_capture::this_capture_unresolvable::X912   int g2() {
913     auto lam = [](auto a) { f(a); }; // expected-error{{'this'}}
914     lam(0); // expected-note{{in instantiation of}}
915     lam(0.0); // ok.
916     return 0;
917   }
__anon16590c1d6d02this_capture::this_capture_unresolvable::X918   double (*fd)(double) = [](auto a) { f(a); return a; };
919 
920 };
921 
922 int run = X{}.g();
923 
924 }
925 
926 namespace check_nsdmi_and_this_capture_of_member_functions {
927 
928 struct FunctorDouble {
FunctorDoublethis_capture::check_nsdmi_and_this_capture_of_member_functions::FunctorDouble929   template<class T> FunctorDouble(T t) { t(2.14); };
930 };
931 struct FunctorInt {
FunctorIntthis_capture::check_nsdmi_and_this_capture_of_member_functions::FunctorInt932   template<class T> FunctorInt(T t) { t(2); }; //expected-note{{in instantiation of}}
933 };
934 
935 template<class T> struct YUnresolvable {
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable936   void f(int) { }
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable937   static void f(double) { }
938 
__anon16590c1d6e02this_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable939   T t = [](auto a) { f(a); return a; };
__anon16590c1d6f02this_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable940   T t2 = [=](auto b) { f(b); return b; };
941 };
942 
943 template<class T> struct YUnresolvable2 {
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable2944   void f(int) { }
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable2945   static void f(double) { }
946 
__anon16590c1d7002this_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable2947   T t = [](auto a) { f(a); return a; }; //expected-error{{'this'}} \
948                                         //expected-note{{in instantiation of}}
__anon16590c1d7102this_capture::check_nsdmi_and_this_capture_of_member_functions::YUnresolvable2949   T t2 = [=](auto b) { f(b); return b; };
950 };
951 
952 
953 YUnresolvable<FunctorDouble> yud;
954 // This will cause an error since it call's with an int and calls a member function.
955 YUnresolvable2<FunctorInt> yui;
956 
957 
958 template<class T> struct YOnlyStatic {
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YOnlyStatic959   static void f(double) { }
960 
__anon16590c1d7202this_capture::check_nsdmi_and_this_capture_of_member_functions::YOnlyStatic961   T t = [](auto a) { f(a); return a; };
962 };
963 YOnlyStatic<FunctorDouble> yos;
964 template<class T> struct YOnlyNonStatic {
fthis_capture::check_nsdmi_and_this_capture_of_member_functions::YOnlyNonStatic965   void f(int) { }
966 
__anon16590c1d7302this_capture::check_nsdmi_and_this_capture_of_member_functions::YOnlyNonStatic967   T t = [](auto a) { f(a); return a; }; //expected-error{{'this'}}
968 };
969 
970 
971 }
972 
973 
974 namespace check_nsdmi_and_this_capture_of_data_members {
975 
976 struct FunctorDouble {
FunctorDoublethis_capture::check_nsdmi_and_this_capture_of_data_members::FunctorDouble977   template<class T> FunctorDouble(T t) { t(2.14); };
978 };
979 struct FunctorInt {
FunctorIntthis_capture::check_nsdmi_and_this_capture_of_data_members::FunctorInt980   template<class T> FunctorInt(T t) { t(2); };
981 };
982 
983 template<class T> struct YThisCapture {
984   const int x = 10;
985   static double d;
__anon16590c1d7402this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture986   T t = [](auto a) { return x; }; //expected-error{{'this'}}
__anon16590c1d7502this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture987   T t2 = [](auto b) {  return d; };
__anon16590c1d7602this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture988   T t3 = [this](auto a) {
989           return [=](auto b) {
990             return x;
991          };
992   };
__anon16590c1d7802this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture993   T t4 = [=](auto a) {
994           return [=](auto b) {
995             return x;
996          };
997   };
__anon16590c1d7a02this_capture::check_nsdmi_and_this_capture_of_data_members::YThisCapture998   T t5 = [](auto a) {
999           return [=](auto b) {
1000             return x;  //expected-error{{'this'}}
1001          };
1002   };
1003 };
1004 
1005 template<class T> double YThisCapture<T>::d = 3.14;
1006 
1007 
1008 }
1009 
1010 
1011 #ifdef DELAYED_TEMPLATE_PARSING
foo_no_error(T t)1012 template<class T> void foo_no_error(T t) {
1013   auto L = []()
1014     { return t; };
1015 }
foo(T t)1016 template<class T> void foo(T t) { //expected-note 2{{declared here}}
1017   auto L = []()  //expected-note 2{{begins here}}
1018     { return t; }; //expected-error 2{{cannot be implicitly captured}}
1019 }
1020 template void foo(int); //expected-note{{in instantiation of}}
1021 
1022 #else
1023 
foo(T t)1024 template<class T> void foo(T t) { //expected-note{{declared here}}
1025   auto L = []()  //expected-note{{begins here}}
1026     { return t; }; //expected-error{{cannot be implicitly captured}}
1027 }
1028 
1029 #endif
1030 }
1031 
1032 namespace no_this_capture_for_static {
1033 
1034 struct X {
fno_this_capture_for_static::X1035   static void f(double) { }
1036 
gno_this_capture_for_static::X1037   int g() {
1038     auto lam = [=](auto a) { f(a); };
1039     lam(0); // ok.
1040     ASSERT_NO_CAPTURES(lam);
1041     return 0;
1042   }
1043 };
1044 
1045 int run = X{}.g();
1046 }
1047 
1048 namespace this_capture_for_non_static {
1049 
1050 struct X {
fthis_capture_for_non_static::X1051   void f(double) { }
1052 
gthis_capture_for_non_static::X1053   int g() {
1054     auto L = [=](auto a) { f(a); };
1055     L(0);
1056     auto L2 = [](auto a) { f(a); }; //expected-error {{cannot be implicitly captured}}
1057     return 0;
1058   }
1059 };
1060 
1061 int run = X{}.g();
1062 }
1063 
1064 namespace this_captures_with_num_args_disambiguation {
1065 
1066 struct X {
fthis_captures_with_num_args_disambiguation::X1067   void f(int) { }
fthis_captures_with_num_args_disambiguation::X1068   static void f(double, int i) { }
gthis_captures_with_num_args_disambiguation::X1069   int g() {
1070     auto lam = [](auto a) { f(a, a); };
1071     lam(0);
1072     return 0;
1073   }
1074 };
1075 
1076 int run = X{}.g();
1077 }
1078 namespace enclosing_function_is_template_this_capture {
1079 // Only error if the instantiation tries to use the member function.
1080 struct X {
fenclosing_function_is_template_this_capture::X1081   void f(int) { }
fenclosing_function_is_template_this_capture::X1082   static void f(double) { }
1083   template<class T>
genclosing_function_is_template_this_capture::X1084   int g(T t) {
1085     auto L = [](auto a) { f(a); }; //expected-error{{'this'}}
1086     L(t); // expected-note{{in instantiation of}}
1087     return 0;
1088   }
1089 };
1090 
1091 int run = X{}.g(0.0); // OK.
1092 int run2 = X{}.g(0);  // expected-note{{in instantiation of}}
1093 
1094 
1095 }
1096 
1097 namespace enclosing_function_is_template_this_capture_2 {
1098 // This should error, even if not instantiated, since
1099 // this would need to be captured.
1100 struct X {
fenclosing_function_is_template_this_capture_2::X1101   void f(int) { }
1102   template<class T>
genclosing_function_is_template_this_capture_2::X1103   int g(T t) {
1104     auto L = [](auto a) { f(a); }; //expected-error{{'this'}}
1105     L(t);
1106     return 0;
1107   }
1108 };
1109 
1110 }
1111 
1112 
1113 namespace enclosing_function_is_template_this_capture_3 {
1114 // This should not error, this does not need to be captured.
1115 struct X {
fenclosing_function_is_template_this_capture_3::X1116   static void f(int) { }
1117   template<class T>
genclosing_function_is_template_this_capture_3::X1118   int g(T t) {
1119     auto L = [](auto a) { f(a); };
1120     L(t);
1121     return 0;
1122   }
1123 };
1124 
1125 int run = X{}.g(0.0); // OK.
1126 int run2 = X{}.g(0);  // OK.
1127 
1128 }
1129 
1130 namespace nested_this_capture_1 {
1131 struct X {
fnested_this_capture_1::X1132   void f(int) { }
fnested_this_capture_1::X1133   static void f(double) { }
1134 
gnested_this_capture_1::X1135   int g() {
1136     auto L = [=](auto a) {
1137       return [this]() {
1138         return [=](auto b) {
1139           f(b);
1140         };
1141       };
1142     };
1143     auto M = L(0);
1144     auto N = M();
1145     N(5);
1146     return 0;
1147   }
1148 };
1149 
1150 int run = X{}.g();
1151 
1152 }
1153 
1154 
1155 namespace nested_this_capture_2 {
1156 struct X {
fnested_this_capture_2::X1157   void f(int) { }
fnested_this_capture_2::X1158   static void f(double) { }
1159 
gnested_this_capture_2::X1160   int g() {
1161     auto L = [=](auto a) {
1162       return [&]() {
1163         return [=](auto b) {
1164           f(b);
1165         };
1166       };
1167     };
1168     auto M = L(0);
1169     auto N = M();
1170     N(5);
1171     N(3.14);
1172     return 0;
1173   }
1174 };
1175 
1176 int run = X{}.g();
1177 
1178 }
1179 
1180 namespace nested_this_capture_3_1 {
1181 struct X {
1182   template<class T>
fnested_this_capture_3_1::X1183   void f(int, T t) { }
1184   template<class T>
fnested_this_capture_3_1::X1185   static void f(double, T t) { }
1186 
gnested_this_capture_3_1::X1187   int g() {
1188     auto L = [=](auto a) {
1189       return [&](auto c) {
1190         return [=](auto b) {
1191           f(b, c);
1192         };
1193       };
1194     };
1195     auto M = L(0);
1196     auto N = M('a');
1197     N(5);
1198     N(3.14);
1199     return 0;
1200   }
1201 };
1202 
1203 int run = X{}.g();
1204 
1205 }
1206 
1207 
1208 namespace nested_this_capture_3_2 {
1209 struct X {
fnested_this_capture_3_2::X1210   void f(int) { }
fnested_this_capture_3_2::X1211   static void f(double) { }
1212 
gnested_this_capture_3_2::X1213   int g() {
1214     auto L = [=](auto a) {
1215       return [](int i) {
1216         return [=](auto b) {
1217           f(b); //expected-error {{'this' cannot}}
1218           int x = i;
1219         };
1220       };
1221     };
1222     auto M = L(0.0);
1223     auto N = M(3);
1224     N(5); //expected-note {{in instantiation of}}
1225     N(3.14); // OK.
1226     return 0;
1227   }
1228 };
1229 
1230 int run = X{}.g();
1231 
1232 }
1233 
1234 namespace nested_this_capture_4 {
1235 struct X {
fnested_this_capture_4::X1236   void f(int) { }
fnested_this_capture_4::X1237   static void f(double) { }
1238 
gnested_this_capture_4::X1239   int g() {
1240     auto L = [](auto a) {
1241       return [=](auto i) {
1242         return [=](auto b) {
1243           f(b); //expected-error {{'this' cannot}}
1244           int x = i;
1245         };
1246       };
1247     };
1248     auto M = L(0.0);
1249     auto N = M(3);
1250     N(5); //expected-note {{in instantiation of}}
1251     N(3.14); // OK.
1252     return 0;
1253   }
1254 };
1255 
1256 int run = X{}.g();
1257 
1258 }
1259 namespace capture_enclosing_function_parameters {
1260 
1261 
foo(int x)1262 inline auto foo(int x) {
1263   int i = 10;
1264   auto lambda = [=](auto z) { return x + z; };
1265   return lambda;
1266 }
1267 
foo2()1268 int foo2() {
1269   auto L = foo(3);
1270   L(4);
1271   L('a');
1272   L(3.14);
1273   return 0;
1274 }
1275 
foo3(int x)1276 inline auto foo3(int x) {
1277   int local = 1;
1278   auto L = [=](auto a) {
1279         int i = a[local];
1280         return  [=](auto b) mutable {
1281           auto n = b;
1282           return [&, n](auto c) mutable {
1283             ++local;
1284             return ++x;
1285           };
1286         };
1287   };
1288   auto M = L("foo-abc");
1289   auto N = M("foo-def");
1290   auto O = N("foo-ghi");
1291 
1292   return L;
1293 }
1294 
main()1295 int main() {
1296   auto L3 = foo3(3);
1297   auto M3 = L3("L3-1");
1298   auto N3 = M3("M3-1");
1299   auto O3 = N3("N3-1");
1300   N3("N3-2");
1301   M3("M3-2");
1302   M3("M3-3");
1303   L3("L3-2");
1304 }
1305 } // end ns
1306 
1307 namespace capture_arrays {
1308 
sum_array(int n)1309 inline int sum_array(int n) {
1310   int array2[5] = { 1, 2, 3, 4, 5};
1311 
1312   auto L = [=](auto N) -> int {
1313     int sum = 0;
1314     int array[5] = { 1, 2, 3, 4, 5 };
1315     sum += array2[sum];
1316     sum += array2[N];
1317     return 0;
1318   };
1319   L(2);
1320   return L(n);
1321 }
1322 }
1323 
1324 namespace capture_non_odr_used_variable_because_named_in_instantiation_dependent_expressions {
1325 
1326 // even though 'x' is not odr-used, it should be captured.
1327 
test()1328 int test() {
1329   const int x = 10;
1330   auto L = [=](auto a) {
1331     (void) +x + a;
1332   };
1333   ASSERT_CLOSURE_SIZE_EXACT(L, sizeof(x));
1334 }
1335 
1336 } //end ns
1337 #ifdef MS_EXTENSIONS
1338 namespace explicit_spec {
1339 template<class R> struct X {
fooexplicit_spec::X1340   template<class T> int foo(T t) {
1341     auto L = [](auto a) { return a; };
1342     L(&t);
1343     return 0;
1344   }
1345 
fooexplicit_spec::X1346   template<> int foo<char>(char c) { //expected-warning{{explicit specialization}}
1347     const int x = 10;
1348     auto LC = [](auto a) { return a; };
1349     R r;
1350     LC(&r);
1351     auto L = [=](auto a) {
1352       return [=](auto b) {
1353         int d[sizeof(a)];
1354         f(x, d);
1355       };
1356     };
1357     auto M = L(1);
1358 
1359     ASSERT_NO_CAPTURES(M);
1360     return 0;
1361   }
1362 
1363 };
1364 
1365 int run_char = X<int>{}.foo('a');
1366 int run_int = X<double>{}.foo(4);
1367 }
1368 #endif // MS_EXTENSIONS
1369 
1370 namespace nsdmi_capturing_this {
1371 struct X {
1372   int m = 10;
__anon16590c1d9f02nsdmi_capturing_this::X1373   int n = [this](auto) { return m; }(20);
1374 };
1375 
1376 template<class T>
1377 struct XT {
1378   T m = 10;
__anon16590c1da002nsdmi_capturing_this::XT1379   T n = [this](auto) { return m; }(20);
1380 };
1381 
1382 XT<int> xt{};
1383 
1384 
1385 }
1386 
PR33318(int i)1387 void PR33318(int i) {
1388   [&](auto) { static_assert(&i != nullptr, ""); }(0); // expected-warning 2{{always true}} expected-note {{instantiation}}
1389 }
1390 
1391 // Check to make sure that we don't capture when member-calls are made to members that are not of 'this' class.
1392 namespace PR34266 {
1393 // https://bugs.llvm.org/show_bug.cgi?id=34266
1394 namespace ns1 {
1395 struct A {
barPR34266::ns1::A1396   static void bar(int) { }
barPR34266::ns1::A1397   static void bar(double) { }
1398 };
1399 
1400 struct B
1401 {
1402   template<class T>
fPR34266::ns1::B1403   auto f() {
1404     auto L =  [=] {
1405       T{}.bar(3.0);
1406       T::bar(3);
1407 
1408     };
1409     ASSERT_NO_CAPTURES(L);
1410     return L;
1411   };
1412 };
1413 
test()1414 void test() {
1415   B{}.f<A>();
1416 }
1417 } // end ns1
1418 
1419 namespace ns2 {
1420 struct A {
barPR34266::ns2::A1421   static void bar(int) { }
barPR34266::ns2::A1422   static void bar(double) { }
1423 };
1424 
1425 struct B
1426 {
1427   using T = A;
fPR34266::ns2::B1428   auto f() {
1429     auto L =  [=](auto a) {
1430       T{}.bar(a);
1431       T::bar(a);
1432 
1433     };
1434     ASSERT_NO_CAPTURES(L);
1435     return L;
1436   };
1437 };
1438 
test()1439 void test() {
1440   B{}.f()(3.0);
1441   B{}.f()(3);
1442 }
1443 } // end ns2
1444 
1445 namespace ns3 {
1446 struct A {
barPR34266::ns3::A1447   void bar(int) { }
barPR34266::ns3::A1448   static void bar(double) { }
1449 };
1450 
1451 struct B
1452 {
1453   using T = A;
fPR34266::ns3::B1454   auto f() {
1455     auto L =  [=](auto a) {
1456       T{}.bar(a);
1457       T::bar(a); // This call ignores the instance member function because the implicit object argument fails to convert.
1458 
1459     };
1460     ASSERT_NO_CAPTURES(L);
1461     return L;
1462   };
1463 };
1464 
test()1465 void test() {
1466   B{}.f()(3.0);
1467   B{}.f()(3);
1468 }
1469 
1470 } // end ns3
1471 
1472 
1473 namespace ns4 {
1474 struct A {
barPR34266::ns4::A1475   void bar(int) { }
barPR34266::ns4::A1476   static void bar(double) { }
1477 };
1478 
1479 struct B : A
1480 {
1481   using T = A;
fPR34266::ns4::B1482   auto f() {
1483     auto L =  [=](auto a) {
1484       T{}.bar(a);
1485       T::bar(a);
1486 
1487     };
1488     // just check to see if the size if >= 2 bytes (which should be the case if we capture anything)
1489     ASSERT_CLOSURE_SIZE(L, 2);
1490     return L;
1491   };
1492 };
1493 
test()1494 void test() {
1495   B{}.f()(3.0);
1496   B{}.f()(3);
1497 }
1498 
1499 } // end ns4
1500 
1501 namespace ns5 {
1502 struct A {
barPR34266::ns5::A1503   void bar(int) { }
barPR34266::ns5::A1504   static void bar(double) { }
1505 };
1506 
1507 struct B
1508 {
1509   template<class T>
fPR34266::ns5::B1510   auto f() {
1511     auto L =  [&](auto a) {
1512       T{}.bar(a);
1513       T::bar(a);
1514 
1515     };
1516 
1517     ASSERT_NO_CAPTURES(L);
1518     return L;
1519   };
1520 };
1521 
test()1522 void test() {
1523   B{}.f<A>()(3.0);
1524   B{}.f<A>()(3);
1525 }
1526 
1527 } // end ns5
1528 
1529 } // end PR34266
1530 
1531 namespace capture_pack {
1532 #if __cplusplus >= 201702L
1533   constexpr
1534 #endif
1535   auto v =
__anon16590c1da702(auto ...a) 1536     [](auto ...a) {
1537       [&](auto ...b) {
1538         ((a = b), ...); // expected-warning 0-1{{extension}}
1539       }(100, 20, 3);
1540       return (a + ...); // expected-warning 0-1{{extension}}
1541     }(400, 50, 6);
1542 #if __cplusplus >= 201702L
1543   static_assert(v == 123);
1544 #endif
1545 }
1546