forked from OSchip/llvm-project
[ObjC][ARC] Honor noescape attribute for -Warc-retain-cycles
rdar://35409566 Differential Revision: https://reviews.llvm.org/D40141 llvm-svn: 318552
This commit is contained in:
parent
0f90672ae9
commit
42a97a94ca
|
@ -11652,9 +11652,15 @@ void Sema::checkRetainCycles(ObjCMessageExpr *msg) {
|
|||
}
|
||||
|
||||
// Check whether the receiver is captured by any of the arguments.
|
||||
for (unsigned i = 0, e = msg->getNumArgs(); i != e; ++i)
|
||||
if (Expr *capturer = findCapturingExpr(*this, msg->getArg(i), owner))
|
||||
const ObjCMethodDecl *MD = msg->getMethodDecl();
|
||||
for (unsigned i = 0, e = msg->getNumArgs(); i != e; ++i) {
|
||||
if (Expr *capturer = findCapturingExpr(*this, msg->getArg(i), owner)) {
|
||||
// noescape blocks should not be retained by the method.
|
||||
if (MD && MD->parameters()[i]->hasAttr<NoEscapeAttr>())
|
||||
continue;
|
||||
return diagnoseRetainCycle(*this, capturer, owner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Check a property assign to see if it's likely to cause a retain cycle.
|
||||
|
|
|
@ -198,3 +198,15 @@ __block void(^myBlock)(void) = ^{
|
|||
};
|
||||
|
||||
}
|
||||
|
||||
typedef void (^a_block_t)(void);
|
||||
|
||||
@interface HonorNoEscape
|
||||
- (void)addStuffUsingBlock:(__attribute__((noescape)) a_block_t)block;
|
||||
@end
|
||||
|
||||
void testNoEscape(HonorNoEscape *obj) {
|
||||
[obj addStuffUsingBlock:^{
|
||||
(void)obj; // ok.
|
||||
}];
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue