From 68444de354987f9816d368a75997d0f79e359f7b Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Sat, 14 Jan 2012 15:13:49 +0000 Subject: Reimplement RedeclarableTemplateDecl in terms of Redeclarable, eliminating a bunch of redeclaration-chain logic both in RedeclarableTemplateDecl and especially in its (de-)serialization. As part of this, eliminate the RedeclarableTemplate<> class template, which was an abstraction that didn't actually save anything. llvm-svn: 148181 --- clang/lib/Serialization/ASTWriterDecl.cpp | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) (limited to 'clang/lib/Serialization/ASTWriterDecl.cpp') diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index b0ba7b47c9d..32432c0a4fc 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -1031,38 +1031,17 @@ void ASTDeclWriter::VisitTemplateDecl(TemplateDecl *D) { } void ASTDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { + VisitRedeclarable(D); + // Emit data to initialize CommonOrPrev before VisitTemplateDecl so that // getCommonPtr() can be used while this is still initializing. - enum { FirstDeclaration, FirstInFile, PointsToPrevious }; - RedeclarableTemplateDecl *Prev = D->getPreviousDeclaration(); - RedeclarableTemplateDecl *First = 0; - if (!Prev) { - Record.push_back(FirstDeclaration); - + if (D->isFirstDeclaration()) { // This declaration owns the 'common' pointer, so serialize that data now. Writer.AddDeclRef(D->getInstantiatedFromMemberTemplate(), Record); if (D->getInstantiatedFromMemberTemplate()) Record.push_back(D->isMemberSpecialization()); - } else { - First = D->getFirstDeclaration(); - Record.push_back(Prev->isFromASTFile()? FirstInFile : PointsToPrevious); - Writer.AddDeclRef(First, Record); - Writer.AddDeclRef(Prev, Record); } - if (D->getMostRecentDeclaration() != D && (!Prev || Prev->isFromASTFile())) { - if (!First) - First = D->getFirstDeclaration(); - - // Capture the set of redeclarations in this file. - LocalRedeclarationsInfo LocalInfo = { - Writer.GetDeclRef(First), - Writer.GetDeclRef(D), - Writer.GetDeclRef(D->getMostRecentDeclaration()) - }; - Writer.LocalRedeclarations.push_back(LocalInfo); - } - VisitTemplateDecl(D); Record.push_back(D->getIdentifierNamespace()); } @@ -1070,7 +1049,7 @@ void ASTDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) { void ASTDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) { VisitRedeclarableTemplateDecl(D); - if (D->getPreviousDeclaration() == 0) { + if (D->isFirstDeclaration()) { typedef llvm::FoldingSet CTSDSetTy; CTSDSetTy &CTSDSet = D->getSpecializations(); Record.push_back(CTSDSet.size()); @@ -1158,7 +1137,7 @@ void ASTDeclWriter::VisitClassScopeFunctionSpecializationDecl( void ASTDeclWriter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { VisitRedeclarableTemplateDecl(D); - if (D->getPreviousDeclaration() == 0) { + if (D->isFirstDeclaration()) { // This FunctionTemplateDecl owns the CommonPtr; write it. // Write the function specialization declarations. -- cgit v1.2.3