From d2c142eb2b7876568939e0d00586ab9c8a472330 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Wed, 16 Apr 2014 18:32:51 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206410 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 16 ++++++++++++++-- test/SemaObjC/attr-designated-init.m | 22 +++++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 79794b1f9f..13725dc3f3 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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(), diff --git a/test/SemaObjC/attr-designated-init.m b/test/SemaObjC/attr-designated-init.m index 3eea849403..3dbc2cab12 100644 --- a/test/SemaObjC/attr-designated-init.m +++ b/test/SemaObjC/attr-designated-init.m @@ -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 -- 2.40.0