diff options
-rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 6 | ||||
-rw-r--r-- | clang/test/CodeGenObjC/gc-weak-attribute.m | 28 |
2 files changed, 34 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index 84052fd9d83..bf4939d9fd6 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -594,6 +594,12 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S, ObjCPropertyDecl::PropertyAttributeKind kind = property->getPropertyAttributes(); QualType PropType = Context.getCanonicalType(property->getType()); + bool PropertyIsGCWeak = (kind & ObjCPropertyDecl::OBJC_PR_weak && + !getLangOptions().ObjCAutoRefCount && + getLangOptions().getGCMode() != + LangOptions::NonGC); + if (PropertyIsGCWeak) + PropType = Context.getObjCGCQualType(PropType, Qualifiers::Weak); QualType PropertyIvarType = PropType; if (PropType->isReferenceType()) PropertyIvarType = cast<ReferenceType>(PropType)->getPointeeType(); diff --git a/clang/test/CodeGenObjC/gc-weak-attribute.m b/clang/test/CodeGenObjC/gc-weak-attribute.m new file mode 100644 index 00000000000..44a91776637 --- /dev/null +++ b/clang/test/CodeGenObjC/gc-weak-attribute.m @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-gc -fobjc-nonfragile-abi -emit-llvm -o - %s | FileCheck %s +// rdar://10073896 + +@interface I +{ + __weak id wObject; +} +@property (readwrite, weak) id representedObject; +@property (readwrite, weak) id wObject; +@property (readwrite, weak) __weak id wRandom; +@property (readwrite, assign) __weak id wAnother; +@end + +@implementation I +@synthesize representedObject; +@synthesize wObject; +@synthesize wRandom; +@synthesize wAnother; +@end +// CHECK: call i8* @objc_read_weak +// CHECK: call i8* @objc_assign_weak +// CHECK: call i8* @objc_read_weak +// CHECK: call i8* @objc_assign_weak +// CHECK: call i8* @objc_read_weak +// CHECK: call i8* @objc_assign_weak +// CHECK: call i8* @objc_read_weak +// CHECK: call i8* @objc_assign_weak + |