|
@@ -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
|
|
|
+ })];
|
|
|
+}
|
|
|
+
|