[PATCH] D40141: [ObjC][ARC] Honor noescape attribute for -Warc-retain-cycles
Alex Lorenz via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 16 10:44:18 PST 2017
arphaman created this revision.
This patch ensures that -Warc-retain-cycles doesn't warn about captures in blocks that are passed into parameters that have a `noescape` attribute.
Repository:
rL LLVM
https://reviews.llvm.org/D40141
Files:
lib/Sema/SemaChecking.cpp
test/SemaObjC/warn-retain-cycle.m
Index: test/SemaObjC/warn-retain-cycle.m
===================================================================
--- test/SemaObjC/warn-retain-cycle.m
+++ test/SemaObjC/warn-retain-cycle.m
@@ -198,3 +198,15 @@
};
}
+
+typedef void (^a_block_t)(void);
+
+ at interface HonorNoEscape
+- (void)addStuffUsingBlock:(__attribute__((noescape)) a_block_t)block;
+ at end
+
+void testNoEscape(HonorNoEscape *obj) {
+ [obj addStuffUsingBlock:^{
+ (void)obj; // ok.
+ }];
+}
Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp
+++ lib/Sema/SemaChecking.cpp
@@ -11652,9 +11652,14 @@
}
// Check whether the receiver is captured by any of the arguments.
- for (unsigned i = 0, e = msg->getNumArgs(); i != e; ++i)
+ const ObjCMethodDecl *MD = msg->getMethodDecl();
+ for (unsigned i = 0, e = msg->getNumArgs(); i != e; ++i) {
+ // noescape blocks should not be retained by the method.
+ if (MD && MD->parameters()[i]->hasAttr<NoEscapeAttr>())
+ continue;
if (Expr *capturer = findCapturingExpr(*this, msg->getArg(i), owner))
return diagnoseRetainCycle(*this, capturer, owner);
+ }
}
/// Check a property assign to see if it's likely to cause a retain cycle.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40141.123211.patch
Type: text/x-patch
Size: 1263 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171116/d20a265d/attachment.bin>
More information about the cfe-commits
mailing list