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