114d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith// RUN: %clang_cc1 -std=c++11 -Wno-unused-value -fsyntax-only -verify -fblocks %s
214d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith// RUN: %clang_cc1 -std=c++1y -Wno-unused-value -fsyntax-only -verify -fblocks %s
3e81d7e9810eed0d805263791d761ec545d2cf779Eli Friedman
472899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedmannamespace std { class type_info; };
572899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman
6e81d7e9810eed0d805263791d761ec545d2cf779Eli Friedmannamespace ExplicitCapture {
7e81d7e9810eed0d805263791d761ec545d2cf779Eli Friedman  class C {
872899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    int Member;
972899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman
1072899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    static void Overload(int);
1172899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    void Overload();
1272899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    virtual C& Overload(float);
13e81d7e9810eed0d805263791d761ec545d2cf779Eli Friedman
1472899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    void ImplicitThisCapture() {
15b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor      [](){(void)Member;}; // expected-error {{'this' cannot be implicitly captured in this context}}
16b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor      [&](){(void)Member;};
17b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor
18b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor      [this](){(void)Member;};
19b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor      [this]{[this]{};};
20b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor      []{[this]{};};// expected-error {{'this' cannot be implicitly captured in this context}}
21287698336ff9f9315bf814943068d6b8261e517dAaron Ballman      []{Overload(3);};
22287698336ff9f9315bf814943068d6b8261e517dAaron Ballman      []{Overload();}; // expected-error {{'this' cannot be implicitly captured in this context}}
23b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor      []{(void)typeid(Overload());};
24287698336ff9f9315bf814943068d6b8261e517dAaron Ballman      []{(void)typeid(Overload(.5f));};// expected-error {{'this' cannot be implicitly captured in this context}}
2572899c34e3d1abfffa241ad0ce5c4bf175e5ea51Eli Friedman    }
26e81d7e9810eed0d805263791d761ec545d2cf779Eli Friedman  };
27e81d7e9810eed0d805263791d761ec545d2cf779Eli Friedman
28e81d7e9810eed0d805263791d761ec545d2cf779Eli Friedman  void f() {
29287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [this] () {}; // expected-error {{'this' cannot be captured in this context}}
30e81d7e9810eed0d805263791d761ec545d2cf779Eli Friedman  }
31e81d7e9810eed0d805263791d761ec545d2cf779Eli Friedman}
3284b007fae6c0cd30fa07074d34fbe2bf61fa44f9Eli Friedman
3384b007fae6c0cd30fa07074d34fbe2bf61fa44f9Eli Friedmannamespace ReturnDeduction {
3484b007fae6c0cd30fa07074d34fbe2bf61fa44f9Eli Friedman  void test() {
35287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [](){ return 1; };
36287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [](){ return 1; };
37287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [](){ return ({return 1; 1;}); };
38287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [](){ return ({return 'c'; 1;}); }; // expected-error {{must match previous return type}}
39287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    []()->int{ return 'c'; return 1; };
40b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    [](){ return 'c'; return 1; };  // expected-error {{must match previous return type}}
41287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    []() { return; return (void)0; };
42287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [](){ return 1; return 1; };
4384b007fae6c0cd30fa07074d34fbe2bf61fa44f9Eli Friedman  }
4484b007fae6c0cd30fa07074d34fbe2bf61fa44f9Eli Friedman}
45b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman
46b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedmannamespace ImplicitCapture {
47b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman  void test() {
48cefc7b20fdb97b989163199e0849b4325e9b7804Eli Friedman    int a = 0; // expected-note 5 {{declared}}
49287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    []() { return a; }; // expected-error {{variable 'a' cannot be implicitly captured in a lambda with no capture-default specified}} expected-note {{begins here}}
50287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [&]() { return a; };
51287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [=]() { return a; };
52287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [=]() { int* b = &a; }; // expected-error {{cannot initialize a variable of type 'int *' with an rvalue of type 'const int *'}}
53b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    [=]() { return [&]() { return a; }; };
54287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    []() { return [&]() { return a; }; }; // expected-error {{variable 'a' cannot be implicitly captured in a lambda with no capture-default specified}} expected-note {{lambda expression begins here}}
55287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    []() { return ^{ return a; }; };// expected-error {{variable 'a' cannot be implicitly captured in a lambda with no capture-default specified}} expected-note {{lambda expression begins here}}
56287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    []() { return [&a] { return a; }; }; // expected-error 2 {{variable 'a' cannot be implicitly captured in a lambda with no capture-default specified}} expected-note 2 {{lambda expression begins here}}
57287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [=]() { return [&a] { return a; }; }; //
58b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman
59b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman    const int b = 2;
60287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    []() { return b; };
61b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman
62b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman    union { // expected-note {{declared}}
63b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman      int c;
64b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman      float d;
65b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman    };
66b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman    d = 3;
67287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [=]() { return c; }; // expected-error {{unnamed variable cannot be implicitly captured in a lambda expression}}
68b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman
69cefc7b20fdb97b989163199e0849b4325e9b7804Eli Friedman    __block int e; // expected-note 3 {{declared}}
70287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [&]() { return e; }; // expected-error {{__block variable 'e' cannot be captured in a lambda expression}}
71287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [&e]() { return e; }; // expected-error 2 {{__block variable 'e' cannot be captured in a lambda expression}}
72b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman
73b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman    int f[10]; // expected-note {{declared}}
74287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [&]() { return f[2]; };
75f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor    (void) ^{ return []() { return f[2]; }; }; // expected-error {{variable 'f' cannot be implicitly captured in a lambda with no capture-default specified}} \
76f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor    // expected-note{{lambda expression begins here}}
77b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman
78b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman    struct G { G(); G(G&); int a; }; // expected-note 6 {{not viable}}
79b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman    G g;
80287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    [=]() { const G* gg = &g; return gg->a; };
819dd686d2be3c3785a089ff12a3d3eb64e9b32dc0Eli Friedman    [=]() { return [=]{ const G* gg = &g; return gg->a; }(); }; // expected-error {{no matching constructor for initialization of 'G'}}
829dd686d2be3c3785a089ff12a3d3eb64e9b32dc0Eli Friedman    (void)^{ return [=]{ const G* gg = &g; return gg->a; }(); }; // expected-error 2 {{no matching constructor for initialization of 'const G'}}
83210386eb619ea9feef425636150bdffc0538574dEli Friedman
84210386eb619ea9feef425636150bdffc0538574dEli Friedman    const int h = a; // expected-note {{declared}}
85287698336ff9f9315bf814943068d6b8261e517dAaron Ballman    []() { return h; }; // expected-error {{variable 'h' cannot be implicitly captured in a lambda with no capture-default specified}} expected-note {{lambda expression begins here}}
8616581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith
875016a70c183a50845a0421802d161093dd0643f6Richard Smith    // References can appear in constant expressions if they are initialized by
885016a70c183a50845a0421802d161093dd0643f6Richard Smith    // reference constant expressions.
895016a70c183a50845a0421802d161093dd0643f6Richard Smith    int i;
905016a70c183a50845a0421802d161093dd0643f6Richard Smith    int &ref_i = i; // expected-note {{declared}}
9116581335fc32abcbc6ab14eda7af38cf759664b7Richard Smith    [] { return ref_i; }; // expected-error {{variable 'ref_i' cannot be implicitly captured in a lambda with no capture-default specified}} expected-note {{lambda expression begins here}}
925016a70c183a50845a0421802d161093dd0643f6Richard Smith
935016a70c183a50845a0421802d161093dd0643f6Richard Smith    static int j;
945016a70c183a50845a0421802d161093dd0643f6Richard Smith    int &ref_j = j;
955016a70c183a50845a0421802d161093dd0643f6Richard Smith    [] { return ref_j; }; // ok
96b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman  }
97b942cb24a060435b18fef5b43eb33d77afc0d03aEli Friedman}
98b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor
99b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregornamespace PR12031 {
100b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor  struct X {
101b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor    template<typename T>
102b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor    X(const T&);
103b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor    ~X();
104b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor  };
105b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor
106b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor  void f(int i, X x);
107b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor  void g() {
108b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor    const int v = 10;
109b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor    f(v, [](){});
110b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor  }
111b09ab8c293833c3dbcbf78f0db5e01fec46966bfDouglas Gregor}
112359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith
113f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smithnamespace Array {
114359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith  int &f(int *p);
115359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith  char &f(...);
116359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith  void g() {
117f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith    int n = -1;
118359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith    [=] {
119f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith      int arr[n]; // VLA
120359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith    } ();
121359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith
122f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith    const int m = -1;
123f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith    [] {
124f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith      int arr[m]; // expected-error{{negative size}}
125359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith    } ();
126359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith
127f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith    [&] {
128f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith      int arr[m]; // expected-error{{negative size}}
129f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith    } ();
130f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith
131f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith    [=] {
132f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith      int arr[m]; // expected-error{{negative size}}
133359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith    } ();
134359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith
135359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith    [m] {
136f050d2445ed75569ccfe0740caa900403d2ce3b3Richard Smith      int arr[m]; // expected-error{{negative size}}
137359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith    } ();
138359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith  }
139359c89df5479810c9d4784fc0b6ab592eb136777Richard Smith}
14071930e02730f3afecd6e71e4d6831b4a07436a7fEli Friedman
14171930e02730f3afecd6e71e4d6831b4a07436a7fEli Friedmanvoid PR12248()
14271930e02730f3afecd6e71e4d6831b4a07436a7fEli Friedman{
14371930e02730f3afecd6e71e4d6831b4a07436a7fEli Friedman  unsigned int result = 0;
14471930e02730f3afecd6e71e4d6831b4a07436a7fEli Friedman  auto l = [&]() { ++result; };
14571930e02730f3afecd6e71e4d6831b4a07436a7fEli Friedman}
14678dae24600a877f52dbb6e58bfd5778754a00974John McCall
14778dae24600a877f52dbb6e58bfd5778754a00974John McCallnamespace ModifyingCapture {
14878dae24600a877f52dbb6e58bfd5778754a00974John McCall  void test() {
14978dae24600a877f52dbb6e58bfd5778754a00974John McCall    int n = 0;
15078dae24600a877f52dbb6e58bfd5778754a00974John McCall    [=] {
15123dde82d9043d404ee506880796b761bfec93d0dJohn McCall      n = 1; // expected-error {{cannot assign to a variable captured by copy in a non-mutable lambda}}
15278dae24600a877f52dbb6e58bfd5778754a00974John McCall    };
15378dae24600a877f52dbb6e58bfd5778754a00974John McCall  }
15478dae24600a877f52dbb6e58bfd5778754a00974John McCall}
155612409ece080e814f79e06772c690d603f45fbd6Richard Smith
156612409ece080e814f79e06772c690d603f45fbd6Richard Smithnamespace VariadicPackExpansion {
157612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template<typename T, typename U> using Fst = T;
158612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template<typename...Ts> bool g(Fst<bool, Ts> ...bools);
159612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template<typename...Ts> bool f(Ts &&...ts) {
160612409ece080e814f79e06772c690d603f45fbd6Richard Smith    return g<Ts...>([&ts] {
161612409ece080e814f79e06772c690d603f45fbd6Richard Smith      if (!ts)
162612409ece080e814f79e06772c690d603f45fbd6Richard Smith        return false;
163612409ece080e814f79e06772c690d603f45fbd6Richard Smith      --ts;
164612409ece080e814f79e06772c690d603f45fbd6Richard Smith      return true;
165612409ece080e814f79e06772c690d603f45fbd6Richard Smith    } () ...);
166612409ece080e814f79e06772c690d603f45fbd6Richard Smith  }
167612409ece080e814f79e06772c690d603f45fbd6Richard Smith  void h() {
168612409ece080e814f79e06772c690d603f45fbd6Richard Smith    int a = 5, b = 2, c = 3;
169612409ece080e814f79e06772c690d603f45fbd6Richard Smith    while (f(a, b, c)) {
170612409ece080e814f79e06772c690d603f45fbd6Richard Smith    }
171612409ece080e814f79e06772c690d603f45fbd6Richard Smith  }
172612409ece080e814f79e06772c690d603f45fbd6Richard Smith
173612409ece080e814f79e06772c690d603f45fbd6Richard Smith  struct sink {
174612409ece080e814f79e06772c690d603f45fbd6Richard Smith    template<typename...Ts> sink(Ts &&...) {}
175612409ece080e814f79e06772c690d603f45fbd6Richard Smith  };
176612409ece080e814f79e06772c690d603f45fbd6Richard Smith
177612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template<typename...Ts> void local_class() {
178612409ece080e814f79e06772c690d603f45fbd6Richard Smith    sink {
179612409ece080e814f79e06772c690d603f45fbd6Richard Smith      [] (Ts t) {
180612409ece080e814f79e06772c690d603f45fbd6Richard Smith        struct S : Ts {
181612409ece080e814f79e06772c690d603f45fbd6Richard Smith          void f(Ts t) {
182612409ece080e814f79e06772c690d603f45fbd6Richard Smith            Ts &that = *this;
183612409ece080e814f79e06772c690d603f45fbd6Richard Smith            that = t;
184612409ece080e814f79e06772c690d603f45fbd6Richard Smith          }
185612409ece080e814f79e06772c690d603f45fbd6Richard Smith          Ts g() { return *this; };
186612409ece080e814f79e06772c690d603f45fbd6Richard Smith        };
187612409ece080e814f79e06772c690d603f45fbd6Richard Smith        S s;
188612409ece080e814f79e06772c690d603f45fbd6Richard Smith        s.f(t);
189612409ece080e814f79e06772c690d603f45fbd6Richard Smith        return s;
190612409ece080e814f79e06772c690d603f45fbd6Richard Smith      } (Ts()).g() ...
191612409ece080e814f79e06772c690d603f45fbd6Richard Smith    };
192612409ece080e814f79e06772c690d603f45fbd6Richard Smith  };
193612409ece080e814f79e06772c690d603f45fbd6Richard Smith  struct X {}; struct Y {};
194612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template void local_class<X, Y>();
195612409ece080e814f79e06772c690d603f45fbd6Richard Smith
196612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template<typename...Ts> void nested(Ts ...ts) {
197612409ece080e814f79e06772c690d603f45fbd6Richard Smith    f(
198612409ece080e814f79e06772c690d603f45fbd6Richard Smith      // Each expansion of this lambda implicitly captures all of 'ts', because
199612409ece080e814f79e06772c690d603f45fbd6Richard Smith      // the inner lambda also expands 'ts'.
200612409ece080e814f79e06772c690d603f45fbd6Richard Smith      [&] {
201612409ece080e814f79e06772c690d603f45fbd6Richard Smith        return ts + [&] { return f(ts...); } ();
202612409ece080e814f79e06772c690d603f45fbd6Richard Smith      } () ...
203612409ece080e814f79e06772c690d603f45fbd6Richard Smith    );
204612409ece080e814f79e06772c690d603f45fbd6Richard Smith  }
205612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template void nested(int, int, int);
206612409ece080e814f79e06772c690d603f45fbd6Richard Smith
207612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template<typename...Ts> void nested2(Ts ...ts) { // expected-note 2{{here}}
208612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // Capture all 'ts', use only one.
209612409ece080e814f79e06772c690d603f45fbd6Richard Smith    f([&ts...] { return ts; } ()...);
210612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // Capture each 'ts', use it.
211612409ece080e814f79e06772c690d603f45fbd6Richard Smith    f([&ts] { return ts; } ()...);
212612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // Capture all 'ts', use all of them.
213612409ece080e814f79e06772c690d603f45fbd6Richard Smith    f([&ts...] { return (int)f(ts...); } ());
214612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // Capture each 'ts', use all of them. Ill-formed. In more detail:
215612409ece080e814f79e06772c690d603f45fbd6Richard Smith    //
216612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // We instantiate two lambdas here; the first captures ts$0, the second
217612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // captures ts$1. Both of them reference both ts parameters, so both are
218612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // ill-formed because ts can't be implicitly captured.
219612409ece080e814f79e06772c690d603f45fbd6Richard Smith    //
220612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // FIXME: This diagnostic does not explain what's happening. We should
221612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // specify which 'ts' we're referring to in its diagnostic name. We should
222612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // also say which slice of the pack expansion is being performed in the
223612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // instantiation backtrace.
224612409ece080e814f79e06772c690d603f45fbd6Richard Smith    f([&ts] { return (int)f(ts...); } ()...); // \
225612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // expected-error 2{{'ts' cannot be implicitly captured}} \
226612409ece080e814f79e06772c690d603f45fbd6Richard Smith    // expected-note 2{{lambda expression begins here}}
227612409ece080e814f79e06772c690d603f45fbd6Richard Smith  }
228612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template void nested2(int); // ok
229612409ece080e814f79e06772c690d603f45fbd6Richard Smith  template void nested2(int, int); // expected-note {{in instantiation of}}
230612409ece080e814f79e06772c690d603f45fbd6Richard Smith}
2319cd5b24315aea4bc58bac03cfb4874e076b013b8Eli Friedman
2329cd5b24315aea4bc58bac03cfb4874e076b013b8Eli Friedmannamespace PR13860 {
2339cd5b24315aea4bc58bac03cfb4874e076b013b8Eli Friedman  void foo() {
2349cd5b24315aea4bc58bac03cfb4874e076b013b8Eli Friedman    auto x = PR13860UndeclaredIdentifier(); // expected-error {{use of undeclared identifier 'PR13860UndeclaredIdentifier'}}
2359cd5b24315aea4bc58bac03cfb4874e076b013b8Eli Friedman    auto y = [x]() { };
2369cd5b24315aea4bc58bac03cfb4874e076b013b8Eli Friedman    static_assert(sizeof(y), "");
2379cd5b24315aea4bc58bac03cfb4874e076b013b8Eli Friedman  }
2389cd5b24315aea4bc58bac03cfb4874e076b013b8Eli Friedman}
2397c3c6bca2662704fbe038137d8ef2e4112359586Eli Friedman
2407c3c6bca2662704fbe038137d8ef2e4112359586Eli Friedmannamespace PR13854 {
2417c3c6bca2662704fbe038137d8ef2e4112359586Eli Friedman  auto l = [](void){};
2427c3c6bca2662704fbe038137d8ef2e4112359586Eli Friedman}
24342427409fd75a48381071e6da008a3c06897437aBenjamin Kramer
24442427409fd75a48381071e6da008a3c06897437aBenjamin Kramernamespace PR14518 {
24542427409fd75a48381071e6da008a3c06897437aBenjamin Kramer  auto f = [](void) { return __func__; }; // no-warning
24642427409fd75a48381071e6da008a3c06897437aBenjamin Kramer}
247ec0808decc682f76e411eed7206a82a34b87dd7dRichard Smith
248ec0808decc682f76e411eed7206a82a34b87dd7dRichard Smithnamespace PR16708 {
249ec0808decc682f76e411eed7206a82a34b87dd7dRichard Smith  auto L = []() {
250ec0808decc682f76e411eed7206a82a34b87dd7dRichard Smith    auto ret = 0;
251ec0808decc682f76e411eed7206a82a34b87dd7dRichard Smith    return ret;
252ec0808decc682f76e411eed7206a82a34b87dd7dRichard Smith    return 0;
253ec0808decc682f76e411eed7206a82a34b87dd7dRichard Smith  };
254ec0808decc682f76e411eed7206a82a34b87dd7dRichard Smith}
25514d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith
25614d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smithnamespace TypeDeduction {
25714d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith  struct S {};
25814d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith  void f() {
25914d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith    const S s {};
26014d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith    S &&t = [&] { return s; } ();
26114d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith#if __cplusplus <= 201103L
26214d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith    // expected-error@-2 {{drops qualifiers}}
26314d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith#else
26414d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith    S &&u = [&] () -> auto { return s; } ();
26514d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith#endif
26614d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith  }
26714d937afc2ad8f65dccbafeb62271e80dbd46a78Richard Smith}
268de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali
269de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali
270de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Valinamespace lambdas_in_NSDMIs {
271de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali  template<class T>
272de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali  struct L {
273de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali      T t{};
274de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali      T t2 = ([](int a) { return [](int b) { return b; };})(t)(t);
275de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali  };
276de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali  L<int> l;
277de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali
278de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali  namespace non_template {
279de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali    struct L {
280de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali      int t = 0;
281de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali      int t2 = ([](int a) { return [](int b) { return b; };})(t)(t);
282de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali    };
283de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali    L l;
284de8eaa2bf22ab0a59118289ee8b97f6ac6a97196Faisal Vali  }
285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// PR18477: don't try to capture 'this' from an NSDMI encountered while parsing
288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// a lambda.
289651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace NSDMIs_in_lambdas {
290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct S { int a = 0; int b = a; };
291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f() { []() { S<int> s; }; }
292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto x = []{ struct S { int n, m = n; }; };
294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto y = [&]{ struct S { int n, m = n; }; }; // expected-error {{non-local lambda expression cannot have a capture-default}}
295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void g() { auto z = [&]{ struct S { int n, m = n; }; }; }
296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace CaptureIncomplete {
299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct Incomplete; // expected-note 2{{forward decl}}
300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void g(const Incomplete &a);
301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f(Incomplete &a) {
302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    (void) [a] {}; // expected-error {{incomplete}}
303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    (void) [&a] {};
304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
305651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    (void) [=] { g(a); }; // expected-error {{incomplete}}
306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    (void) [&] { f(a); };
307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
308651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace CaptureAbstract {
311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S {
312651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    virtual void f() = 0; // expected-note {{unimplemented}}
313651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int n = 0;
314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct T : S {
316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    constexpr T() {}
317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void f();
318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f() {
320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    constexpr T t = T();
321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    S &s = const_cast<T&>(t);
322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: Once we properly compute odr-use per DR712, this should be
323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // accepted (and should not capture 's').
324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    [=] { return s.n; }; // expected-error {{abstract}}
325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR18128 {
329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto l = [=]{}; // expected-error {{non-local lambda expression cannot have a capture-default}}
330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S {
332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int n;
333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int (*f())[true ? 1 : ([=]{ return n; }(), 0)];
334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-error@-1 {{non-local lambda expression cannot have a capture-default}}
335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-error@-2 {{invalid use of non-static data member 'n'}}
336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-error@-3 {{a lambda expression may not appear inside of a constant expression}}
337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int g(int k = ([=]{ return n; }(), 0));
338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-error@-1 {{non-local lambda expression cannot have a capture-default}}
339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-error@-2 {{invalid use of non-static data member 'n'}}
340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int a = [=]{ return n; }(); // ok
342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int b = [=]{ return [=]{ return n; }(); }(); // ok
343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int c = []{ int k = 0; return [=]{ return k; }(); }(); // ok
344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int d = []{ return [=]{ return n; }(); }(); // expected-error {{'this' cannot be implicitly captured in this context}}
345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR18473 {
349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void f() {
350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T t(0);
351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    (void) [=]{ int n = t; }; // expected-error {{deleted}}
352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template void f<int>();
355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct NoCopy {
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    NoCopy(int);
357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    NoCopy(const NoCopy &) = delete; // expected-note {{deleted}}
358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    operator int() const;
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template void f<NoCopy>(); // expected-note {{instantiation}}
361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid PR19249() {
364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  auto x = [&x]{}; // expected-error {{cannot appear in its own init}}
365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
366