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);
|
MD->isDesignatedInitializerForTheInterface(&InitMethod);
|
||||||
assert(isDesignated && InitMethod);
|
assert(isDesignated && InitMethod);
|
||||||
(void)isDesignated;
|
(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(MD->getLocation(),
|
||||||
diag::warn_objc_designated_init_missing_super_call);
|
diag::warn_objc_designated_init_missing_super_call);
|
||||||
Diag(InitMethod->getLocation(),
|
Diag(InitMethod->getLocation(),
|
||||||
|
|
|
@ -354,7 +354,7 @@ __attribute__((objc_root_class))
|
||||||
|
|
||||||
__attribute__((objc_root_class))
|
__attribute__((objc_root_class))
|
||||||
@interface NSObject
|
@interface NSObject
|
||||||
-(instancetype) init NS_DESIGNATED_INITIALIZER;
|
-(instancetype) init NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface Test3 : NSObject
|
@interface Test3 : NSObject
|
||||||
|
@ -368,3 +368,23 @@ __attribute__((objc_root_class))
|
||||||
return [self initWithBasePath:0];
|
return [self initWithBasePath:0];
|
||||||
}
|
}
|
||||||
@end
|
@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