]> granicus.if.org Git - clang/commitdiff
ObjC properties: consider ownership of properties from protocols when synthesizing.
authorDouglas Gregor <dgregor@apple.com>
Fri, 18 Dec 2015 00:52:31 +0000 (00:52 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 18 Dec 2015 00:52:31 +0000 (00:52 +0000)
When determining whether ownership was explicitly written for a
property when it is being synthesized, also consider that the original
property might have come from a protocol. Fixes rdar://problem/23931441.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@255943 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaObjCProperty.cpp
test/SemaObjC/arc-property-decl-attrs.m

index f42daced863b620cc988938e77bf7afc6aa7447b..1cb84e4480670106aa59be3d93d55f5ea6e8105f 100644 (file)
@@ -868,6 +868,13 @@ static bool hasWrittenStorageAttribute(ObjCPropertyDecl *Prop) {
       return OrigProp->getPropertyAttributesAsWritten() & OwnershipMask;
   }
 
+  // Look through all of the protocols.
+  for (const auto *Proto : OrigClass->all_referenced_protocols()) {
+    if (ObjCPropertyDecl *OrigProp =
+          Proto->FindPropertyDeclaration(Prop->getIdentifier()))
+      return OrigProp->getPropertyAttributesAsWritten() & OwnershipMask;
+  }
+
   return false;
 }
 
index 408b270920315b42c4495a65864a52b2de016e1a..6c96ba481c4a2a70856b84f739709a3ce1b2b8e6 100644 (file)
 @property(nonatomic, weak, nonnull, readonly) id ROdelegate; // expected-error {{property attributes 'nonnull' and 'weak' are mutually exclusive}}
 @end
 
+// rdar://problem/23931441
+@protocol P
+@property(readonly, retain) id prop;
+@end
+
+__attribute__((objc_root_class))
+@interface I2<P>
+@end
+
+@interface I2()
+@property (readwrite) id prop;
+@end
+
+@implementation I2
+@synthesize prop;
+@end