1fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++1y -DCXX1Y
2fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
3fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali//FIXME: These tests were written when return type deduction had not been implemented
4fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali// for generic lambdas, hence
5fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valitemplate<class T> T id(T t);
6fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valitemplate<class ... Ts> int vfoo(Ts&& ... ts);
7fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valiauto GL1 = [](auto a, int i) -> int { return id(a); };
8fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
9fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valiauto GL2 = [](auto ... As) -> int { return vfoo(As...); };
10fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valiauto GL3 = [](int i, char c, auto* ... As) -> int { return vfoo(As...); };
11fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
12fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valiauto GL4 = [](int i, char c, auto* ... As) -> int { return vfoo(As...); };
13fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
14fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
15fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valivoid foo() {
16fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  auto GL1 = [](auto a, int i) -> int { return id(a); };
17fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
18fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  auto GL2 = [](auto ... As) -> int { return vfoo(As...); };
19fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali}
20fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
21fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Valiint main()
22fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali{
23fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  auto l1 = [](auto a) -> int { return a + 5; };
24fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  auto l2 = [](auto *p) -> int { return p + 5; };
25fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
26fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  struct A { int i; char f(int) { return 'c'; } };
27fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  auto l3 = [](auto &&ur,
28fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                auto &lr,
29fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                auto v,
30fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                int i,
31fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                auto* p,
32fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                auto A::*memvar,
33fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                auto (A::*memfun)(int),
34fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                char c,
35fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                decltype (v)* pv
36fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                , auto (&array)[5]
37fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali              ) -> int { return v + i + c
38fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                          + array[0];
39fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                       };
40fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  int arr[5] = {0, 1, 2, 3, 4 };
41fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  int lval = 0;
42fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  double d = 3.14;
43fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  l3(3, lval, d, lval, &lval, &A::i, &A::f, 'c', &d, arr);
44fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  auto l4 = [](decltype(auto) a) -> int { return 0; }; //expected-error{{decltype(auto)}}
45fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  {
46fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    struct Local {
47fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali      static int ifi(int i) { return i; }
48fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali      static char cfi(int) { return 'a'; }
49fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali      static double dfi(int i) { return i + 3.14; }
50fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali      static Local localfi(int) { return Local{}; }
51fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    };
52fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    auto l4 = [](auto (*fp)(int)) -> int { return fp(3); }; //expected-error{{no viable conversion from 'Local' to 'int'}}
53fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    l4(&Local::ifi);
54fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    l4(&Local::cfi);
55fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    l4(&Local::dfi);
56fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    l4(&Local::localfi); //expected-note{{in instantiation of function template specialization}}
57fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  }
58fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  {
59fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    auto unnamed_parameter = [](auto, auto) -> void { };
60fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    unnamed_parameter(3, '4');
61fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  }
62fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  {
63fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    auto l = [](auto
64fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                      (*)(auto)) { }; //expected-error{{'auto' not allowed}}
65fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    //FIXME: These diagnostics might need some work.
66fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    auto l2 = [](char auto::*pm) { };  //expected-error{{cannot combine with previous}}\
67fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                                         expected-error{{'pm' does not point into a class}}
68fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali    auto l3 = [](char (auto::*pmf)()) { };  //expected-error{{'auto' not allowed}}\
69fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                                              expected-error{{'pmf' does not point into a class}}\
70fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali                                              expected-error{{function cannot return function type 'char ()'}}
71fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali  }
72fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali}
73fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
74fad9e13f3cb85198f0ee5af620ba81cd78574faaFaisal Vali
75