r215929 - Fix the rececl chain for redeclarations of predefined decls
Ben Langmuir
blangmuir at apple.com
Mon Aug 18 12:32:46 PDT 2014
Author: benlangmuir
Date: Mon Aug 18 14:32:45 2014
New Revision: 215929
URL: http://llvm.org/viewvc/llvm-project?rev=215929&view=rev
Log:
Fix the rececl chain for redeclarations of predefined decls
Predefined decls like 'Protocol' in objc are not loaded from AST files,
so we cannot rely on loading the canonical decl to complete the redecl
chain for redeclarations of these decls. The broken redecl chain was
non-circular, so looping over redecls() would hang.
Added:
cfe/trunk/test/Index/Inputs/declare-objc-predef.h
cfe/trunk/test/Index/reparse-predef-objc-protocol.m
Modified:
cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=215929&r1=215928&r2=215929&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Mon Aug 18 14:32:45 2014
@@ -2019,6 +2019,8 @@ void ASTDeclReader::mergeRedeclarable(Re
T *D = static_cast<T*>(DBase);
T *DCanon = D->getCanonicalDecl();
if (D != DCanon &&
+ // IDs < NUM_PREDEF_DECL_IDS are not loaded from an AST file.
+ Redecl.getFirstID() >= NUM_PREDEF_DECL_IDS &&
(!Reader.getContext().getLangOpts().Modules ||
Reader.getOwningModuleFile(DCanon) == Reader.getOwningModuleFile(D))) {
// All redeclarations between this declaration and its originally-canonical
Added: cfe/trunk/test/Index/Inputs/declare-objc-predef.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Inputs/declare-objc-predef.h?rev=215929&view=auto
==============================================================================
--- cfe/trunk/test/Index/Inputs/declare-objc-predef.h (added)
+++ cfe/trunk/test/Index/Inputs/declare-objc-predef.h Mon Aug 18 14:32:45 2014
@@ -0,0 +1,3 @@
+ at class Protocol;
+typedef struct objc_class *Class
+ at class id;
Added: cfe/trunk/test/Index/reparse-predef-objc-protocol.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/reparse-predef-objc-protocol.m?rev=215929&view=auto
==============================================================================
--- cfe/trunk/test/Index/reparse-predef-objc-protocol.m (added)
+++ cfe/trunk/test/Index/reparse-predef-objc-protocol.m Mon Aug 18 14:32:45 2014
@@ -0,0 +1,9 @@
+// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 3 local %s -I %S/Inputs
+#import "declare-objc-predef.h"
+// PR20633
+
+// CHECK: declare-objc-predef.h:1:8: ObjCInterfaceDecl=Protocol:1:8 Extent=[1:1 - 1:16]
+// CHECK: declare-objc-predef.h:1:8: ObjCClassRef=Protocol:1:8 Extent=[1:8 - 1:16]
+// CHECK: declare-objc-predef.h:2:16: StructDecl=objc_class:2:16 Extent=[2:9 - 2:26]
+// CHECK: declare-objc-predef.h:2:28: TypedefDecl=Class:2:28 (Definition) Extent=[2:1 - 2:33]
+// CHECK: declare-objc-predef.h:2:16: TypeRef=struct objc_class:2:16 Extent=[2:16 - 2:26]
More information about the cfe-commits
mailing list