From 8a798a7f7d88dc9865fad7da648e5cef8580c65a Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 29 Jul 2010 16:12:01 +0000 Subject: [PATCH] Store latest redeclaration for each redeclarable template declaration This patch adds a Latest field to RedeclarableTemplateDecl's CommonBase class which is used to store the latest redeclaration. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109755 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclTemplate.h | 9 +++++---- lib/AST/DeclTemplate.cpp | 13 +++++++++++++ lib/Frontend/PCHReaderDecl.cpp | 5 +++++ lib/Frontend/PCHWriterDecl.cpp | 2 ++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/include/clang/AST/DeclTemplate.h b/include/clang/AST/DeclTemplate.h index 3c678cc3ff..8d3cfad817 100644 --- a/include/clang/AST/DeclTemplate.h +++ b/include/clang/AST/DeclTemplate.h @@ -492,10 +492,7 @@ class RedeclarableTemplateDecl : public TemplateDecl { RedeclarableTemplateDecl *getCanonicalDeclImpl(); - void setPreviousDeclarationImpl(RedeclarableTemplateDecl *Prev) { - if (Prev) - CommonOrPrev = Prev; - } + void setPreviousDeclarationImpl(RedeclarableTemplateDecl *Prev); RedeclarableTemplateDecl *getInstantiatedFromMemberTemplateImpl() { return getCommonPtr()->InstantiatedFromMember.getPointer(); @@ -517,6 +514,9 @@ protected: /// was explicitly specialized. llvm::PointerIntPair InstantiatedFromMember; + + /// \brief The latest declaration of this template. + RedeclarableTemplateDecl *Latest; }; /// \brief A pointer to the previous declaration (if this is a redeclaration) @@ -602,6 +602,7 @@ public: } friend class PCHDeclReader; + friend class PCHDeclWriter; }; template diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp index de17568942..0ca2837627 100644 --- a/lib/AST/DeclTemplate.cpp +++ b/lib/AST/DeclTemplate.cpp @@ -94,6 +94,7 @@ RedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() { if (First->CommonOrPrev.isNull()) { CommonBase *CommonPtr = First->newCommon(); First->CommonOrPrev = CommonPtr; + CommonPtr->Latest = First; } return First->CommonOrPrev.get(); } @@ -106,6 +107,18 @@ RedeclarableTemplateDecl *RedeclarableTemplateDecl::getCanonicalDeclImpl() { return Tmpl; } +void RedeclarableTemplateDecl::setPreviousDeclarationImpl( + RedeclarableTemplateDecl *Prev) { + if (Prev) { + CommonBase *Common = Prev->getCommonPtr(); + Prev = Common->Latest; + Common->Latest = this; + CommonOrPrev = Prev; + } else { + assert(CommonOrPrev.is() && "Cannot reset TemplateDecl Prev"); + } +} + //===----------------------------------------------------------------------===// // FunctionTemplateDecl Implementation //===----------------------------------------------------------------------===// diff --git a/lib/Frontend/PCHReaderDecl.cpp b/lib/Frontend/PCHReaderDecl.cpp index 94485d2d8f..03e7e1a093 100644 --- a/lib/Frontend/PCHReaderDecl.cpp +++ b/lib/Frontend/PCHReaderDecl.cpp @@ -915,6 +915,11 @@ void PCHDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { if (Record[Idx++]) D->setMemberSpecialization(); } + + RedeclarableTemplateDecl *LatestDecl = + cast_or_null(Reader.GetDecl(Record[Idx++])); + assert(LatestDecl->getKind() == D->getKind() && "Latest kind mismatch"); + D->getCommonPtr()->Latest = LatestDecl; } } diff --git a/lib/Frontend/PCHWriterDecl.cpp b/lib/Frontend/PCHWriterDecl.cpp index 3ac49584a5..75045eb32a 100644 --- a/lib/Frontend/PCHWriterDecl.cpp +++ b/lib/Frontend/PCHWriterDecl.cpp @@ -852,6 +852,8 @@ void PCHDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { Writer.AddDeclRef(D->getInstantiatedFromMemberTemplate(), Record); if (D->getInstantiatedFromMemberTemplate()) Record.push_back(D->isMemberSpecialization()); + + Writer.AddDeclRef(D->getCommonPtr()->Latest, Record); } } -- 2.40.0