1 | // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++1y -DCXX1Y |
2 | |
3 | namespace test_factorial { |
4 | |
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(); |
17 | overload(F1 f1, F2 f2) : F1(f1), F2(f2) { } |
18 | }; |
19 | |
20 | auto NumParams = [](auto Self, auto h, auto ... rest) -> unsigned { |
21 | return 1 + Self(Self, rest...); |
22 | }; |
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(); |
35 | overload(F1 f1, F2 f2) : F1(f1), F2(f2) { } |
36 | }; |
37 | |
38 | auto NumParams = [](auto Self, auto h, auto ... rest) { |
39 | return 1 + Self(Self, rest...); |
40 | }; |
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 |
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 { |
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 { |
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}} |
95 | -> int { return a + b; }; |
96 | |
97 | void test() { |
98 | struct X { }; |
99 | GL(3, X{}); //expected-error{{no matching function}} |
100 | } |
101 | |
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 { |
113 | int test() { |
114 | auto L = [](auto a) { |
115 | return [=](auto b) { |
116 | return a + b; |
117 | }; |
118 | }; |
119 | } |
120 | auto get_lambda() { |
121 | return [](auto a) { |
122 | return a; |
123 | }; |
124 | }; |
125 | |
126 | int test2() { |
127 | auto L = get_lambda(); |
128 | L(3); |
129 | } |
130 | } |
131 | |
132 | |