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" + +@interface A2 : Base +@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 @@ +@class NSString; +@interface Base +- (id)initWithNibName:(NSString *)nibNameOrNil __attribute__((objc_designated_initializer)); +@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" + +@interface X : A2 +@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" + +@implementation X + +- (instancetype)initWithNibName:(NSString *)nibName { + if ((self = [super initWithNibName:nibName])) { + return self; + } + return self; +} +@end _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits