176e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify 276e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor 376e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor// Check that analysis-based warnings work in lambda bodies. 476e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregorvoid analysis_based_warnings() { 5793cd1c4cdfaafc52e2c2ad9dae959befe4bb166Douglas Gregor (void)[]() -> int { }; // expected-warning{{control reaches end of non-void lambda}} 676e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor} 776e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor 86d2f0f589a8c38f64147e90ccdd813dde74ecdb6Douglas Gregor// Check that we get the right types of captured variables (the 96d2f0f589a8c38f64147e90ccdd813dde74ecdb6Douglas Gregor// semantic-analysis part of p7). 101e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregorint &check_const_int(int&); 111e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregorfloat &check_const_int(const int&); 121e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor 131e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregorvoid test_capture_constness(int i, const int ic) { 14b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor (void)[i,ic] ()->void { 151e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor float &fr1 = check_const_int(i); 161e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor float &fr2 = check_const_int(ic); 171e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor }; 181e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor 19b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor (void)[=] ()->void { 201e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor float &fr1 = check_const_int(i); 211e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor float &fr2 = check_const_int(ic); 221e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor }; 231e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor 24b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor (void)[i,ic] () mutable ->void { 251e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor int &ir = check_const_int(i); 261e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor float &fr = check_const_int(ic); 271e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor }; 281e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor 29b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor (void)[=] () mutable ->void { 301e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor int &ir = check_const_int(i); 311e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor float &fr = check_const_int(ic); 321e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor }; 331e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor 34b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor (void)[&i,&ic] ()->void { 351e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor int &ir = check_const_int(i); 361e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor float &fr = check_const_int(ic); 371e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor }; 381e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor 39b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor (void)[&] ()->void { 401e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor int &ir = check_const_int(i); 411e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor float &fr = check_const_int(ic); 421e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor }; 431e3767ac5449db6a1ede192d5e4217e34fa61f26Douglas Gregor} 4476e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor 4576e3da57b0e8cf72d221f44d54566ef206341668Douglas Gregor 46b555971345750350c21d541afe135054c7402933Douglas Gregorstruct S1 { 47b555971345750350c21d541afe135054c7402933Douglas Gregor int x, y; 48215e4e17d00e12c38687a95502506d8f2ca3e646Douglas Gregor S1 &operator=(int*); 49b555971345750350c21d541afe135054c7402933Douglas Gregor int operator()(int); 50b555971345750350c21d541afe135054c7402933Douglas Gregor void f() { 51b555971345750350c21d541afe135054c7402933Douglas Gregor [&]()->int { 52215e4e17d00e12c38687a95502506d8f2ca3e646Douglas Gregor S1 &s1 = operator=(&this->x); 53b555971345750350c21d541afe135054c7402933Douglas Gregor return operator()(this->x + y); 54b555971345750350c21d541afe135054c7402933Douglas Gregor }(); 55b555971345750350c21d541afe135054c7402933Douglas Gregor } 56b555971345750350c21d541afe135054c7402933Douglas Gregor}; 57