From 78be8b6d53221eef49603ed64dd0670ff5a65727 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Fri, 1 Mar 2019 06:43:20 +0000 Subject: [PATCH] [Sema][ObjC] Allow silencing -Wobjc-designated-initializers warnings by declaring an unavailable method in the subclass's extension that overrides the designated initializer in the base class. r243676 made changes to allow declaring the unavailable method in the subclass interface to silence the warning. This commit additionally allows declaring the unavailable method in the class extension. rdar://problem/42731306 llvm-svn: 355175 --- clang/lib/Sema/SemaObjCProperty.cpp | 9 +++++++++ clang/test/SemaObjC/attr-designated-init.m | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index 82e8def..cea362f 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -2280,9 +2280,18 @@ void Sema::DiagnoseMissingDesignatedInitOverrides( I = DesignatedInits.begin(), E = DesignatedInits.end(); I != E; ++I) { const ObjCMethodDecl *MD = *I; if (!InitSelSet.count(MD->getSelector())) { + // Don't emit a diagnostic if the overriding method in the subclass is + // marked as unavailable. bool Ignore = false; if (auto *IMD = IFD->getInstanceMethod(MD->getSelector())) { Ignore = IMD->isUnavailable(); + } else { + // Check the methods declared in the class extensions too. + for (auto *Ext : IFD->visible_extensions()) + if (auto *IMD = Ext->getInstanceMethod(MD->getSelector())) { + Ignore = IMD->isUnavailable(); + break; + } } if (!Ignore) { Diag(ImplD->getLocation(), diff --git a/clang/test/SemaObjC/attr-designated-init.m b/clang/test/SemaObjC/attr-designated-init.m index 3558916..7d1e700 100644 --- a/clang/test/SemaObjC/attr-designated-init.m +++ b/clang/test/SemaObjC/attr-designated-init.m @@ -389,6 +389,19 @@ __attribute__((objc_root_class)) } @end +@interface SubTest1Ext : Test1 +-(instancetype)initWithRequiredParameter:(id)foo NS_DESIGNATED_INITIALIZER; +@end +// Mark 'init' as unavailable in the extension to silence warning. +@interface SubTest1Ext() +-(instancetype)init NS_UNAVAILABLE; +@end +@implementation SubTest1Ext +-(instancetype)initWithRequiredParameter:(id)foo { + return [super init]; +} +@end + @interface Test2 : NSObject @end @interface SubTest2 : Test2 -- 2.7.4