[objc] -[NSObject init] is documented to not do anything, don't warn if subclasses do not call [super init] on their initializers.

Part of rdar://16568441

llvm-svn: 206410
This commit is contained in:
Argyrios Kyrtzidis 2014-04-16 18:32:51 +00:00
parent 441f626bd9
commit de10366c06
2 changed files with 35 additions and 3 deletions

View File

@ -9976,8 +9976,20 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
MD->isDesignatedInitializerForTheInterface(&InitMethod);
assert(isDesignated && InitMethod);
(void)isDesignated;
// Don't issue this warning for unavaialable inits.
if (!MD->isUnavailable()) {
auto superIsNSObject = [&](const ObjCMethodDecl *MD) {
auto IFace = MD->getClassInterface();
if (!IFace)
return false;
auto SuperD = IFace->getSuperClass();
if (!SuperD)
return false;
return SuperD->getIdentifier() ==
NSAPIObj->getNSClassId(NSAPI::ClassId_NSObject);
};
// Don't issue this warning for unavailable inits or direct subclasses
// of NSObject.
if (!MD->isUnavailable() && !superIsNSObject(MD)) {
Diag(MD->getLocation(),
diag::warn_objc_designated_init_missing_super_call);
Diag(InitMethod->getLocation(),

View File

@ -354,7 +354,7 @@ __attribute__((objc_root_class))
__attribute__((objc_root_class))
@interface NSObject
-(instancetype) init NS_DESIGNATED_INITIALIZER;
-(instancetype) init NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}
@end
@interface Test3 : NSObject
@ -368,3 +368,23 @@ __attribute__((objc_root_class))
return [self initWithBasePath:0];
}
@end
@interface Test1 : NSObject
-(instancetype) init NS_DESIGNATED_INITIALIZER;
@end
@implementation Test1
-(instancetype) init {
return self;
}
@end
@interface Test2 : NSObject
@end
@interface SubTest2 : Test2
@end
@implementation SubTest2
-(instancetype) init { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
return self;
}
@end