aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Serialization/ASTWriterDecl.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-12-19 18:19:24 +0000
committerDouglas Gregor <dgregor@apple.com>2011-12-19 18:19:24 +0000
commit074a409622d720f28396109f32b49e3f94fa3374 (patch)
treec625a0e4c2066ffa238e649fda2119b184cb061f /clang/lib/Serialization/ASTWriterDecl.cpp
parenta7d24216033bfd49478150a292422f03cf0dcfc8 (diff)
downloadllvm-074a409622d720f28396109f32b49e3f94fa3374.zip
llvm-074a409622d720f28396109f32b49e3f94fa3374.tar.gz
llvm-074a409622d720f28396109f32b49e3f94fa3374.tar.bz2
Re-implement (de-)serialization of redeclaration chains for
redeclaration templates (RedeclarableTemplateDecl), similarly to the way (de-)serialization is implemented for Redeclarable<T>. In the process, found a simpler formulation for handling redeclaration chains and implemented that in both places. The new test establishes that we're building the redeclaration chains properly. However, the FIXME indicates where we're tickling a different bug that has to do with us not setting the DefinitionData pointer properly in redeclarations that we detected after the definition itself was deserialized. The (separable) fix for that bug is forthcoming. llvm-svn: 146883
Diffstat (limited to 'clang/lib/Serialization/ASTWriterDecl.cpp')
-rw-r--r--clang/lib/Serialization/ASTWriterDecl.cpp80
1 files changed, 39 insertions, 41 deletions
diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
index bb4359a..cb1c6f0 100644
--- a/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -188,7 +188,7 @@ void ASTDeclWriter::VisitTypedefDecl(TypedefDecl *D) {
if (!D->hasAttrs() &&
!D->isImplicit() &&
!D->isUsed(false) &&
- D->RedeclLink.getPointer() == D &&
+ !D->getPreviousDeclaration() &&
!D->isInvalidDecl() &&
!D->isReferenced() &&
!D->isTopLevelDeclInObjCContainer() &&
@@ -238,7 +238,7 @@ void ASTDeclWriter::VisitEnumDecl(EnumDecl *D) {
!D->isImplicit() &&
!D->isUsed(false) &&
!D->hasExtInfo() &&
- D->RedeclLink.getPointer() == D &&
+ !D->getPreviousDeclaration() &&
!D->isInvalidDecl() &&
!D->isReferenced() &&
!D->isTopLevelDeclInObjCContainer() &&
@@ -262,7 +262,7 @@ void ASTDeclWriter::VisitRecordDecl(RecordDecl *D) {
!D->isImplicit() &&
!D->isUsed(false) &&
!D->hasExtInfo() &&
- D->RedeclLink.getPointer() == D &&
+ !D->getPreviousDeclaration() &&
!D->isInvalidDecl() &&
!D->isReferenced() &&
!D->isTopLevelDeclInObjCContainer() &&
@@ -708,7 +708,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
!D->isModulePrivate() &&
D->getDeclName().getNameKind() == DeclarationName::Identifier &&
!D->hasExtInfo() &&
- D->RedeclLink.getPointer() == D &&
+ !D->getPreviousDeclaration() &&
!D->hasCXXDirectInitializer() &&
D->getInit() == 0 &&
!isa<ParmVarDecl>(D) &&
@@ -1051,32 +1051,34 @@ void ASTDeclWriter::VisitTemplateDecl(TemplateDecl *D) {
void ASTDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {
// Emit data to initialize CommonOrPrev before VisitTemplateDecl so that
// getCommonPtr() can be used while this is still initializing.
-
- Writer.AddDeclRef(D->getPreviousDeclaration(), Record);
- if (D->getPreviousDeclaration())
- Writer.AddDeclRef(D->getFirstDeclaration(), Record);
-
- if (D->getPreviousDeclaration() == 0) {
- // This TemplateDecl owns the CommonPtr; write it.
- assert(D->isCanonicalDecl());
-
+ enum { FirstDeclaration, PointsToPrevious };
+ RedeclarableTemplateDecl *Prev = D->getPreviousDeclaration();
+ RedeclarableTemplateDecl *First = 0;
+ if (!Prev) {
+ Record.push_back(FirstDeclaration);
+
+ // This declaration owns the 'common' pointer, so serialize that data now.
Writer.AddDeclRef(D->getInstantiatedFromMemberTemplate(), Record);
if (D->getInstantiatedFromMemberTemplate())
Record.push_back(D->isMemberSpecialization());
-
- Writer.AddDeclRef(D->getCommonPtr()->Latest, Record);
} else {
- RedeclarableTemplateDecl *First = D->getFirstDeclaration();
- assert(First != D);
- // If this is a most recent redeclaration that is pointed to by a first decl
- // in a chained PCH, keep track of the association with the map so we can
- // update the first decl during AST reading.
- if (First->getMostRecentDeclaration() == D &&
- First->isFromASTFile() && !D->isFromASTFile()) {
- assert(Writer.FirstLatestDecls.find(First)==Writer.FirstLatestDecls.end()
- && "The latest is already set");
- Writer.FirstLatestDecls[First] = D;
- }
+ First = D->getFirstDeclaration();
+ Record.push_back(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);
@@ -1274,19 +1276,19 @@ void ASTDeclWriter::VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset,
template <typename T>
void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) {
- enum { OnlyDeclaration = 0, FirstInFile, PointsToPrevious };
- if (D->RedeclLink.getPointer() == D) {
- // This is the only declaration.
- Record.push_back(OnlyDeclaration);
- return;
- }
-
+ enum { FirstDeclaration = 0, PointsToPrevious };
+ T *Prev = D->getPreviousDeclaration();
T *First = D->getFirstDeclaration();
- if (!D->getPreviousDeclaration() ||
- D->getPreviousDeclaration()->isFromASTFile()) {
- Record.push_back(FirstInFile);
+
+ if (!Prev) {
+ Record.push_back(FirstDeclaration);
+ } else {
+ Record.push_back(PointsToPrevious);
Writer.AddDeclRef(First, Record);
-
+ Writer.AddDeclRef(D->getPreviousDeclaration(), Record);
+ }
+
+ if (D->RedeclLink.getPointer() != D && (!Prev || Prev->isFromASTFile())) {
// Capture the set of redeclarations in this file.
LocalRedeclarationsInfo LocalInfo = {
Writer.GetDeclRef(First),
@@ -1294,10 +1296,6 @@ void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) {
Writer.GetDeclRef(D->getMostRecentDeclaration())
};
Writer.LocalRedeclarations.push_back(LocalInfo);
- } else {
- Record.push_back(PointsToPrevious);
- Writer.AddDeclRef(First, Record);
- Writer.AddDeclRef(D->getPreviousDeclaration(), Record);
}
}