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