Index: include/clang/AST/Decl.h =================================================================== --- include/clang/AST/Decl.h +++ include/clang/AST/Decl.h @@ -3738,8 +3738,6 @@ assert(RedeclLink.NextIsLatest() && "setPreviousDecl on a decl already in a redeclaration chain"); - decl_type *First; - if (PrevDecl) { // Point to previous. Make sure that this is actually the most recent // redeclaration, or we can build invalid chains. If the most recent Index: include/clang/AST/Redeclarable.h =================================================================== --- include/clang/AST/Redeclarable.h +++ include/clang/AST/Redeclarable.h @@ -121,14 +121,15 @@ /// /// If there is only one declaration, it is DeclLink RedeclLink; + decl_type *First; decl_type *getNextRedeclaration() const { return RedeclLink.getNext(static_cast(this)); } public: - Redeclarable(const ASTContext &Ctx) - : RedeclLink(LatestDeclLink(Ctx)) {} + Redeclarable(const ASTContext &Ctx) + : RedeclLink(LatestDeclLink(Ctx)), First(static_cast(this)) {} /// \brief Return the previous declaration of this declaration or NULL if this /// is the first declaration. @@ -144,21 +145,11 @@ /// \brief Return the first declaration of this declaration or itself if this /// is the only declaration. - decl_type *getFirstDecl() { - decl_type *D = static_cast(this); - while (D->getPreviousDecl()) - D = D->getPreviousDecl(); - return D; - } + decl_type *getFirstDecl() { return First; } /// \brief Return the first declaration of this declaration or itself if this /// is the only declaration. - const decl_type *getFirstDecl() const { - const decl_type *D = static_cast(this); - while (D->getPreviousDecl()) - D = D->getPreviousDecl(); - return D; - } + const decl_type *getFirstDecl() const { return First; } /// \brief True if this is the first declaration in its redeclaration chain. bool isFirstDecl() const { return RedeclLink.NextIsLatest(); } Index: lib/Serialization/ASTReaderDecl.cpp =================================================================== --- lib/Serialization/ASTReaderDecl.cpp +++ lib/Serialization/ASTReaderDecl.cpp @@ -2106,6 +2106,7 @@ // which is the one that matters and mark the real previous DeclID to be // loaded & attached later on. D->RedeclLink = Redeclarable::PreviousDeclLink(FirstDecl); + D->First = FirstDecl->getCanonicalDecl(); } // Note that this declaration has been deserialized. @@ -2209,6 +2210,7 @@ // of the existing declaration, so that this declaration has the // appropriate canonical declaration. D->RedeclLink = Redeclarable::PreviousDeclLink(ExistingCanon); + D->First = ExistingCanon; // When we merge a namespace, update its pointer to the first namespace. // We cannot have loaded any redeclarations of this declaration yet, so @@ -2828,6 +2830,7 @@ Redeclarable *D, Decl *Previous, Decl *Canon) { D->RedeclLink.setPrevious(cast(Previous)); + D->First = cast(Previous)->First; } namespace clang { template<> @@ -2838,6 +2841,7 @@ FunctionDecl *PrevFD = cast(Previous); FD->RedeclLink.setPrevious(PrevFD); + FD->First = PrevFD->First; // If the previous declaration is an inline function declaration, then this // declaration is too.