1 // RUN: %clang_cc1 -std=c++1y %s -verify 2 __anonb1ac1b860102null3const char *has_no_member = [x("hello")] {}.x; // expected-error {{no member named 'x'}} 4 5 double f; __anonb1ac1b860202null6auto with_float = [f(1.0f)] { 7 using T = decltype(f); 8 using T = float; 9 }; __anonb1ac1b860302null10auto with_float_2 = [&f(f)] { // ok, refers to outer f 11 using T = decltype(f); 12 using T = double&; 13 }; 14 15 // Within the lambda-expression the identifier in the init-capture 16 // hides any declaration of the same name in scopes enclosing 17 // the lambda-expression. hiding()18void hiding() { 19 char c; 20 (void) [c("foo")] { 21 static_assert(sizeof(c) == sizeof(const char*), ""); 22 }; 23 (void)[c("bar")]()->decltype(c) { // inner c 24 return "baz"; 25 }; 26 } 27 28 struct ExplicitCopy { 29 ExplicitCopy(); // expected-note 2{{not viable}} 30 explicit ExplicitCopy(const ExplicitCopy&); // expected-note 2{{not a candidate}} 31 }; __anonb1ac1b860502null32auto init_kind_1 = [ec(ExplicitCopy())] {}; __anonb1ac1b860602null33auto init_kind_2 = [ec = ExplicitCopy()] {}; // expected-error {{no matching constructor}} 34 init_kind_template()35template<typename T> void init_kind_template() { 36 auto init_kind_1 = [ec(T())] {}; 37 auto init_kind_2 = [ec = T()] {}; // expected-error {{no matching constructor}} 38 } 39 template void init_kind_template<int>(); 40 template void init_kind_template<ExplicitCopy>(); // expected-note {{instantiation of}} 41 42 void void_fn(); 43 int overload_fn(); 44 int overload_fn(int); 45 __anonb1ac1b860902null46auto bad_init_1 = [a()] {}; // expected-error {{expected expression}} __anonb1ac1b860a02null47auto bad_init_2 = [a(1, 2)] {}; // expected-error {{initializer for lambda capture 'a' contains multiple expressions}} __anonb1ac1b860b02null48auto bad_init_3 = [&a(void_fn())] {}; // expected-error {{cannot form a reference to 'void'}} __anonb1ac1b860c02null49auto bad_init_4 = [a(void_fn())] {}; // expected-error {{has incomplete type 'void'}} __anonb1ac1b860d02null50auto bad_init_5 = [a(overload_fn)] {}; // expected-error {{cannot deduce type for lambda capture 'a' from initializer of type '<overloaded function}} __anonb1ac1b860e02null51auto bad_init_6 = [a{overload_fn}] {}; // expected-error {{cannot deduce type for lambda capture 'a' from initializer list}} __anonb1ac1b860f02null52auto bad_init_7 = [a{{1}}] {}; // expected-error {{cannot deduce type for lambda capture 'a' from nested initializer list}} 53 __anonb1ac1b861002null54template<typename...T> void pack_1(T...t) { (void)[a(t...)] {}; } // expected-error {{initializer missing for lambda capture 'a'}} 55 template void pack_1<>(); // expected-note {{instantiation of}} 56 57 // No lifetime-extension of the temporary here. __anonb1ac1b861102null58auto a_copy = [&c = static_cast<const int&&>(0)] {}; // expected-warning {{temporary whose address is used as value of local variable 'a_copy' will be destroyed at the end of the full-expression}} expected-note {{via initialization of lambda capture 'c'}} 59 60 // But there is lifetime extension here. __anonb1ac1b861202null61auto &&a = [a(4), b = 5, &c = static_cast<const int&&>(0)] { 62 static_assert(sizeof(a) == sizeof(int), ""); 63 static_assert(sizeof(b) == sizeof(int), ""); 64 using T = decltype(c); 65 using T = const int &; 66 }; __anonb1ac1b861302null67auto b = [a{0}] {}; // OK, per N3922 68 69 struct S { S(); S(S&&); }; 70 template<typename T> struct remove_reference { typedef T type; }; 71 template<typename T> struct remove_reference<T&> { typedef T type; }; move(T && t)72template<typename T> decltype(auto) move(T &&t) { return static_cast<typename remove_reference<T>::type&&>(t); } __anonb1ac1b861402null73auto s = [s(move(S()))] {}; 74 instantiate_test(T t)75template<typename T> T instantiate_test(T t) { 76 [x(&t)]() { *x = 1; } (); // expected-error {{assigning to 'const char *'}} 77 // expected-note@-1 {{while substituting into a lambda expression here}} 78 return t; 79 } 80 int instantiate_test_1 = instantiate_test(0); 81 const char *instantiate_test_2 = instantiate_test("foo"); // expected-note {{here}} 82