// RUN: %clang_cc1 -x objective-c++ -std=c++11 -fobjc-arc -fblocks -Wimplicit-retain-self -verify %s // rdar://11194874 typedef void (^BlockTy)(); void noescapeFunc(__attribute__((noescape)) BlockTy); void escapeFunc(BlockTy); @interface Root @end @interface I : Root { int _bar; } @end @implementation I - (void)foo{ ^{ _bar = 3; // expected-warning {{block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior}} }(); } - (void)testNested{ noescapeFunc(^{ (void)_bar; escapeFunc(^{ (void)_bar; // expected-warning {{block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior}} noescapeFunc(^{ (void)_bar; // expected-warning {{block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior}} }); (void)_bar; // expected-warning {{block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior}} }); (void)_bar; }); } - (void)testLambdaInBlock{ noescapeFunc(^{ [&](){ (void)_bar; }(); }); escapeFunc(^{ [&](){ (void)_bar; }(); }); // expected-warning {{block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior}} } @end