1 // RUN: %clang_cc1 -fsyntax-only -std=c++1y %s -verify
2
3 int a;
4 int &b = [] (int &r) -> decltype(auto) { return r; } (a);
5 int &c = [] (int &r) -> decltype(auto) { return (r); } (a);
__anon8fd688c70102(int &r) 6 int &d = [] (int &r) -> auto & { return r; } (a);
__anon8fd688c70202(int &r) 7 int &e = [] (int &r) -> auto { return r; } (a); // expected-error {{cannot bind to a temporary}}
8 int &f = [] (int r) -> decltype(auto) { return r; } (a); // expected-error {{cannot bind to a temporary}}
9 int &g = [] (int r) -> decltype(auto) { return (r); } (a); // expected-warning {{reference to stack}}
10
11
test_explicit_auto_return()12 int test_explicit_auto_return()
13 {
14 struct X {};
15 auto L = [](auto F, auto a) { return F(a); };
16 auto M = [](auto a) -> auto { return a; }; // OK
17 auto MRef = [](auto b) -> auto& { return b; }; //expected-warning{{reference to stack}}
18 auto MPtr = [](auto c) -> auto* { return &c; }; //expected-warning{{address of stack}}
19 auto MDeclType = [](auto&& d) -> decltype(auto) { return static_cast<decltype(d)>(d); }; //OK
20 M(3);
21
22 auto &&x = MDeclType(X{});
23 auto &&x1 = M(X{});
24 auto &&x2 = MRef(X{});//expected-note{{in instantiation of}}
25 auto &&x3 = MPtr(X{}); //expected-note{{in instantiation of}}
26 return 0;
27 }
28
test_implicit_auto_return()29 int test_implicit_auto_return()
30 {
31 {
32 auto M = [](auto a) { return a; };
33 struct X {};
34 X x = M(X{});
35
36 }
37 }
38
test_multiple_returns()39 int test_multiple_returns() {
40 auto M = [](auto a) {
41 bool k;
42 if (k)
43 return a;
44 else
45 return 5; //expected-error{{deduced as 'int' here}}
46 };
47 M(3); // OK
48 M('a'); //expected-note{{in instantiation of}}
49 return 0;
50 }
test_no_parameter_list()51 int test_no_parameter_list()
52 {
53 static int si = 0;
54 auto M = [] { return 5; }; // OK
55 auto M2 = [] -> auto&& { return si; }; // expected-error{{lambda requires '()'}}
56 M();
57 }
58
test_conditional_in_return()59 int test_conditional_in_return() {
60 auto Fac = [](auto f, auto n) {
61 return n <= 0 ? n : f(f, n - 1) * n;
62 };
63 // FIXME: this test causes a recursive limit - need to error more gracefully.
64 //Fac(Fac, 3);
65
66 }