aboutsummaryrefslogtreecommitdiff
path: root/lib/Serialization/ASTWriterDecl.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-01-14 15:13:49 +0000
committerDouglas Gregor <dgregor@apple.com>2012-01-14 15:13:49 +0000
commit7c99bb5c4901c39460818ff8c00840218c48251f (patch)
tree9fbb09a974379415610adfcc29123dd5f8c8e47c /lib/Serialization/ASTWriterDecl.cpp
parent170fd49294b85ab10f820721d99ff9d109c7230d (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.cpp31
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.