objective-C: Don't warn of unimplemented property of protocols in
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 19 Dec 2012 18:58:55 +0000 (18:58 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 19 Dec 2012 18:58:55 +0000 (18:58 +0000)
category, when those properties will be implemented in category's
primary class or one of its super classes. // rdar://12568064

llvm-svn: 170573

clang/lib/Sema/SemaObjCProperty.cpp
clang/test/SemaObjC/property-category-impl.m

index 2857296..a498558 100644 (file)
@@ -1573,12 +1573,23 @@ void Sema::DefaultSynthesizeProperties(Scope *S, Decl *D) {
 void Sema::DiagnoseUnimplementedProperties(Scope *S, ObjCImplDecl* IMPDecl,
                                       ObjCContainerDecl *CDecl,
                                       const SelectorSet &InsMap) {
-  ObjCContainerDecl::PropertyMap SuperPropMap;
-  if (ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl))
-    CollectSuperClassPropertyImplementations(IDecl, SuperPropMap);
+  ObjCContainerDecl::PropertyMap NoNeedToImplPropMap;
+  ObjCInterfaceDecl *IDecl;
+  // Gather properties which need not be implemented in this class
+  // or category.
+  if (!(IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl)))
+    if (ObjCCategoryDecl *C = dyn_cast<ObjCCategoryDecl>(CDecl)) {
+      // For categories, no need to implement properties declared in
+      // its primary class (and its super classes) if property is
+      // declared in one of those containers.
+      if ((IDecl = C->getClassInterface()))
+        IDecl->collectPropertiesToImplement(NoNeedToImplPropMap);
+    }
+  if (IDecl)
+    CollectSuperClassPropertyImplementations(IDecl, NoNeedToImplPropMap);
   
   ObjCContainerDecl::PropertyMap PropMap;
-  CollectImmediateProperties(CDecl, PropMap, SuperPropMap);
+  CollectImmediateProperties(CDecl, PropMap, NoNeedToImplPropMap);
   if (PropMap.empty())
     return;
 
index 9524c22..be42dea 100644 (file)
 
 @implementation MyClass (public)// expected-warning {{property 'foo' requires method 'setFoo:' to be defined }}
 @end 
+
+// rdar://12568064
+// No warn of unimplemented property of protocols in category,
+// when those properties will be implemented in category's primary
+// class or one of its super classes.
+@interface HBSuperclass
+@property (nonatomic) char myProperty;
+@property (nonatomic) char myProperty2;
+@end
+
+@interface HBClass : HBSuperclass
+@end
+
+@protocol HBProtocol
+@property (nonatomic) char myProperty;
+@property (nonatomic) char myProperty2;
+@end
+
+@interface HBSuperclass (HBSCategory)<HBProtocol>
+@end
+
+@implementation HBSuperclass (HBSCategory)
+@end
+
+@interface HBClass (HBCategory)<HBProtocol>
+@end
+
+@implementation HBClass (HBCategory)
+@end