1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++1y -DCXX1Y
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_factorial {
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto Fact = [](auto Self, unsigned n) -> unsigned {
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return !n ? 1 : Self(Self, n - 1) * n;
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto six = Fact(Fact, 3);
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace overload_generic_lambda {
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template <class F1, class F2> struct overload : F1, F2 {
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using F1::operator();
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using F2::operator();
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    overload(F1 f1, F2 f2) : F1(f1), F2(f2) { }
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto NumParams = [](auto Self, auto h, auto ... rest) -> unsigned {
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return 1 + Self(Self, rest...);
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto Base = [](auto Self, auto h) -> unsigned {
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return 1;
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  overload<decltype(Base), decltype(NumParams)> O(Base, NumParams);
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int num_params =  O(O, 5, 3, "abc", 3.14, 'a');
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace overload_generic_lambda_return_type_deduction {
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template <class F1, class F2> struct overload : F1, F2 {
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using F1::operator();
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using F2::operator();
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    overload(F1 f1, F2 f2) : F1(f1), F2(f2) { }
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto NumParams = [](auto Self, auto h, auto ... rest) {
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return 1 + Self(Self, rest...);
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto Base = [](auto Self, auto h) {
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return 1;
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  overload<decltype(Base), decltype(NumParams)> O(Base, NumParams);
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int num_params =  O(O, 5, 3, "abc", 3.14, 'a');
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_standard_p5 {
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: This test should eventually compile without an explicit trailing return type
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto glambda = [](auto a, auto&& b) ->bool { return a < b; };
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool b = glambda(3, 3.14); // OK
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_deduction_failure {
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int test() {
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   auto g = [](auto *a) { //expected-note{{candidate template ignored}}
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return a;
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   };
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   struct X { };
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   X *x;
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   g(x);
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   g(3); //expected-error{{no matching function}}
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   return 0;
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_instantiation_or_sfinae_failure {
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint test2() {
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  {
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto L = [](auto *a) {
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                return (*a)(a); }; //expected-error{{called object type 'double' is not a function}}
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    double d;
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    L(&d); //expected-note{{in instantiation of}}
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto M = [](auto b) { return b; };
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    L(&M); // ok
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  {
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto L = [](auto *a) ->decltype (a->foo()) { //expected-note2{{candidate template ignored:}}
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                return (*a)(a); };
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    double d;
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    L(&d); //expected-error{{no matching function for call}}
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto M = [](auto b) { return b; };
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    L(&M); //expected-error{{no matching function for call}}
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return 0;
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace test_misc {
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto GL = [](auto a, decltype(a) b) //expected-note{{candidate function}}
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                -> int { return a + b; };
96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test() {
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   struct X { };
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   GL(3, X{}); //expected-error{{no matching function}}
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test2() {
103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto l = [](auto *a) -> int {
104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              (*a)(a); return 0; }; //expected-error{{called object type 'double' is not a function}}
105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  l(&l);
106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  double d;
107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  l(&d); //expected-note{{in instantiation of}}
108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace nested_lambdas {
113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int test() {
114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto L = [](auto a) {
115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                 return [=](auto b) {
116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           return a + b;
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                        };
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              };
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto get_lambda() {
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return [](auto a) {
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return a;
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int test2() {
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto L = get_lambda();
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    L(3);
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
132