forked from OSchip/llvm-project
objective-C: Don't 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. // rdar://12568064 llvm-svn: 170573
This commit is contained in:
parent
42845efb2d
commit
a1f8571e84
|
@ -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;
|
||||
|
||||
|
|
|
@ -29,3 +29,32 @@
|
|||
|
||||
@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
|
||||
|
|
Loading…
Reference in New Issue