forked from OSchip/llvm-project
[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:
parent
441f626bd9
commit
de10366c06
|
@ -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(),
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue