10d8e9646bc000bab521ce52ed294209a92298cefRichard Smith// RUN: %clang_cc1 -std=c++1y %s -verify 20d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 304fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithconst char *has_no_member = [x("hello")] {}.x; // expected-error {{no member named 'x'}} 40d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 504fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithdouble f; 604fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithauto with_float = [f(1.0f)] { 704fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith using T = decltype(f); 804fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith using T = float; 904fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith}; 1004fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithauto with_float_2 = [&f(f)] { // ok, refers to outer f 1104fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith using T = decltype(f); 1204fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith using T = double&; 1304fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith}; 140d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 1504fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith// Within the lambda-expression's compound-statement, 1604fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith// the identifier in the init-capture hides any declaration 170d8e9646bc000bab521ce52ed294209a92298cefRichard Smith// of the same name in scopes enclosing the lambda-expression. 180d8e9646bc000bab521ce52ed294209a92298cefRichard Smithvoid hiding() { 190d8e9646bc000bab521ce52ed294209a92298cefRichard Smith char c; 200d8e9646bc000bab521ce52ed294209a92298cefRichard Smith (void) [c("foo")] { 210d8e9646bc000bab521ce52ed294209a92298cefRichard Smith static_assert(sizeof(c) == sizeof(const char*), ""); 220d8e9646bc000bab521ce52ed294209a92298cefRichard Smith }; 2304fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith (void) [c("bar")] () -> decltype(c) { // outer c, not init-capture 240d8e9646bc000bab521ce52ed294209a92298cefRichard Smith return "baz"; // expected-error {{cannot initialize}} 250d8e9646bc000bab521ce52ed294209a92298cefRichard Smith }; 260d8e9646bc000bab521ce52ed294209a92298cefRichard Smith} 270d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 280d8e9646bc000bab521ce52ed294209a92298cefRichard Smithstruct ExplicitCopy { 290d8e9646bc000bab521ce52ed294209a92298cefRichard Smith ExplicitCopy(); // expected-note 2{{not viable}} 300d8e9646bc000bab521ce52ed294209a92298cefRichard Smith explicit ExplicitCopy(const ExplicitCopy&); 310d8e9646bc000bab521ce52ed294209a92298cefRichard Smith}; 320d8e9646bc000bab521ce52ed294209a92298cefRichard Smithauto init_kind_1 = [ec(ExplicitCopy())] {}; 330d8e9646bc000bab521ce52ed294209a92298cefRichard Smithauto init_kind_2 = [ec = ExplicitCopy()] {}; // expected-error {{no matching constructor}} 340d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 350d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate<typename T> void init_kind_template() { 360d8e9646bc000bab521ce52ed294209a92298cefRichard Smith auto init_kind_1 = [ec(T())] {}; 370d8e9646bc000bab521ce52ed294209a92298cefRichard Smith auto init_kind_2 = [ec = T()] {}; // expected-error {{no matching constructor}} 380d8e9646bc000bab521ce52ed294209a92298cefRichard Smith} 390d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate void init_kind_template<int>(); 400d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate void init_kind_template<ExplicitCopy>(); // expected-note {{instantiation of}} 410d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 420d8e9646bc000bab521ce52ed294209a92298cefRichard Smithvoid void_fn(); 430d8e9646bc000bab521ce52ed294209a92298cefRichard Smithint overload_fn(); 440d8e9646bc000bab521ce52ed294209a92298cefRichard Smithint overload_fn(int); 450d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 460d8e9646bc000bab521ce52ed294209a92298cefRichard Smithauto bad_init_1 = [a()] {}; // expected-error {{expected expression}} 470d8e9646bc000bab521ce52ed294209a92298cefRichard Smithauto bad_init_2 = [a(1, 2)] {}; // expected-error {{initializer for lambda capture 'a' contains multiple expressions}} 480d8e9646bc000bab521ce52ed294209a92298cefRichard Smithauto bad_init_3 = [&a(void_fn())] {}; // expected-error {{cannot form a reference to 'void'}} 4904fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithauto bad_init_4 = [a(void_fn())] {}; // expected-error {{has incomplete type 'void'}} 500d8e9646bc000bab521ce52ed294209a92298cefRichard Smithauto bad_init_5 = [a(overload_fn)] {}; // expected-error {{cannot deduce type for lambda capture 'a' from initializer of type '<overloaded function}} 510d8e9646bc000bab521ce52ed294209a92298cefRichard Smithauto bad_init_6 = [a{overload_fn}] {}; // expected-error {{cannot deduce type for lambda capture 'a' from initializer list}} 520d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 5304fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithtemplate<typename...T> void pack_1(T...t) { (void)[a(t...)] {}; } // expected-error {{initializer missing for lambda capture 'a'}} 540d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate void pack_1<>(); // expected-note {{instantiation of}} 550d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 5604fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith// FIXME: Might need lifetime extension for the temporary here. 5704fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith// See DR1695. 5804fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithauto a = [a(4), b = 5, &c = static_cast<const int&&>(0)] { 590d8e9646bc000bab521ce52ed294209a92298cefRichard Smith static_assert(sizeof(a) == sizeof(int), ""); 600d8e9646bc000bab521ce52ed294209a92298cefRichard Smith static_assert(sizeof(b) == sizeof(int), ""); 610d8e9646bc000bab521ce52ed294209a92298cefRichard Smith using T = decltype(c); 620d8e9646bc000bab521ce52ed294209a92298cefRichard Smith using T = const int &; 630d8e9646bc000bab521ce52ed294209a92298cefRichard Smith}; 640d8e9646bc000bab521ce52ed294209a92298cefRichard Smithauto b = [a{0}] {}; // expected-error {{include <initializer_list>}} 650d8e9646bc000bab521ce52ed294209a92298cefRichard Smith 660d8e9646bc000bab521ce52ed294209a92298cefRichard Smithstruct S { S(); S(S&&); }; 670d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate<typename T> struct remove_reference { typedef T type; }; 680d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate<typename T> struct remove_reference<T&> { typedef T type; }; 690d8e9646bc000bab521ce52ed294209a92298cefRichard Smithtemplate<typename T> decltype(auto) move(T &&t) { return static_cast<typename remove_reference<T>::type&&>(t); } 700d8e9646bc000bab521ce52ed294209a92298cefRichard Smithauto s = [s(move(S()))] {}; 7104fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith 7204fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithtemplate<typename T> T instantiate_test(T t) { 7304fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith [x(&t)]() { *x = 1; } (); // expected-error {{assigning to 'const char *'}} 7404fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith return t; 7504fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith} 7604fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithint instantiate_test_1 = instantiate_test(0); 7704fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smithconst char *instantiate_test_2 = instantiate_test("foo"); // expected-note {{here}} 78