r301382 - [Modules][ObjC] Check definition from canonical decl on designated initializers

Bruno Cardoso Lopes via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 25 22:06:21 PDT 2017


Author: bruno
Date: Wed Apr 26 00:06:20 2017
New Revision: 301382

URL: http://llvm.org/viewvc/llvm-project?rev=301382&view=rev
Log:
[Modules][ObjC] Check definition from canonical decl on designated initializers

Use definition from canonical decl when checking for designated
initializers. This is necessary since deserialization of a interface
might reuse the definition from the canonical one (see r281119).

rdar://problem/29360655

Added:
    cfe/trunk/test/Modules/Inputs/objc-desig-init/
    cfe/trunk/test/Modules/Inputs/objc-desig-init/A.h
    cfe/trunk/test/Modules/Inputs/objc-desig-init/A2.h
    cfe/trunk/test/Modules/Inputs/objc-desig-init/Base.h
    cfe/trunk/test/Modules/Inputs/objc-desig-init/X.h
    cfe/trunk/test/Modules/Inputs/objc-desig-init/module.modulemap
    cfe/trunk/test/Modules/objc-designated-init-mod.m
Modified:
    cfe/trunk/lib/AST/DeclObjC.cpp

Modified: cfe/trunk/lib/AST/DeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=301382&r1=301381&r2=301382&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclObjC.cpp (original)
+++ cfe/trunk/lib/AST/DeclObjC.cpp Wed Apr 26 00:06:20 2017
@@ -539,9 +539,18 @@ void ObjCInterfaceDecl::getDesignatedIni
 
 bool ObjCInterfaceDecl::isDesignatedInitializer(Selector Sel,
                                       const ObjCMethodDecl **InitMethod) const {
+  bool HasCompleteDef = isThisDeclarationADefinition();
+  // During deserialization the data record for the ObjCInterfaceDecl could
+  // be made invariant by reusing the canonical decl. Take this into account
+  // when checking for the complete definition.
+  if (!HasCompleteDef && getCanonicalDecl()->hasDefinition() &&
+      getCanonicalDecl()->getDefinition() == getDefinition())
+    HasCompleteDef = true;
+
   // Check for a complete definition and recover if not so.
-  if (!isThisDeclarationADefinition())
+  if (!HasCompleteDef)
     return false;
+
   if (data().ExternallyCompleted)
     LoadExternalDefinition();
 

Added: cfe/trunk/test/Modules/Inputs/objc-desig-init/A.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/objc-desig-init/A.h?rev=301382&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/objc-desig-init/A.h (added)
+++ cfe/trunk/test/Modules/Inputs/objc-desig-init/A.h Wed Apr 26 00:06:20 2017
@@ -0,0 +1 @@
+#import "A2.h"

Added: cfe/trunk/test/Modules/Inputs/objc-desig-init/A2.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/objc-desig-init/A2.h?rev=301382&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/objc-desig-init/A2.h (added)
+++ cfe/trunk/test/Modules/Inputs/objc-desig-init/A2.h Wed Apr 26 00:06:20 2017
@@ -0,0 +1,4 @@
+#import "Base.h"
+
+ at interface A2 : Base
+ at end

Added: cfe/trunk/test/Modules/Inputs/objc-desig-init/Base.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/objc-desig-init/Base.h?rev=301382&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/objc-desig-init/Base.h (added)
+++ cfe/trunk/test/Modules/Inputs/objc-desig-init/Base.h Wed Apr 26 00:06:20 2017
@@ -0,0 +1,4 @@
+ at class NSString;
+ at interface Base
+- (id)initWithNibName:(NSString *)nibNameOrNil __attribute__((objc_designated_initializer));
+ at end

Added: cfe/trunk/test/Modules/Inputs/objc-desig-init/X.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/objc-desig-init/X.h?rev=301382&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/objc-desig-init/X.h (added)
+++ cfe/trunk/test/Modules/Inputs/objc-desig-init/X.h Wed Apr 26 00:06:20 2017
@@ -0,0 +1,4 @@
+#import "A2.h"
+
+ at interface X : A2
+ at end

Added: cfe/trunk/test/Modules/Inputs/objc-desig-init/module.modulemap
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/objc-desig-init/module.modulemap?rev=301382&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/objc-desig-init/module.modulemap (added)
+++ cfe/trunk/test/Modules/Inputs/objc-desig-init/module.modulemap Wed Apr 26 00:06:20 2017
@@ -0,0 +1,9 @@
+module Base {
+  header "Base.h"
+  export *
+}
+
+module A {
+  header "A.h"
+  export *
+}

Added: cfe/trunk/test/Modules/objc-designated-init-mod.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/objc-designated-init-mod.m?rev=301382&view=auto
==============================================================================
--- cfe/trunk/test/Modules/objc-designated-init-mod.m (added)
+++ cfe/trunk/test/Modules/objc-designated-init-mod.m Wed Apr 26 00:06:20 2017
@@ -0,0 +1,17 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -I %S/Inputs/objc-desig-init %s -verify
+// expected-no-diagnostics
+
+#import "X.h"
+#import "Base.h"
+#import "A.h"
+
+ at implementation X
+
+- (instancetype)initWithNibName:(NSString *)nibName {
+  if ((self = [super initWithNibName:nibName])) {
+		return self;
+  }
+  return self;
+}
+ at end




More information about the cfe-commits mailing list