]> granicus.if.org Git - clang/commitdiff
[sema] Allow to opt-out of overriding the super class's designated initializers by...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 30 Jul 2015 19:06:04 +0000 (19:06 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 30 Jul 2015 19:06:04 +0000 (19:06 +0000)
rdar://20281322

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243676 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaObjCProperty.cpp
test/SemaObjC/attr-designated-init.m

index f139c83c734bd0ca655bd56c97fc1d2c5db1ffab..02a0cdfee5f0339676e2775d4c968d9fbe4bc154 100644 (file)
@@ -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);
+      }
     }
   }
 }
index a8673e1b01912f3a49f402383e60d63069de96d4..05085884784b01ba6a3c133b749f4394bc57a18d 100644 (file)
@@ -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