From d9f526fc2e879c04d91e63f30bdd0c7eed9535d6 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Thu, 28 Oct 2010 09:29:32 +0000 Subject: [PATCH] Switch case IDs conflict between chained PCHs; since there is no need to be global, make them local to a decl. llvm-svn: 117540 --- clang/include/clang/Serialization/ASTReader.h | 2 ++ clang/include/clang/Serialization/ASTWriter.h | 2 ++ clang/lib/Serialization/ASTReader.cpp | 7 +++++++ clang/lib/Serialization/ASTWriterDecl.cpp | 3 +++ clang/lib/Serialization/ASTWriterStmt.cpp | 4 ++++ 5 files changed, 18 insertions(+) diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index abe84cac280b..2217cc7eb86a 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -1162,6 +1162,8 @@ public: /// deserialized and has the given ID. void RecordLabelStmt(LabelStmt *S, unsigned ID); + void ClearSwitchCaseIDs(); + /// \brief Set the label of the given statement to the label /// identified by ID. /// diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index 99f3ece3ddd9..1d905ddfaa42 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -484,6 +484,8 @@ public: /// \brief Retrieve the ID for the given switch-case statement. unsigned getSwitchCaseID(SwitchCase *S); + void ClearSwitchCaseIDs(); + /// \brief Retrieve the ID for the given label statement, which may /// or may not have been emitted yet. unsigned GetLabelID(LabelStmt *S); diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index f09873a07072..6497b7877256 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -3284,6 +3284,9 @@ Decl *ASTReader::GetDecl(DeclID ID) { /// source each time it is called, and is meant to be used via a /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { + // Switch case IDs are per Decl. + ClearSwitchCaseIDs(); + // Offset here is a global offset across the entire chain. for (unsigned I = 0, N = Chain.size(); I != N; ++I) { PerFileData &F = *Chain[N - I - 1]; @@ -4252,6 +4255,10 @@ SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { return SwitchCaseStmts[ID]; } +void ASTReader::ClearSwitchCaseIDs() { + SwitchCaseStmts.clear(); +} + /// \brief Record that the given label statement has been /// deserialized and has the given ID. void ASTReader::RecordLabelStmt(LabelStmt *S, unsigned ID) { diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 3c6dd9bbc209..37c7765dc893 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -1128,6 +1128,9 @@ static bool isRequiredDecl(const Decl *D, ASTContext &Context) { } void ASTWriter::WriteDecl(ASTContext &Context, Decl *D) { + // Switch case IDs are per Decl. + ClearSwitchCaseIDs(); + RecordData Record; ASTDeclWriter W(*this, Context, Record); diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index 33b70e98c06d..fc8e9e0e595d 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -1311,6 +1311,10 @@ unsigned ASTWriter::getSwitchCaseID(SwitchCase *S) { return SwitchCaseIDs[S]; } +void ASTWriter::ClearSwitchCaseIDs() { + SwitchCaseIDs.clear(); +} + /// \brief Retrieve the ID for the given label statement, which may /// or may not have been emitted yet. unsigned ASTWriter::GetLabelID(LabelStmt *S) {