mirror of https://github.com/microsoft/clang.git
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215929 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e95b2a0691
commit
6dc4e613eb
|
@ -2019,6 +2019,8 @@ void ASTDeclReader::mergeRedeclarable(Redeclarable<T> *DBase,
|
|||
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
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
@class Protocol;
|
||||
typedef struct objc_class *Class
|
||||
@class id;
|
|
@ -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]
|
Loading…
Reference in New Issue