]> granicus.if.org Git - clang/commitdiff
Objective-C. Turn off designated initialization warnings on
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 14 Mar 2014 20:35:00 +0000 (20:35 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 14 Mar 2014 20:35:00 +0000 (20:35 +0000)
'init' methods which are unavailable. Subclasses of NSObject
have to implement such methods as a common pattern to prevent
user's own implementation. // rdar://16305460

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

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

index 3198b01949d3ceb48472e48ddf887eb2d21cdaef..ca4d20c099406f3730bd04a71ea5838c34cf3213 100644 (file)
@@ -392,11 +392,14 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
     if (MDecl->getMethodFamily() == OMF_init) {
       if (MDecl->isDesignatedInitializerForTheInterface()) {
         getCurFunction()->ObjCIsDesignatedInit = true;
-        getCurFunction()->ObjCWarnForNoDesignatedInitChain =
+        // Don't issue this warning for unavaialable inits.
+        if (!MDecl->isUnavailable())
+          getCurFunction()->ObjCWarnForNoDesignatedInitChain =
             IC->getSuperClass() != 0;
       } else if (IC->hasDesignatedInitializers()) {
         getCurFunction()->ObjCIsSecondaryInit = true;
-        getCurFunction()->ObjCWarnForNoInitDelegation = true;
+        // Don't issue this warning for unavaialable inits.
+        getCurFunction()->ObjCWarnForNoInitDelegation = !MDecl->isUnavailable();
       }
     }
 
index 916be5d3bc1dfb2f7b159ac14da9e289f3602718..fccf21536cae473ce929c85611ae0d04aeaa7b26 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -fblocks %s
+// RUN: %clang_cc1 -fsyntax-only -Wno-incomplete-implementation -verify -fblocks %s
 
 #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
 
@@ -248,3 +248,17 @@ __attribute__((objc_root_class))
     return ((void*)0);
 }
 @end
+
+// rdar://16305460
+__attribute__((objc_root_class))
+@interface MyObject
+- (instancetype)initWithStuff:(id)stuff __attribute__((objc_designated_initializer));
+- (instancetype)init __attribute__((unavailable));
+@end
+
+@implementation MyObject
+- (instancetype)init
+{
+   return ((void*)0);
+}
+@end