diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-01-14 15:13:49 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-01-14 15:13:49 +0000 |
commit | 7c99bb5c4901c39460818ff8c00840218c48251f (patch) | |
tree | 9fbb09a974379415610adfcc29123dd5f8c8e47c /lib/Serialization/ASTWriterDecl.cpp | |
parent | 170fd49294b85ab10f820721d99ff9d109c7230d (diff) |
Reimplement RedeclarableTemplateDecl in terms of
Redeclarable<RedeclarableTemplateDecl>, 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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148181 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Serialization/ASTWriterDecl.cpp')
-rw-r--r-- | lib/Serialization/ASTWriterDecl.cpp | 31 |
1 files changed, 5 insertions, 26 deletions
diff --git a/lib/Serialization/ASTWriterDecl.cpp b/lib/Serialization/ASTWriterDecl.cpp index b0ba7b47c9..32432c0a4f 100644 --- a/lib/Serialization/ASTWriterDecl.cpp +++ b/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<ClassTemplateSpecializationDecl> 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. |