diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index 84052fd9d8..bf4939d9fd 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/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(PropType)->getPointeeType(); diff --git a/test/CodeGenObjC/gc-weak-attribute.m b/test/CodeGenObjC/gc-weak-attribute.m new file mode 100644 index 0000000000..44a9177663 --- /dev/null +++ b/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 +