From 11e12eb6310f5c1f546282454747c315a3234a62 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Thu, 30 Jul 2015 19:06:04 +0000 Subject: [PATCH] [sema] Allow to opt-out of overriding the super class's designated initializers by marking the initializer as unavailable in the subclass. rdar://20281322 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243676 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaObjCProperty.cpp | 14 ++++++++++---- test/SemaObjC/attr-designated-init.m | 12 +++++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index f139c83c73..02a0cdfee5 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/lib/Sema/SemaObjCProperty.cpp @@ -1950,10 +1950,16 @@ void Sema::DiagnoseMissingDesignatedInitOverrides( I = DesignatedInits.begin(), E = DesignatedInits.end(); I != E; ++I) { const ObjCMethodDecl *MD = *I; if (!InitSelSet.count(MD->getSelector())) { - Diag(ImplD->getLocation(), - diag::warn_objc_implementation_missing_designated_init_override) - << MD->getSelector(); - Diag(MD->getLocation(), diag::note_objc_designated_init_marked_here); + bool Ignore = false; + if (auto *IMD = IFD->getInstanceMethod(MD->getSelector())) { + Ignore = IMD->isUnavailable(); + } + if (!Ignore) { + Diag(ImplD->getLocation(), + diag::warn_objc_implementation_missing_designated_init_override) + << MD->getSelector(); + Diag(MD->getLocation(), diag::note_objc_designated_init_marked_here); + } } } } diff --git a/test/SemaObjC/attr-designated-init.m b/test/SemaObjC/attr-designated-init.m index a8673e1b01..0508588478 100644 --- a/test/SemaObjC/attr-designated-init.m +++ b/test/SemaObjC/attr-designated-init.m @@ -1,6 +1,7 @@ // RUN: %clang_cc1 -fsyntax-only -Wno-incomplete-implementation -verify -fblocks %s #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +#define NS_UNAVAILABLE __attribute__((unavailable)) void fnfoo(void) NS_DESIGNATED_INITIALIZER; // expected-error {{only applies to init methods of interface or class extension declarations}} @@ -253,7 +254,7 @@ __attribute__((objc_root_class)) __attribute__((objc_root_class)) @interface MyObject - (instancetype)initWithStuff:(id)stuff __attribute__((objc_designated_initializer)); -- (instancetype)init __attribute__((unavailable)); +- (instancetype)init NS_UNAVAILABLE; @end @implementation MyObject @@ -378,6 +379,15 @@ __attribute__((objc_root_class)) } @end +@interface SubTest1 : Test1 +-(instancetype)init NS_UNAVAILABLE; +-(instancetype)initWithRequiredParameter:(id)foo NS_DESIGNATED_INITIALIZER; +@end +@implementation SubTest1 +-(instancetype)initWithRequiredParameter:(id)foo { + return [super init]; +} +@end @interface Test2 : NSObject @end -- 2.40.0