1 // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++1y -DCXX1Y
2
3 namespace test_factorial {
4
__anon7def28290102(auto Self, unsigned n) 5 auto Fact = [](auto Self, unsigned n) -> unsigned {
6 return !n ? 1 : Self(Self, n - 1) * n;
7 };
8
9 auto six = Fact(Fact, 3);
10
11 }
12
13 namespace overload_generic_lambda {
14 template <class F1, class F2> struct overload : F1, F2 {
15 using F1::operator();
16 using F2::operator();
overloadoverload_generic_lambda::overload17 overload(F1 f1, F2 f2) : F1(f1), F2(f2) { }
18 };
19
__anon7def28290202(auto Self, auto h, auto ... rest) 20 auto NumParams = [](auto Self, auto h, auto ... rest) -> unsigned {
21 return 1 + Self(Self, rest...);
22 };
__anon7def28290302(auto Self, auto h) 23 auto Base = [](auto Self, auto h) -> unsigned {
24 return 1;
25 };
26 overload<decltype(Base), decltype(NumParams)> O(Base, NumParams);
27 int num_params = O(O, 5, 3, "abc", 3.14, 'a');
28 }
29
30
31 namespace overload_generic_lambda_return_type_deduction {
32 template <class F1, class F2> struct overload : F1, F2 {
33 using F1::operator();
34 using F2::operator();
overloadoverload_generic_lambda_return_type_deduction::overload35 overload(F1 f1, F2 f2) : F1(f1), F2(f2) { }
36 };
37
__anon7def28290402(auto Self, auto h, auto ... rest) 38 auto NumParams = [](auto Self, auto h, auto ... rest) {
39 return 1 + Self(Self, rest...);
40 };
__anon7def28290502(auto Self, auto h) 41 auto Base = [](auto Self, auto h) {
42 return 1;
43 };
44 overload<decltype(Base), decltype(NumParams)> O(Base, NumParams);
45 int num_params = O(O, 5, 3, "abc", 3.14, 'a');
46 }
47
48 namespace test_standard_p5 {
49 // FIXME: This test should eventually compile without an explicit trailing return type
__anon7def28290602(auto a, auto&& b) 50 auto glambda = [](auto a, auto&& b) ->bool { return a < b; };
51 bool b = glambda(3, 3.14); // OK
52
53 }
54 namespace test_deduction_failure {
test()55 int test() {
56 auto g = [](auto *a) { //expected-note{{candidate template ignored}}
57 return a;
58 };
59 struct X { };
60 X *x;
61 g(x);
62 g(3); //expected-error{{no matching function}}
63 return 0;
64 }
65
66 }
67
68 namespace test_instantiation_or_sfinae_failure {
test2()69 int test2() {
70 {
71 auto L = [](auto *a) {
72 return (*a)(a); }; //expected-error{{called object type 'double' is not a function}}
73 double d;
74 L(&d); //expected-note{{in instantiation of}}
75 auto M = [](auto b) { return b; };
76 L(&M); // ok
77 }
78 {
79 auto L = [](auto *a) ->decltype (a->foo()) { //expected-note2{{candidate template ignored:}}
80 return (*a)(a); };
81 double d;
82 L(&d); //expected-error{{no matching function for call}}
83 auto M = [](auto b) { return b; };
84 L(&M); //expected-error{{no matching function for call}}
85
86 }
87 return 0;
88 }
89
90
91 }
92
93 namespace test_misc {
94 auto GL = [](auto a, decltype(a) b) //expected-note{{candidate function}}
__anon7def28290b02(auto a, decltype(a) b) 95 -> int { return a + b; };
96
test()97 void test() {
98 struct X { };
99 GL(3, X{}); //expected-error{{no matching function}}
100 }
101
test2()102 void test2() {
103 auto l = [](auto *a) -> int {
104 (*a)(a); return 0; }; //expected-error{{called object type 'double' is not a function}}
105 l(&l);
106 double d;
107 l(&d); //expected-note{{in instantiation of}}
108 }
109
110 }
111
112 namespace nested_lambdas {
test()113 int test() {
114 auto L = [](auto a) {
115 return [=](auto b) {
116 return a + b;
117 };
118 };
119 }
get_lambda()120 auto get_lambda() {
121 return [](auto a) {
122 return a;
123 };
124 };
125
test2()126 int test2() {
127 auto L = get_lambda();
128 L(3);
129 }
130 }
131
132