aboutsummaryrefslogtreecommitdiff
path: root/test/SemaObjC/warn-retain-cycle.m
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaObjC/warn-retain-cycle.m')
-rw-r--r--test/SemaObjC/warn-retain-cycle.m31
1 files changed, 31 insertions, 0 deletions
diff --git a/test/SemaObjC/warn-retain-cycle.m b/test/SemaObjC/warn-retain-cycle.m
index 1a13fe3726..fb8f2b77f0 100644
--- a/test/SemaObjC/warn-retain-cycle.m
+++ b/test/SemaObjC/warn-retain-cycle.m
@@ -1,5 +1,7 @@
// RUN: %clang_cc1 -fsyntax-only -fobjc-runtime-has-weak -fobjc-arc -fblocks -verify -Wno-objc-root-class %s
+void *_Block_copy(const void *block);
+
@interface Test0
- (void) setBlock: (void(^)(void)) block;
- (void) addBlock: (void(^)(void)) block;
@@ -153,3 +155,32 @@ void testBlockVariable() {
};
}
+
+@interface NSObject
+- (id)copy;
+
+- (void (^)(void))someRandomMethodReturningABlock;
+@end
+
+
+void testCopying(Test0 *obj) {
+ typedef void (^block_t)(void);
+
+ [obj setBlock:[^{ // expected-note{{block will be retained by the captured object}}
+ [obj actNow]; // expected-warning{{capturing 'obj' strongly in this block is likely to lead to a retain cycle}}
+ } copy]];
+
+ [obj addBlock:(__bridge_transfer block_t)_Block_copy((__bridge void *)^{ // expected-note{{block will be retained by the captured object}}
+ [obj actNow]; // expected-warning{{capturing 'obj' strongly in this block is likely to lead to a retain cycle}}
+ })];
+
+ [obj addBlock:[^{
+ [obj actNow]; // no-warning
+ } someRandomMethodReturningABlock]];
+
+ extern block_t someRandomFunctionReturningABlock(block_t);
+ [obj setBlock:someRandomFunctionReturningABlock(^{
+ [obj actNow]; // no-warning
+ })];
+}
+