1*67e74705SXin Li // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -emit-llvm-only %s
2*67e74705SXin Li // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing %s -DDELAYED_TEMPLATE_PARSING
3*67e74705SXin Li // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fms-extensions %s -DMS_EXTENSIONS
4*67e74705SXin Li // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing -fms-extensions %s -DMS_EXTENSIONS -DDELAYED_TEMPLATE_PARSING
5*67e74705SXin Li
6*67e74705SXin Li template<class F, class ...Rest> struct first_impl { typedef F type; };
7*67e74705SXin Li template<class ...Args> using first = typename first_impl<Args...>::type;
8*67e74705SXin Li
9*67e74705SXin Li namespace simple_explicit_capture {
test()10*67e74705SXin Li void test() {
11*67e74705SXin Li int i;
12*67e74705SXin Li auto L = [i](auto a) { return i + a; };
13*67e74705SXin Li L(3.14);
14*67e74705SXin Li }
15*67e74705SXin Li }
16*67e74705SXin Li
17*67e74705SXin Li namespace explicit_call {
test()18*67e74705SXin Li int test() {
19*67e74705SXin Li auto L = [](auto a) { return a; };
20*67e74705SXin Li L.operator()(3);
21*67e74705SXin Li L.operator()<char>(3.14); //expected-warning{{implicit conversion}}
22*67e74705SXin Li return 0;
23*67e74705SXin Li }
24*67e74705SXin Li } //end ns
25*67e74705SXin Li
26*67e74705SXin Li namespace test_conversion_to_fptr_2 {
27*67e74705SXin Li
28*67e74705SXin Li template<class T> struct X {
29*67e74705SXin Li
__anon1df60a8b0302test_conversion_to_fptr_2::X30*67e74705SXin Li T (*fp)(T) = [](auto a) { return a; };
31*67e74705SXin Li
32*67e74705SXin Li };
33*67e74705SXin Li
34*67e74705SXin Li X<int> xi;
35*67e74705SXin Li
36*67e74705SXin Li template<class T>
__anon1df60a8b0402(auto a) 37*67e74705SXin Li void fooT(T t, T (*fp)(T) = [](auto a) { return a; }) {
38*67e74705SXin Li fp(t);
39*67e74705SXin Li }
40*67e74705SXin Li
test()41*67e74705SXin Li int test() {
42*67e74705SXin Li {
43*67e74705SXin Li auto L = [](auto a) { return a; };
44*67e74705SXin Li int (*fp)(int) = L;
45*67e74705SXin Li fp(5);
46*67e74705SXin Li L(3);
47*67e74705SXin Li char (*fc)(char) = L;
48*67e74705SXin Li fc('b');
49*67e74705SXin Li L('c');
50*67e74705SXin Li double (*fd)(double) = L;
51*67e74705SXin Li fd(3.14);
52*67e74705SXin Li fd(6.26);
53*67e74705SXin Li L(4.25);
54*67e74705SXin Li }
55*67e74705SXin Li {
56*67e74705SXin Li auto L = [](auto a) ->int { return a; }; //expected-note 2{{candidate template ignored}}
57*67e74705SXin Li int (*fp)(int) = L;
58*67e74705SXin Li char (*fc)(char) = L; //expected-error{{no viable conversion}}
59*67e74705SXin Li double (*fd)(double) = L; //expected-error{{no viable conversion}}
60*67e74705SXin Li }
61*67e74705SXin Li {
62*67e74705SXin Li int x = 5;
63*67e74705SXin Li auto L = [=](auto b, char c = 'x') {
64*67e74705SXin Li int i = x;
65*67e74705SXin Li return [](auto a) ->decltype(a) { return a; };
66*67e74705SXin Li };
67*67e74705SXin Li int (*fp)(int) = L(8);
68*67e74705SXin Li fp(5);
69*67e74705SXin Li L(3);
70*67e74705SXin Li char (*fc)(char) = L('a');
71*67e74705SXin Li fc('b');
72*67e74705SXin Li L('c');
73*67e74705SXin Li double (*fd)(double) = L(3.14);
74*67e74705SXin Li fd(3.14);
75*67e74705SXin Li fd(6.26);
76*67e74705SXin Li
77*67e74705SXin Li }
78*67e74705SXin Li {
79*67e74705SXin Li auto L = [=](auto b) {
80*67e74705SXin Li return [](auto a) ->decltype(b)* { return (decltype(b)*)0; };
81*67e74705SXin Li };
82*67e74705SXin Li int* (*fp)(int) = L(8);
83*67e74705SXin Li fp(5);
84*67e74705SXin Li L(3);
85*67e74705SXin Li char* (*fc)(char) = L('a');
86*67e74705SXin Li fc('b');
87*67e74705SXin Li L('c');
88*67e74705SXin Li double* (*fd)(double) = L(3.14);
89*67e74705SXin Li fd(3.14);
90*67e74705SXin Li fd(6.26);
91*67e74705SXin Li }
92*67e74705SXin Li {
93*67e74705SXin Li auto L = [=](auto b) {
94*67e74705SXin Li return [](auto a) ->decltype(b)* { return (decltype(b)*)0; }; //expected-note{{candidate template ignored}}
95*67e74705SXin Li };
96*67e74705SXin Li char* (*fp)(int) = L('8');
97*67e74705SXin Li fp(5);
98*67e74705SXin Li char* (*fc)(char) = L('a');
99*67e74705SXin Li fc('b');
100*67e74705SXin Li double* (*fi)(int) = L(3.14);
101*67e74705SXin Li fi(5);
102*67e74705SXin Li int* (*fi2)(int) = L(3.14); //expected-error{{no viable conversion}}
103*67e74705SXin Li }
104*67e74705SXin Li
105*67e74705SXin Li {
106*67e74705SXin Li auto L = [=](auto b) {
107*67e74705SXin Li return [](auto a) {
108*67e74705SXin Li return [=](auto c) {
109*67e74705SXin Li return [](auto d) ->decltype(a + b + c + d) { return d; };
110*67e74705SXin Li };
111*67e74705SXin Li };
112*67e74705SXin Li };
113*67e74705SXin Li int (*fp)(int) = L('8')(3)(short{});
114*67e74705SXin Li double (*fs)(char) = L(3.14)(short{})('4');
115*67e74705SXin Li }
116*67e74705SXin Li
117*67e74705SXin Li fooT(3);
118*67e74705SXin Li fooT('a');
119*67e74705SXin Li fooT(3.14);
120*67e74705SXin Li fooT("abcdefg");
121*67e74705SXin Li return 0;
122*67e74705SXin Li }
123*67e74705SXin Li int run2 = test();
124*67e74705SXin Li
125*67e74705SXin Li }
126*67e74705SXin Li
127*67e74705SXin Li
128*67e74705SXin Li namespace test_conversion_to_fptr {
129*67e74705SXin Li
f1(int (*)(int))130*67e74705SXin Li void f1(int (*)(int)) { }
f2(char (*)(int))131*67e74705SXin Li void f2(char (*)(int)) { } // expected-note{{candidate}}
g(int (*)(int))132*67e74705SXin Li void g(int (*)(int)) { } // #1 expected-note{{candidate}}
g(char (*)(char))133*67e74705SXin Li void g(char (*)(char)) { } // #2 expected-note{{candidate}}
h(int (*)(int))134*67e74705SXin Li void h(int (*)(int)) { } // #3
h(char (*)(int))135*67e74705SXin Li void h(char (*)(int)) { } // #4
136*67e74705SXin Li
test()137*67e74705SXin Li int test() {
138*67e74705SXin Li {
139*67e74705SXin Li auto glambda = [](auto a) { return a; };
140*67e74705SXin Li glambda(1);
141*67e74705SXin Li f1(glambda); // OK
142*67e74705SXin Li f2(glambda); // expected-error{{no matching function}}
143*67e74705SXin Li g(glambda); // expected-error{{call to 'g' is ambiguous}}
144*67e74705SXin Li h(glambda); // OK: calls #3 since it is convertible from ID
145*67e74705SXin Li
146*67e74705SXin Li int& (*fpi)(int*) = [](auto* a) -> auto& { return *a; }; // OK
147*67e74705SXin Li
148*67e74705SXin Li }
149*67e74705SXin Li {
150*67e74705SXin Li
151*67e74705SXin Li auto L = [](auto a) { return a; };
152*67e74705SXin Li int (*fp)(int) = L;
153*67e74705SXin Li fp(5);
154*67e74705SXin Li L(3);
155*67e74705SXin Li char (*fc)(char) = L;
156*67e74705SXin Li fc('b');
157*67e74705SXin Li L('c');
158*67e74705SXin Li double (*fd)(double) = L;
159*67e74705SXin Li fd(3.14);
160*67e74705SXin Li fd(6.26);
161*67e74705SXin Li L(4.25);
162*67e74705SXin Li }
163*67e74705SXin Li {
164*67e74705SXin Li auto L = [](auto a) ->int { return a; }; //expected-note 2{{candidate template ignored}}
165*67e74705SXin Li int (*fp)(int) = L;
166*67e74705SXin Li char (*fc)(char) = L; //expected-error{{no viable conversion}}
167*67e74705SXin Li double (*fd)(double) = L; //expected-error{{no viable conversion}}
168*67e74705SXin Li }
169*67e74705SXin Li {
170*67e74705SXin Li int* (*fp)(int*) = [](auto *a) -> auto* { return a; };
171*67e74705SXin Li fp(0);
172*67e74705SXin Li }
173*67e74705SXin Li }
174*67e74705SXin Li
175*67e74705SXin Li namespace more_converion_to_ptr_to_function_tests {
176*67e74705SXin Li
177*67e74705SXin Li
test()178*67e74705SXin Li int test() {
179*67e74705SXin Li {
180*67e74705SXin Li int& (*fpi)(int*) = [](auto* a) -> auto& { return *a; }; // OK
181*67e74705SXin Li int (*fp2)(int) = [](auto b) -> int { return b; };
182*67e74705SXin Li int (*fp3)(char) = [](auto c) -> int { return c; };
183*67e74705SXin Li char (*fp4)(int) = [](auto d) { return d; }; //expected-error{{no viable conversion}}\
184*67e74705SXin Li //expected-note{{candidate template ignored}}
185*67e74705SXin Li char (*fp5)(char) = [](auto e) -> int { return e; }; //expected-error{{no viable conversion}}\
186*67e74705SXin Li //expected-note{{candidate template ignored}}
187*67e74705SXin Li
188*67e74705SXin Li fp2(3);
189*67e74705SXin Li fp3('\n');
190*67e74705SXin Li fp3('a');
191*67e74705SXin Li return 0;
192*67e74705SXin Li }
193*67e74705SXin Li } // end test()
194*67e74705SXin Li
vfun(Ts...)195*67e74705SXin Li template<class ... Ts> void vfun(Ts ... ) { }
196*67e74705SXin Li
variadic_test()197*67e74705SXin Li int variadic_test() {
198*67e74705SXin Li
199*67e74705SXin Li int (*fp)(int, char, double) = [](auto ... a) -> int { vfun(a...); return 4; };
200*67e74705SXin Li fp(3, '4', 3.14);
201*67e74705SXin Li
202*67e74705SXin Li int (*fp2)(int, char, double) = [](auto ... a) { vfun(a...); return 4; };
203*67e74705SXin Li fp(3, '4', 3.14);
204*67e74705SXin Li return 2;
205*67e74705SXin Li }
206*67e74705SXin Li
207*67e74705SXin Li } // end ns
208*67e74705SXin Li
209*67e74705SXin Li namespace conversion_operator {
test()210*67e74705SXin Li void test() {
211*67e74705SXin Li auto L = [](auto a) -> int { return a; };
212*67e74705SXin Li int (*fp)(int) = L;
213*67e74705SXin Li int (&fp2)(int) = [](auto a) { return a; }; // expected-error{{non-const lvalue}}
214*67e74705SXin Li int (&&fp3)(int) = [](auto a) { return a; }; // expected-error{{no viable conversion}}\
215*67e74705SXin Li //expected-note{{candidate}}
216*67e74705SXin Li }
217*67e74705SXin Li }
218*67e74705SXin Li }
219*67e74705SXin Li
220*67e74705SXin Li namespace return_type_deduction_ok {
__anon1df60a8b1e02(auto a) 221*67e74705SXin Li auto l = [](auto a) ->auto { return a; }(2);
222*67e74705SXin Li auto l2 = [](auto a) ->decltype(auto) { return a; }(2);
__anon1df60a8b1f02(auto a) 223*67e74705SXin Li auto l3 = [](auto a) { return a; }(2);
224*67e74705SXin Li
225*67e74705SXin Li }
226*67e74705SXin Li
227*67e74705SXin Li namespace generic_lambda_as_default_argument_ok {
__anon1df60a8b2002(auto a)228*67e74705SXin Li void test(int i = [](auto a)->int { return a; }(3)) {
229*67e74705SXin Li }
230*67e74705SXin Li }
231*67e74705SXin Li
232*67e74705SXin Li namespace nested_non_capturing_lambda_tests {
print(Ts...)233*67e74705SXin Li template<class ... Ts> void print(Ts ...) { }
test()234*67e74705SXin Li int test() {
235*67e74705SXin Li {
236*67e74705SXin Li auto L = [](auto a) {
237*67e74705SXin Li return [](auto b) {
238*67e74705SXin Li return b;
239*67e74705SXin Li };
240*67e74705SXin Li };
241*67e74705SXin Li auto M = L(3);
242*67e74705SXin Li M(4.15);
243*67e74705SXin Li }
244*67e74705SXin Li {
245*67e74705SXin Li int i = 10; //expected-note 3{{declared here}}
246*67e74705SXin Li auto L = [](auto a) {
247*67e74705SXin Li return [](auto b) { //expected-note 3{{begins here}}
248*67e74705SXin Li i = b; //expected-error 3{{cannot be implicitly captured}}
249*67e74705SXin Li return b;
250*67e74705SXin Li };
251*67e74705SXin Li };
252*67e74705SXin Li auto M = L(3); //expected-note{{instantiation}}
253*67e74705SXin Li M(4.15); //expected-note{{instantiation}}
254*67e74705SXin Li }
255*67e74705SXin Li {
256*67e74705SXin Li int i = 10;
257*67e74705SXin Li auto L = [](auto a) {
258*67e74705SXin Li return [](auto b) {
259*67e74705SXin Li b = sizeof(i); //ok
260*67e74705SXin Li return b;
261*67e74705SXin Li };
262*67e74705SXin Li };
263*67e74705SXin Li }
264*67e74705SXin Li {
265*67e74705SXin Li auto L = [](auto a) {
266*67e74705SXin Li print("a = ", a, "\n");
267*67e74705SXin Li return [](auto b) ->decltype(a) {
268*67e74705SXin Li print("b = ", b, "\n");
269*67e74705SXin Li return b;
270*67e74705SXin Li };
271*67e74705SXin Li };
272*67e74705SXin Li auto M = L(3);
273*67e74705SXin Li M(4.15);
274*67e74705SXin Li }
275*67e74705SXin Li
276*67e74705SXin Li {
277*67e74705SXin Li auto L = [](auto a) ->decltype(a) {
278*67e74705SXin Li print("a = ", a, "\n");
279*67e74705SXin Li return [](auto b) ->decltype(a) { //expected-error{{no viable conversion}}\
280*67e74705SXin Li //expected-note{{candidate template ignored}}
281*67e74705SXin Li print("b = ", b, "\n");
282*67e74705SXin Li return b;
283*67e74705SXin Li };
284*67e74705SXin Li };
285*67e74705SXin Li auto M = L(3); //expected-note{{in instantiation of}}
286*67e74705SXin Li }
287*67e74705SXin Li {
288*67e74705SXin Li auto L = [](auto a) {
289*67e74705SXin Li print("a = ", a, "\n");
290*67e74705SXin Li return [](auto ... b) ->decltype(a) {
291*67e74705SXin Li print("b = ", b ..., "\n");
292*67e74705SXin Li return 4;
293*67e74705SXin Li };
294*67e74705SXin Li };
295*67e74705SXin Li auto M = L(3);
296*67e74705SXin Li M(4.15, 3, "fv");
297*67e74705SXin Li }
298*67e74705SXin Li
299*67e74705SXin Li {
300*67e74705SXin Li auto L = [](auto a) {
301*67e74705SXin Li print("a = ", a, "\n");
302*67e74705SXin Li return [](auto ... b) ->decltype(a) {
303*67e74705SXin Li print("b = ", b ..., "\n");
304*67e74705SXin Li return 4;
305*67e74705SXin Li };
306*67e74705SXin Li };
307*67e74705SXin Li auto M = L(3);
308*67e74705SXin Li int (*fp)(double, int, const char*) = M;
309*67e74705SXin Li fp(4.15, 3, "fv");
310*67e74705SXin Li }
311*67e74705SXin Li
312*67e74705SXin Li {
313*67e74705SXin Li auto L = [](auto a) {
314*67e74705SXin Li print("a = ", a, "\n");
315*67e74705SXin Li return [](char b) {
316*67e74705SXin Li return [](auto ... c) ->decltype(b) {
317*67e74705SXin Li print("c = ", c ..., "\n");
318*67e74705SXin Li return 42;
319*67e74705SXin Li };
320*67e74705SXin Li };
321*67e74705SXin Li };
322*67e74705SXin Li L(4);
323*67e74705SXin Li auto M = L(3);
324*67e74705SXin Li M('a');
325*67e74705SXin Li auto N = M('x');
326*67e74705SXin Li N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
327*67e74705SXin Li char (*np)(const char*, int, const char*, double, const char*, int) = N;
328*67e74705SXin Li np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
329*67e74705SXin Li }
330*67e74705SXin Li
331*67e74705SXin Li
332*67e74705SXin Li {
333*67e74705SXin Li auto L = [](auto a) {
334*67e74705SXin Li print("a = ", a, "\n");
335*67e74705SXin Li return [](decltype(a) b) {
336*67e74705SXin Li return [](auto ... c) ->decltype(b) {
337*67e74705SXin Li print("c = ", c ..., "\n");
338*67e74705SXin Li return 42;
339*67e74705SXin Li };
340*67e74705SXin Li };
341*67e74705SXin Li };
342*67e74705SXin Li L('4');
343*67e74705SXin Li auto M = L('3');
344*67e74705SXin Li M('a');
345*67e74705SXin Li auto N = M('x');
346*67e74705SXin Li N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
347*67e74705SXin Li char (*np)(const char*, int, const char*, double, const char*, int) = N;
348*67e74705SXin Li np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
349*67e74705SXin Li }
350*67e74705SXin Li
351*67e74705SXin Li
352*67e74705SXin Li {
353*67e74705SXin Li struct X {
354*67e74705SXin Li static void foo(double d) { }
355*67e74705SXin Li void test() {
356*67e74705SXin Li auto L = [](auto a) {
357*67e74705SXin Li print("a = ", a, "\n");
358*67e74705SXin Li foo(a);
359*67e74705SXin Li return [](decltype(a) b) {
360*67e74705SXin Li foo(b);
361*67e74705SXin Li foo(sizeof(a) + sizeof(b));
362*67e74705SXin Li return [](auto ... c) ->decltype(b) {
363*67e74705SXin Li print("c = ", c ..., "\n");
364*67e74705SXin Li foo(decltype(b){});
365*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
366*67e74705SXin Li return 42;
367*67e74705SXin Li };
368*67e74705SXin Li };
369*67e74705SXin Li };
370*67e74705SXin Li L('4');
371*67e74705SXin Li auto M = L('3');
372*67e74705SXin Li M('a');
373*67e74705SXin Li auto N = M('x');
374*67e74705SXin Li N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
375*67e74705SXin Li char (*np)(const char*, int, const char*, double, const char*, int) = N;
376*67e74705SXin Li np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
377*67e74705SXin Li }
378*67e74705SXin Li };
379*67e74705SXin Li X x;
380*67e74705SXin Li x.test();
381*67e74705SXin Li }
382*67e74705SXin Li // Make sure we can escape the function
383*67e74705SXin Li {
384*67e74705SXin Li struct X {
385*67e74705SXin Li static void foo(double d) { }
386*67e74705SXin Li auto test() {
387*67e74705SXin Li auto L = [](auto a) {
388*67e74705SXin Li print("a = ", a, "\n");
389*67e74705SXin Li foo(a);
390*67e74705SXin Li return [](decltype(a) b) {
391*67e74705SXin Li foo(b);
392*67e74705SXin Li foo(sizeof(a) + sizeof(b));
393*67e74705SXin Li return [](auto ... c) ->decltype(b) {
394*67e74705SXin Li print("c = ", c ..., "\n");
395*67e74705SXin Li foo(decltype(b){});
396*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
397*67e74705SXin Li return 42;
398*67e74705SXin Li };
399*67e74705SXin Li };
400*67e74705SXin Li };
401*67e74705SXin Li return L;
402*67e74705SXin Li }
403*67e74705SXin Li };
404*67e74705SXin Li X x;
405*67e74705SXin Li auto L = x.test();
406*67e74705SXin Li L('4');
407*67e74705SXin Li auto M = L('3');
408*67e74705SXin Li M('a');
409*67e74705SXin Li auto N = M('x');
410*67e74705SXin Li N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
411*67e74705SXin Li char (*np)(const char*, int, const char*, double, const char*, int) = N;
412*67e74705SXin Li np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
413*67e74705SXin Li }
414*67e74705SXin Li
415*67e74705SXin Li {
416*67e74705SXin Li struct X {
417*67e74705SXin Li static void foo(double d) { }
418*67e74705SXin Li auto test() {
419*67e74705SXin Li auto L = [](auto a) {
420*67e74705SXin Li print("a = ", a, "\n");
421*67e74705SXin Li foo(a);
422*67e74705SXin Li return [](decltype(a) b) {
423*67e74705SXin Li foo(b);
424*67e74705SXin Li foo(sizeof(a) + sizeof(b));
425*67e74705SXin Li return [](auto ... c) {
426*67e74705SXin Li print("c = ", c ..., "\n");
427*67e74705SXin Li foo(decltype(b){});
428*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
429*67e74705SXin Li return [](decltype(c) ... d) ->decltype(a) { //expected-note{{candidate}}
430*67e74705SXin Li print("d = ", d ..., "\n");
431*67e74705SXin Li foo(decltype(b){});
432*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
433*67e74705SXin Li return decltype(a){};
434*67e74705SXin Li };
435*67e74705SXin Li };
436*67e74705SXin Li };
437*67e74705SXin Li };
438*67e74705SXin Li return L;
439*67e74705SXin Li }
440*67e74705SXin Li };
441*67e74705SXin Li X x;
442*67e74705SXin Li auto L = x.test();
443*67e74705SXin Li L('4');
444*67e74705SXin Li auto M = L('3');
445*67e74705SXin Li M('a');
446*67e74705SXin Li auto N = M('x');
447*67e74705SXin Li auto O = N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
448*67e74705SXin Li char (*np)(const char*, int, const char*, double, const char*, int) = O;
449*67e74705SXin Li np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
450*67e74705SXin Li int (*np2)(const char*, int, const char*, double, const char*, int) = O; // expected-error{{no viable conversion}}
451*67e74705SXin Li
452*67e74705SXin Li }
453*67e74705SXin Li } // end test()
454*67e74705SXin Li
455*67e74705SXin Li namespace wrapped_within_templates {
456*67e74705SXin Li
457*67e74705SXin Li namespace explicit_return {
fooT(T t)458*67e74705SXin Li template<class T> int fooT(T t) {
459*67e74705SXin Li auto L = [](auto a) -> void {
460*67e74705SXin Li auto M = [](char b) -> void {
461*67e74705SXin Li auto N = [](auto c) -> void {
462*67e74705SXin Li int x = 0;
463*67e74705SXin Li x = sizeof(a);
464*67e74705SXin Li x = sizeof(b);
465*67e74705SXin Li x = sizeof(c);
466*67e74705SXin Li };
467*67e74705SXin Li N('a');
468*67e74705SXin Li N(decltype(a){});
469*67e74705SXin Li };
470*67e74705SXin Li };
471*67e74705SXin Li L(t);
472*67e74705SXin Li L(3.14);
473*67e74705SXin Li return 0;
474*67e74705SXin Li }
475*67e74705SXin Li
476*67e74705SXin Li int run = fooT('a') + fooT(3.14);
477*67e74705SXin Li
478*67e74705SXin Li } // end explicit_return
479*67e74705SXin Li
480*67e74705SXin Li namespace implicit_return_deduction {
fooT(T t)481*67e74705SXin Li template<class T> auto fooT(T t) {
482*67e74705SXin Li auto L = [](auto a) {
483*67e74705SXin Li auto M = [](char b) {
484*67e74705SXin Li auto N = [](auto c) {
485*67e74705SXin Li int x = 0;
486*67e74705SXin Li x = sizeof(a);
487*67e74705SXin Li x = sizeof(b);
488*67e74705SXin Li x = sizeof(c);
489*67e74705SXin Li };
490*67e74705SXin Li N('a');
491*67e74705SXin Li N(decltype(a){});
492*67e74705SXin Li };
493*67e74705SXin Li };
494*67e74705SXin Li L(t);
495*67e74705SXin Li L(3.14);
496*67e74705SXin Li return 0;
497*67e74705SXin Li }
498*67e74705SXin Li
499*67e74705SXin Li int run = fooT('a') + fooT(3.14);
500*67e74705SXin Li
print(Ts...ts)501*67e74705SXin Li template<class ... Ts> void print(Ts ... ts) { }
502*67e74705SXin Li
fooV(Ts...ts)503*67e74705SXin Li template<class ... Ts> auto fooV(Ts ... ts) {
504*67e74705SXin Li auto L = [](auto ... a) {
505*67e74705SXin Li auto M = [](decltype(a) ... b) {
506*67e74705SXin Li auto N = [](auto c) {
507*67e74705SXin Li int x = 0;
508*67e74705SXin Li x = sizeof...(a);
509*67e74705SXin Li x = sizeof...(b);
510*67e74705SXin Li x = sizeof(c);
511*67e74705SXin Li };
512*67e74705SXin Li N('a');
513*67e74705SXin Li N(N);
514*67e74705SXin Li N(first<Ts...>{});
515*67e74705SXin Li };
516*67e74705SXin Li M(a...);
517*67e74705SXin Li print("a = ", a..., "\n");
518*67e74705SXin Li };
519*67e74705SXin Li L(L, ts...);
520*67e74705SXin Li print("ts = ", ts..., "\n");
521*67e74705SXin Li return 0;
522*67e74705SXin Li }
523*67e74705SXin Li
524*67e74705SXin Li int run2 = fooV(3.14, " ", '4', 5) + fooV("BC", 3, 2.77, 'A', float{}, short{}, unsigned{});
525*67e74705SXin Li
526*67e74705SXin Li } //implicit_return_deduction
527*67e74705SXin Li
528*67e74705SXin Li
529*67e74705SXin Li } //wrapped_within_templates
530*67e74705SXin Li
531*67e74705SXin Li namespace at_ns_scope {
foo(double d)532*67e74705SXin Li void foo(double d) { }
test()533*67e74705SXin Li auto test() {
534*67e74705SXin Li auto L = [](auto a) {
535*67e74705SXin Li print("a = ", a, "\n");
536*67e74705SXin Li foo(a);
537*67e74705SXin Li return [](decltype(a) b) {
538*67e74705SXin Li foo(b);
539*67e74705SXin Li foo(sizeof(a) + sizeof(b));
540*67e74705SXin Li return [](auto ... c) {
541*67e74705SXin Li print("c = ", c ..., "\n");
542*67e74705SXin Li foo(decltype(b){});
543*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
544*67e74705SXin Li return [](decltype(c) ... d) ->decltype(a) { //expected-note{{candidate}}
545*67e74705SXin Li print("d = ", d ..., "\n");
546*67e74705SXin Li foo(decltype(b){});
547*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
548*67e74705SXin Li return decltype(a){};
549*67e74705SXin Li };
550*67e74705SXin Li };
551*67e74705SXin Li };
552*67e74705SXin Li };
553*67e74705SXin Li return L;
554*67e74705SXin Li }
555*67e74705SXin Li auto L = test();
556*67e74705SXin Li auto L_test = L('4');
557*67e74705SXin Li auto M = L('3');
558*67e74705SXin Li auto M_test = M('a');
559*67e74705SXin Li auto N = M('x');
560*67e74705SXin Li auto O = N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
561*67e74705SXin Li char (*np)(const char*, int, const char*, double, const char*, int) = O;
562*67e74705SXin Li auto NP_result = np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
563*67e74705SXin Li int (*np2)(const char*, int, const char*, double, const char*, int) = O; // expected-error{{no viable conversion}}
564*67e74705SXin Li
565*67e74705SXin Li
566*67e74705SXin Li
567*67e74705SXin Li }
568*67e74705SXin Li
569*67e74705SXin Li namespace variadic_tests_1 {
print(Ts...ts)570*67e74705SXin Li template<class ... Ts> void print(Ts ... ts) { }
571*67e74705SXin Li
FirstArg(F & f,Rest...)572*67e74705SXin Li template<class F, class ... Rest> F& FirstArg(F& f, Rest...) { return f; }
573*67e74705SXin Li
fooV(Ts...ts)574*67e74705SXin Li template<class ... Ts> int fooV(Ts ... ts) {
575*67e74705SXin Li auto L = [](auto ... a) -> void {
576*67e74705SXin Li auto M = [](decltype(a) ... b) -> void {
577*67e74705SXin Li auto N = [](auto c) -> void {
578*67e74705SXin Li int x = 0;
579*67e74705SXin Li x = sizeof...(a);
580*67e74705SXin Li x = sizeof...(b);
581*67e74705SXin Li x = sizeof(c);
582*67e74705SXin Li };
583*67e74705SXin Li N('a');
584*67e74705SXin Li N(N);
585*67e74705SXin Li N(first<Ts...>{});
586*67e74705SXin Li };
587*67e74705SXin Li M(a...);
588*67e74705SXin Li print("a = ", a..., "\n");
589*67e74705SXin Li };
590*67e74705SXin Li L(L, ts...);
591*67e74705SXin Li print("ts = ", ts..., "\n");
592*67e74705SXin Li return 0;
593*67e74705SXin Li }
594*67e74705SXin Li
595*67e74705SXin Li int run2 = fooV(3.14, " ", '4', 5) + fooV("BC", 3, 2.77, 'A', float{}, short{}, unsigned{});
596*67e74705SXin Li
597*67e74705SXin Li namespace more_variadic_1 {
598*67e74705SXin Li
fooV(Ts...ts)599*67e74705SXin Li template<class ... Ts> int fooV(Ts ... ts) {
600*67e74705SXin Li auto L = [](auto ... a) {
601*67e74705SXin Li auto M = [](decltype(a) ... b) -> void {
602*67e74705SXin Li auto N = [](auto c) -> void {
603*67e74705SXin Li int x = 0;
604*67e74705SXin Li x = sizeof...(a);
605*67e74705SXin Li x = sizeof...(b);
606*67e74705SXin Li x = sizeof(c);
607*67e74705SXin Li };
608*67e74705SXin Li N('a');
609*67e74705SXin Li N(N);
610*67e74705SXin Li N(first<Ts...>{});
611*67e74705SXin Li };
612*67e74705SXin Li M(a...);
613*67e74705SXin Li return M;
614*67e74705SXin Li };
615*67e74705SXin Li auto M = L(L, ts...);
616*67e74705SXin Li decltype(L(L, ts...)) (*fp)(decltype(L), decltype(ts) ...) = L;
617*67e74705SXin Li void (*fp2)(decltype(L), decltype(ts) ...) = L(L, ts...);
618*67e74705SXin Li
619*67e74705SXin Li {
620*67e74705SXin Li auto L = [](auto ... a) {
621*67e74705SXin Li auto M = [](decltype(a) ... b) {
622*67e74705SXin Li auto N = [](auto c) -> void {
623*67e74705SXin Li int x = 0;
624*67e74705SXin Li x = sizeof...(a);
625*67e74705SXin Li x = sizeof...(b);
626*67e74705SXin Li x = sizeof(c);
627*67e74705SXin Li };
628*67e74705SXin Li N('a');
629*67e74705SXin Li N(N);
630*67e74705SXin Li N(first<Ts...>{});
631*67e74705SXin Li return N;
632*67e74705SXin Li };
633*67e74705SXin Li M(a...);
634*67e74705SXin Li return M;
635*67e74705SXin Li };
636*67e74705SXin Li auto M = L(L, ts...);
637*67e74705SXin Li decltype(L(L, ts...)) (*fp)(decltype(L), decltype(ts) ...) = L;
638*67e74705SXin Li fp(L, ts...);
639*67e74705SXin Li decltype(L(L, ts...)(L, ts...)) (*fp2)(decltype(L), decltype(ts) ...) = L(L, ts...);
640*67e74705SXin Li fp2 = fp(L, ts...);
641*67e74705SXin Li void (*fp3)(char) = fp2(L, ts...);
642*67e74705SXin Li fp3('a');
643*67e74705SXin Li }
644*67e74705SXin Li return 0;
645*67e74705SXin Li }
646*67e74705SXin Li
647*67e74705SXin Li int run2 = fooV(3.14, " ", '4', 5) + fooV("BC", 3, 2.77, 'A', float{}, short{}, unsigned{});
648*67e74705SXin Li
649*67e74705SXin Li
650*67e74705SXin Li } //end ns more_variadic_1
651*67e74705SXin Li
652*67e74705SXin Li } // end ns variadic_tests_1
653*67e74705SXin Li
654*67e74705SXin Li namespace at_ns_scope_within_class_member {
655*67e74705SXin Li struct X {
foonested_non_capturing_lambda_tests::at_ns_scope_within_class_member::X656*67e74705SXin Li static void foo(double d) { }
testnested_non_capturing_lambda_tests::at_ns_scope_within_class_member::X657*67e74705SXin Li auto test() {
658*67e74705SXin Li auto L = [](auto a) {
659*67e74705SXin Li print("a = ", a, "\n");
660*67e74705SXin Li foo(a);
661*67e74705SXin Li return [](decltype(a) b) {
662*67e74705SXin Li foo(b);
663*67e74705SXin Li foo(sizeof(a) + sizeof(b));
664*67e74705SXin Li return [](auto ... c) {
665*67e74705SXin Li print("c = ", c ..., "\n");
666*67e74705SXin Li foo(decltype(b){});
667*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
668*67e74705SXin Li return [](decltype(c) ... d) ->decltype(a) { //expected-note{{candidate}}
669*67e74705SXin Li print("d = ", d ..., "\n");
670*67e74705SXin Li foo(decltype(b){});
671*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
672*67e74705SXin Li return decltype(a){};
673*67e74705SXin Li };
674*67e74705SXin Li };
675*67e74705SXin Li };
676*67e74705SXin Li };
677*67e74705SXin Li return L;
678*67e74705SXin Li }
679*67e74705SXin Li };
680*67e74705SXin Li X x;
681*67e74705SXin Li auto L = x.test();
682*67e74705SXin Li auto L_test = L('4');
683*67e74705SXin Li auto M = L('3');
684*67e74705SXin Li auto M_test = M('a');
685*67e74705SXin Li auto N = M('x');
686*67e74705SXin Li auto O = N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
687*67e74705SXin Li char (*np)(const char*, int, const char*, double, const char*, int) = O;
688*67e74705SXin Li auto NP_result = np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
689*67e74705SXin Li int (*np2)(const char*, int, const char*, double, const char*, int) = O; // expected-error{{no viable conversion}}
690*67e74705SXin Li
691*67e74705SXin Li } //end at_ns_scope_within_class_member
692*67e74705SXin Li
693*67e74705SXin Li
694*67e74705SXin Li namespace at_ns_scope_within_class_template_member {
695*67e74705SXin Li struct X {
foonested_non_capturing_lambda_tests::at_ns_scope_within_class_template_member::X696*67e74705SXin Li static void foo(double d) { }
697*67e74705SXin Li template<class T = int>
testnested_non_capturing_lambda_tests::at_ns_scope_within_class_template_member::X698*67e74705SXin Li auto test(T = T{}) {
__anon1df60a8b4d02(auto a) 699*67e74705SXin Li auto L = [](auto a) {
700*67e74705SXin Li print("a = ", a, "\n");
701*67e74705SXin Li foo(a);
702*67e74705SXin Li return [](decltype(a) b) {
703*67e74705SXin Li foo(b);
704*67e74705SXin Li foo(sizeof(a) + sizeof(b));
705*67e74705SXin Li return [](auto ... c) {
706*67e74705SXin Li print("c = ", c ..., "\n");
707*67e74705SXin Li foo(decltype(b){});
708*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
709*67e74705SXin Li return [](decltype(c) ... d) ->decltype(a) { //expected-note{{candidate}}
710*67e74705SXin Li print("d = ", d ..., "\n");
711*67e74705SXin Li foo(decltype(b){});
712*67e74705SXin Li foo(sizeof(decltype(a)*) + sizeof(decltype(b)*));
713*67e74705SXin Li return decltype(a){};
714*67e74705SXin Li };
715*67e74705SXin Li };
716*67e74705SXin Li };
717*67e74705SXin Li };
718*67e74705SXin Li return L;
719*67e74705SXin Li }
720*67e74705SXin Li
721*67e74705SXin Li };
722*67e74705SXin Li X x;
723*67e74705SXin Li auto L = x.test();
724*67e74705SXin Li auto L_test = L('4');
725*67e74705SXin Li auto M = L('3');
726*67e74705SXin Li auto M_test = M('a');
727*67e74705SXin Li auto N = M('x');
728*67e74705SXin Li auto O = N("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
729*67e74705SXin Li char (*np)(const char*, int, const char*, double, const char*, int) = O;
730*67e74705SXin Li auto NP_result = np("\n3 = ", 3, "\n6.14 = ", 6.14, "\n4'123'456 = ", 4'123'456);
731*67e74705SXin Li int (*np2)(const char*, int, const char*, double, const char*, int) = O; // expected-error{{no viable conversion}}
732*67e74705SXin Li
733*67e74705SXin Li } //end at_ns_scope_within_class_member
734*67e74705SXin Li
735*67e74705SXin Li
736*67e74705SXin Li namespace nested_generic_lambdas_123 {
test()737*67e74705SXin Li void test() {
738*67e74705SXin Li auto L = [](auto a) -> int {
739*67e74705SXin Li auto M = [](auto b, decltype(a) b2) -> int {
740*67e74705SXin Li return 1;
741*67e74705SXin Li };
742*67e74705SXin Li M(a, a);
743*67e74705SXin Li };
744*67e74705SXin Li L(3);
745*67e74705SXin Li }
foo(T)746*67e74705SXin Li template<class T> void foo(T) {
747*67e74705SXin Li auto L = [](auto a) { return a; };
748*67e74705SXin Li }
749*67e74705SXin Li template void foo(int);
750*67e74705SXin Li } // end ns nested_generic_lambdas_123
751*67e74705SXin Li
752*67e74705SXin Li namespace nested_fptr_235 {
test()753*67e74705SXin Li int test()
754*67e74705SXin Li {
755*67e74705SXin Li auto L = [](auto b) {
756*67e74705SXin Li return [](auto a) ->decltype(a) { return a; };
757*67e74705SXin Li };
758*67e74705SXin Li int (*fp)(int) = L(8);
759*67e74705SXin Li fp(5);
760*67e74705SXin Li L(3);
761*67e74705SXin Li char (*fc)(char) = L('a');
762*67e74705SXin Li fc('b');
763*67e74705SXin Li L('c');
764*67e74705SXin Li double (*fd)(double) = L(3.14);
765*67e74705SXin Li fd(3.14);
766*67e74705SXin Li fd(6.26);
767*67e74705SXin Li return 0;
768*67e74705SXin Li }
769*67e74705SXin Li int run = test();
770*67e74705SXin Li }
771*67e74705SXin Li
772*67e74705SXin Li
773*67e74705SXin Li namespace fptr_with_decltype_return_type {
FirstArg(F & f,Rest &...r)774*67e74705SXin Li template<class F, class ... Rest> F& FirstArg(F& f, Rest& ... r) { return f; };
vfun(Ts &&...ts)775*67e74705SXin Li template<class ... Ts> auto vfun(Ts&& ... ts) {
776*67e74705SXin Li print(ts...);
777*67e74705SXin Li return FirstArg(ts...);
778*67e74705SXin Li }
test()779*67e74705SXin Li int test()
780*67e74705SXin Li {
781*67e74705SXin Li {
782*67e74705SXin Li auto L = [](auto ... As) {
783*67e74705SXin Li return [](auto b) ->decltype(b) {
784*67e74705SXin Li vfun([](decltype(As) a) -> decltype(a) { return a; } ...)(first<decltype(As)...>{});
785*67e74705SXin Li return decltype(b){};
786*67e74705SXin Li };
787*67e74705SXin Li };
788*67e74705SXin Li auto LL = L(1, 'a', 3.14, "abc");
789*67e74705SXin Li LL("dim");
790*67e74705SXin Li }
791*67e74705SXin Li return 0;
792*67e74705SXin Li }
793*67e74705SXin Li int run = test();
794*67e74705SXin Li }
795*67e74705SXin Li
796*67e74705SXin Li } // end ns nested_non_capturing_lambda_tests
797*67e74705SXin Li
798*67e74705SXin Li namespace PR17476 {
799*67e74705SXin Li struct string {
stringPR17476::string800*67e74705SXin Li string(const char *__s) { }
operator +=PR17476::string801*67e74705SXin Li string &operator+=(const string &__str) { return *this; }
802*67e74705SXin Li };
803*67e74705SXin Li
804*67e74705SXin Li template <class T>
finalizeDefaultAtomValues()805*67e74705SXin Li void finalizeDefaultAtomValues() {
806*67e74705SXin Li auto startEnd = [](const char * sym) -> void {
807*67e74705SXin Li string start("__");
808*67e74705SXin Li start += sym;
809*67e74705SXin Li };
810*67e74705SXin Li startEnd("preinit_array");
811*67e74705SXin Li }
812*67e74705SXin Li
f()813*67e74705SXin Li void f() { finalizeDefaultAtomValues<char>(); }
814*67e74705SXin Li
815*67e74705SXin Li }
816*67e74705SXin Li
817*67e74705SXin Li namespace PR17476_variant {
818*67e74705SXin Li struct string {
stringPR17476_variant::string819*67e74705SXin Li string(const char *__s) { }
operator +=PR17476_variant::string820*67e74705SXin Li string &operator+=(const string &__str) { return *this; }
821*67e74705SXin Li };
822*67e74705SXin Li
823*67e74705SXin Li template <class T>
finalizeDefaultAtomValues()824*67e74705SXin Li void finalizeDefaultAtomValues() {
825*67e74705SXin Li auto startEnd = [](const T *sym) -> void {
826*67e74705SXin Li string start("__");
827*67e74705SXin Li start += sym;
828*67e74705SXin Li };
829*67e74705SXin Li startEnd("preinit_array");
830*67e74705SXin Li }
831*67e74705SXin Li
f()832*67e74705SXin Li void f() { finalizeDefaultAtomValues<char>(); }
833*67e74705SXin Li
834*67e74705SXin Li }
835*67e74705SXin Li
836*67e74705SXin Li namespace PR17877_lambda_declcontext_and_get_cur_lambda_disconnect {
837*67e74705SXin Li
838*67e74705SXin Li
839*67e74705SXin Li template<class T> struct U {
840*67e74705SXin Li int t = 0;
841*67e74705SXin Li };
842*67e74705SXin Li
843*67e74705SXin Li template<class T>
844*67e74705SXin Li struct V {
sizePR17877_lambda_declcontext_and_get_cur_lambda_disconnect::V845*67e74705SXin Li U<T> size() const { return U<T>{}; }
846*67e74705SXin Li };
847*67e74705SXin Li
848*67e74705SXin Li template<typename T>
Do()849*67e74705SXin Li void Do() {
850*67e74705SXin Li V<int> v{};
851*67e74705SXin Li [=] { v.size(); };
852*67e74705SXin Li }
853*67e74705SXin Li
854*67e74705SXin Li }
855*67e74705SXin Li
856*67e74705SXin Li namespace inclass_lambdas_within_nested_classes {
857*67e74705SXin Li namespace ns1 {
858*67e74705SXin Li
859*67e74705SXin Li struct X1 {
860*67e74705SXin Li struct X2 {
__anon1df60a8b5902(auto i) 861*67e74705SXin Li enum { E = [](auto i) { return i; }(3) }; //expected-error{{inside of a constant expression}}\
862*67e74705SXin Li //expected-error{{constant}}\
863*67e74705SXin Li //expected-note{{non-literal type}}
__anon1df60a8b5a02inclass_lambdas_within_nested_classes::ns1::X1::X2864*67e74705SXin Li int L = ([] (int i) { return i; })(2);
__anon1df60a8b5b02inclass_lambdas_within_nested_classes::ns1::X1::X2865*67e74705SXin Li void foo(int i = ([] (int i) { return i; })(2)) { }
__anon1df60a8b5c02inclass_lambdas_within_nested_classes::ns1::X1::X2866*67e74705SXin Li int B : ([](int i) { return i; })(3); //expected-error{{inside of a constant expression}}\
867*67e74705SXin Li //expected-error{{not an integral constant}}\
868*67e74705SXin Li //expected-note{{non-literal type}}
__anon1df60a8b5d02inclass_lambdas_within_nested_classes::ns1::X1::X2869*67e74705SXin Li int arr[([](int i) { return i; })(3)]; //expected-error{{inside of a constant expression}}\
870*67e74705SXin Li //expected-error{{must have a constant size}}
__anon1df60a8b5e02inclass_lambdas_within_nested_classes::ns1::X1::X2871*67e74705SXin Li int (*fp)(int) = [](int i) { return i; };
__anon1df60a8b5f02inclass_lambdas_within_nested_classes::ns1::X1::X2872*67e74705SXin Li void fooptr(int (*fp)(char) = [](char c) { return 0; }) { }
__anon1df60a8b6002inclass_lambdas_within_nested_classes::ns1::X1::X2873*67e74705SXin Li int L2 = ([](auto i) { return i; })(2);
fooGinclass_lambdas_within_nested_classes::ns1::X1::X2874*67e74705SXin Li void fooG(int i = ([] (auto i) { return i; })(2)) { }
__anon1df60a8b6202inclass_lambdas_within_nested_classes::ns1::X1::X2875*67e74705SXin Li int BG : ([](auto i) { return i; })(3); //expected-error{{inside of a constant expression}} \
876*67e74705SXin Li //expected-error{{not an integral constant}}\
877*67e74705SXin Li //expected-note{{non-literal type}}
__anon1df60a8b6302inclass_lambdas_within_nested_classes::ns1::X1::X2878*67e74705SXin Li int arrG[([](auto i) { return i; })(3)]; //expected-error{{inside of a constant expression}}\
879*67e74705SXin Li //expected-error{{must have a constant size}}
__anon1df60a8b6402inclass_lambdas_within_nested_classes::ns1::X1::X2880*67e74705SXin Li int (*fpG)(int) = [](auto i) { return i; };
__anon1df60a8b6502inclass_lambdas_within_nested_classes::ns1::X1::X2881*67e74705SXin Li void fooptrG(int (*fp)(char) = [](auto c) { return 0; }) { }
882*67e74705SXin Li };
883*67e74705SXin Li };
884*67e74705SXin Li } //end ns
885*67e74705SXin Li
886*67e74705SXin Li namespace ns2 {
887*67e74705SXin Li struct X1 {
888*67e74705SXin Li template<class T>
889*67e74705SXin Li struct X2 {
__anon1df60a8b6602inclass_lambdas_within_nested_classes::ns2::X1::X2890*67e74705SXin Li int L = ([] (T i) { return i; })(2);
__anon1df60a8b6702inclass_lambdas_within_nested_classes::ns2::X1::X2891*67e74705SXin Li void foo(int i = ([] (int i) { return i; })(2)) { }
__anon1df60a8b6802inclass_lambdas_within_nested_classes::ns2::X1::X2892*67e74705SXin Li int B : ([](T i) { return i; })(3); //expected-error{{inside of a constant expression}}\
893*67e74705SXin Li //expected-error{{not an integral constant}}\
894*67e74705SXin Li //expected-note{{non-literal type}}
__anon1df60a8b6902inclass_lambdas_within_nested_classes::ns2::X1::X2895*67e74705SXin Li int arr[([](T i) { return i; })(3)]; //expected-error{{inside of a constant expression}}\
896*67e74705SXin Li //expected-error{{must have a constant size}}
__anon1df60a8b6a02inclass_lambdas_within_nested_classes::ns2::X1::X2897*67e74705SXin Li int (*fp)(T) = [](T i) { return i; };
__anon1df60a8b6b02inclass_lambdas_within_nested_classes::ns2::X1::X2898*67e74705SXin Li void fooptr(T (*fp)(char) = [](char c) { return 0; }) { }
__anon1df60a8b6c02inclass_lambdas_within_nested_classes::ns2::X1::X2899*67e74705SXin Li int L2 = ([](auto i) { return i; })(2);
fooGinclass_lambdas_within_nested_classes::ns2::X1::X2900*67e74705SXin Li void fooG(T i = ([] (auto i) { return i; })(2)) { }
__anon1df60a8b6e02inclass_lambdas_within_nested_classes::ns2::X1::X2901*67e74705SXin Li int BG : ([](auto i) { return i; })(3); //expected-error{{not an integral constant}}\
902*67e74705SXin Li //expected-note{{non-literal type}}\
903*67e74705SXin Li //expected-error{{inside of a constant expression}}
__anon1df60a8b6f02inclass_lambdas_within_nested_classes::ns2::X1::X2904*67e74705SXin Li int arrG[([](auto i) { return i; })(3)]; //expected-error{{must have a constant size}} \
905*67e74705SXin Li //expected-error{{inside of a constant expression}}
__anon1df60a8b7002inclass_lambdas_within_nested_classes::ns2::X1::X2906*67e74705SXin Li int (*fpG)(T) = [](auto i) { return i; };
fooptrGinclass_lambdas_within_nested_classes::ns2::X1::X2907*67e74705SXin Li void fooptrG(T (*fp)(char) = [](auto c) { return 0; }) { }
fooG2inclass_lambdas_within_nested_classes::ns2::X1::X2908*67e74705SXin Li template<class U = char> int fooG2(T (*fp)(U) = [](auto a) { return 0; }) { return 0; }
__anon1df60a8b7302inclass_lambdas_within_nested_classes::ns2::X1::X2909*67e74705SXin Li template<class U = char> int fooG3(T (*fp)(U) = [](auto a) { return 0; });
910*67e74705SXin Li };
911*67e74705SXin Li };
912*67e74705SXin Li template<class T>
913*67e74705SXin Li template<class U>
fooG3(T (* fp)(U))914*67e74705SXin Li int X1::X2<T>::fooG3(T (*fp)(U)) { return 0; }
915*67e74705SXin Li X1::X2<int> x2; //expected-note 3{{in instantiation of}}
916*67e74705SXin Li int run1 = x2.fooG2();
917*67e74705SXin Li int run2 = x2.fooG3();
918*67e74705SXin Li } // end ns
919*67e74705SXin Li
920*67e74705SXin Li
921*67e74705SXin Li
922*67e74705SXin Li } //end ns inclass_lambdas_within_nested_classes
923*67e74705SXin Li
924*67e74705SXin Li namespace pr21684_disambiguate_auto_followed_by_ellipsis_no_id {
__anon1df60a8b7402(auto ...) 925*67e74705SXin Li int a = [](auto ...) { return 0; }();
926*67e74705SXin Li }
927*67e74705SXin Li
928*67e74705SXin Li namespace PR22117 {
__anon1df60a8b7502(auto) 929*67e74705SXin Li int x = [](auto) {
930*67e74705SXin Li return [](auto... run_args) {
931*67e74705SXin Li using T = int(decltype(run_args)...);
932*67e74705SXin Li return 0;
933*67e74705SXin Li };
934*67e74705SXin Li }(0)(0);
935*67e74705SXin Li }
936*67e74705SXin Li
937*67e74705SXin Li namespace PR23716 {
938*67e74705SXin Li template<typename T>
f(T x)939*67e74705SXin Li auto f(T x) {
940*67e74705SXin Li auto g = [](auto&&... args) {
941*67e74705SXin Li auto h = [args...]() -> int {
942*67e74705SXin Li return 0;
943*67e74705SXin Li };
944*67e74705SXin Li return h;
945*67e74705SXin Li };
946*67e74705SXin Li return g;
947*67e74705SXin Li }
948*67e74705SXin Li
949*67e74705SXin Li auto x = f(0)();
950*67e74705SXin Li }
951*67e74705SXin Li
952*67e74705SXin Li namespace PR13987 {
953*67e74705SXin Li class Enclosing {
__anon1df60a8b7902()954*67e74705SXin Li void Method(char c = []()->char {
955*67e74705SXin Li int d = [](auto x)->int {
956*67e74705SXin Li struct LocalClass {
957*67e74705SXin Li int Method() { return 0; }
958*67e74705SXin Li };
959*67e74705SXin Li return 0;
960*67e74705SXin Li }(0);
961*67e74705SXin Li return d; }()
962*67e74705SXin Li );
963*67e74705SXin Li };
964*67e74705SXin Li
965*67e74705SXin Li class Enclosing2 {
__anon1df60a8b7b02(auto x)966*67e74705SXin Li void Method(char c = [](auto x)->char {
967*67e74705SXin Li int d = []()->int {
968*67e74705SXin Li struct LocalClass {
969*67e74705SXin Li int Method() { return 0; }
970*67e74705SXin Li };
971*67e74705SXin Li return 0;
972*67e74705SXin Li }();
973*67e74705SXin Li return d; }(0)
974*67e74705SXin Li );
975*67e74705SXin Li };
976*67e74705SXin Li
977*67e74705SXin Li class Enclosing3 {
__anon1df60a8b7d02(auto x)978*67e74705SXin Li void Method(char c = [](auto x)->char {
979*67e74705SXin Li int d = [](auto y)->int {
980*67e74705SXin Li struct LocalClass {
981*67e74705SXin Li int Method() { return 0; }
982*67e74705SXin Li };
983*67e74705SXin Li return 0;
984*67e74705SXin Li }(0);
985*67e74705SXin Li return d; }(0)
986*67e74705SXin Li );
987*67e74705SXin Li };
988*67e74705SXin Li }
989