diff options
-rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 9 | ||||
-rw-r--r-- | clang/test/SemaObjC/attr-designated-init.m | 13 |
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index 82e8def14ac..cea362fb425 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 3558916dbe5..7d1e7008e8e 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 |