From 6dc6f008994472cf4da321855e8c51c39720f3ed Mon Sep 17 00:00:00 2001 From: John McCall Date: Tue, 13 Sep 2011 18:49:24 +0000 Subject: [PATCH] A strong property of block type has "copy" setter semantics, not "retain". This is consistent with the behavior of assigning into a __strong l-value, and it's also necessary for ensuring that the ivar doesn't end up a dangling reference. We decided not to change the behavior of "retain" properties, but just to make them warnings/errors when of block type. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139619 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclObjC.h | 4 +++- test/CodeGenObjC/arc.m | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 618fe367cf..b9d2ba3a7b 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -1510,7 +1510,9 @@ public: /// the property setter. This is only valid if the property has been /// defined to have a setter. SetterKind getSetterKind() const { - if (PropertyAttributes & (OBJC_PR_retain|OBJC_PR_strong)) + if (PropertyAttributes & OBJC_PR_strong) + return getType()->isBlockPointerType() ? Copy : Retain; + if (PropertyAttributes & OBJC_PR_retain) return Retain; if (PropertyAttributes & OBJC_PR_copy) return Copy; diff --git a/test/CodeGenObjC/arc.m b/test/CodeGenObjC/arc.m index 7982fd6ebc..ebbc347316 100644 --- a/test/CodeGenObjC/arc.m +++ b/test/CodeGenObjC/arc.m @@ -1892,3 +1892,23 @@ void test64b(void) { // CHECK-NEXT: call void @objc_release(i8* [[T5]]) // CHECK-NEXT: ret void } + +// rdar://problem/9979150 +@interface Test65 +@property (strong) void(^ablock)(void); +@property (nonatomic, strong) void(^nblock)(void); +@end +@implementation Test65 +@synthesize ablock, nblock; +// CHECK: define internal void ()* @"\01-[Test65 ablock]"( +// CHECK: call i8* @objc_getProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i1 zeroext true) + +// CHECK: define internal void @"\01-[Test65 setAblock:]"( +// CHECK: call void @objc_setProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i8* {{%.*}}, i1 zeroext true, i1 zeroext true) + +// CHECK: define internal void ()* @"\01-[Test65 nblock]"( +// CHECK: call i8* @objc_getProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i1 zeroext false) + +// CHECK: define internal void @"\01-[Test65 setNblock:]"( +// CHECK: call void @objc_setProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i8* {{%.*}}, i1 zeroext false, i1 zeroext true) +@end -- 2.40.0