// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Winvalid-noreturn %s -verify template void test_attributes() { // FIXME: GCC accepts [[gnu::noreturn]] here. auto nrl = []() [[gnu::noreturn]] {}; // expected-warning{{attribute 'noreturn' ignored}} } template void test_attributes(); template void call_with_zero() { [](T *ptr) -> T& { return *ptr; }(0); } template void call_with_zero(); template T captures(T x, T y) { auto lambda = [=, &y] () -> T { T i = x; return i + y; }; return lambda(); } struct X { X(const X&); }; X operator+(X, X); X operator-(X, X); template int captures(int, int); template X captures(X, X); template int infer_result(T x, T y) { auto lambda = [=](bool b) { return x + y; }; return lambda(true); // expected-error{{no viable conversion from returned value of type 'X' to function return type 'int'}} } template int infer_result(int, int); template int infer_result(X, X); // expected-note{{in instantiation of function template specialization 'infer_result' requested here}} // Make sure that lambda's operator() can be used from templates. template void accept_lambda(F f) { f(1); } template void pass_lambda(T x) { accept_lambda([&x](T y) { return x + y; }); } template void pass_lambda(int); namespace std { class type_info; } namespace p2 { struct P { virtual ~P(); }; template struct Boom { Boom(const Boom&) { T* x = 1; // expected-error{{cannot initialize a variable of type 'float *' with an rvalue of type 'int'}} } void tickle() const; }; template void odr_used(R &r, Boom boom) { const std::type_info &ti = typeid([=,&r] () -> R& { // expected-error{{lambda expression in an unevaluated operand}} boom.tickle(); return r; }()); } template void odr_used(int&, Boom); // expected-note{{in instantiation of function template specialization}} template void odr_used2(R &r, Boom boom) { const std::type_info &ti = typeid([=,&r] () -> R& { boom.tickle(); // expected-note{{in instantiation of member function}} return r; }()); } template void odr_used2(P&, Boom); } namespace p5 { struct NonConstCopy { NonConstCopy(const NonConstCopy&) = delete; NonConstCopy(NonConstCopy&); }; template void double_capture(T &nc) { [=] () mutable { [=] () mutable { T nc2(nc); }(); }(); } template void double_capture(NonConstCopy&); } namespace NonLocalLambdaInstantation { template struct X { static int value; }; template int X::value = []{ return T(); }(); // expected-error{{cannot initialize a variable of type 'int' with an rvalue of type 'int *'}} template int X::value; template int X::value; template int X::value; // expected-note{{in instantiation of static data member }} template void defaults(int x = []{ return T(); }()) { }; // expected-error{{cannot initialize a parameter of type 'int' with an rvalue of type 'int *'}} \ // expected-note{{passing argument to parameter 'x' here}} void call_defaults() { defaults(); defaults(); defaults(); // expected-note{{in instantiation of default function argument expression for 'defaults' required here}} } template struct X2 { int x = []{ return T(); }(); // expected-error{{cannot initialize a member subobject of type 'int' with an rvalue of type 'int *'}} }; X2 x2i; X2 x2f; X2 x2ip; // expected-note{{in instantiation of default member initializer 'NonLocalLambdaInstantation::X2::x'}} }