r197202 - [objc] If we don't know for sure what the designated initializers of the superclass are,

Argyrios Kyrtzidis akyrtzi at gmail.com
Thu Dec 12 19:48:17 PST 2013


Author: akirtzidis
Date: Thu Dec 12 21:48:17 2013
New Revision: 197202

URL: http://llvm.org/viewvc/llvm-project?rev=197202&view=rev
Log:
[objc] If we don't know for sure what the designated initializers of the superclass are,
assume that a [super init..] inside a designated initializer also refers to a designated one
and do not warn.

Modified:
    cfe/trunk/include/clang/AST/DeclObjC.h
    cfe/trunk/lib/Sema/SemaExprObjC.cpp
    cfe/trunk/test/SemaObjC/attr-designated-init.m

Modified: cfe/trunk/include/clang/AST/DeclObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=197202&r1=197201&r2=197202&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Thu Dec 12 21:48:17 2013
@@ -767,6 +767,12 @@ public:
   /// marked with the 'objc_designated_initializer' attribute.
   bool hasDesignatedInitializers() const;
 
+  /// Returns true if this interface decl declares a designated initializer
+  /// or it inherites one from its super class.
+  bool declaresOrInheritsDesignatedInitializers() const {
+    return hasDesignatedInitializers() || inheritsDesignatedInitializers();
+  }
+
   const ObjCProtocolList &getReferencedProtocols() const {
     assert(hasDefinition() && "Caller did not check for forward reference!");
     if (data().ExternallyCompleted)

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=197202&r1=197201&r2=197202&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Thu Dec 12 21:48:17 2013
@@ -2455,7 +2455,10 @@ ExprResult Sema::BuildInstanceMessage(Ex
       if (const ObjCObjectPointerType *
             OCIType = ReceiverType->getAsObjCInterfacePointerType()) {
         if (const ObjCInterfaceDecl *ID = OCIType->getInterfaceDecl()) {
-          if (ID->isDesignatedInitializer(Sel)) {
+          // Either we know this is a designated initializer or we
+          // conservatively assume it because we don't know for sure.
+          if (!ID->declaresOrInheritsDesignatedInitializers() ||
+              ID->isDesignatedInitializer(Sel)) {
             isDesignatedInitChain = true;
             getCurFunction()->ObjCWarnForNoDesignatedInitChain = false;
           }

Modified: cfe/trunk/test/SemaObjC/attr-designated-init.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-designated-init.m?rev=197202&r1=197201&r2=197202&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/attr-designated-init.m (original)
+++ cfe/trunk/test/SemaObjC/attr-designated-init.m Thu Dec 12 21:48:17 2013
@@ -203,3 +203,19 @@ __attribute__((objc_root_class))
   return 0;
 }
 @end
+
+__attribute__((objc_root_class))
+ at interface B2
+-(id)init;
+ at end
+
+ at interface S8: B2
+-(id)initS8 NS_DESIGNATED_INITIALIZER;
+ at end
+
+ at implementation S8
+-(id)initS8
+{
+  return [super init];
+}
+ at end





More information about the cfe-commits mailing list