From: Benjamin Kramer Date: Sun, 15 Apr 2012 12:36:49 +0000 (+0000) Subject: Use forward declarations for ASTDeclContextNameLookupTable and add a missing delete. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b1758c662524e18d65d260188fdcbbdee6a9316b;p=clang Use forward declarations for ASTDeclContextNameLookupTable and add a missing delete. It would be nice to use OwningPtr here, but DeclContextInfo is stored in a DenseMap. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154763 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 9baaf4bcb5..a0bcecc93a 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -170,6 +170,9 @@ class ReadMethodPoolVisitor; namespace reader { class ASTIdentifierLookupTrait; + /// \brief The on-disk hash table used for the DeclContext's Name lookup table. + typedef OnDiskChainedHashTable + ASTDeclContextNameLookupTable; } } // end namespace serialization @@ -323,7 +326,9 @@ private: // TU, and when we read those update records, the actual context will not // be available yet (unless it's the TU), so have this pending map using the // ID as a key. It will be realized when the context is actually loaded. - typedef SmallVector, 1> DeclContextVisibleUpdates; + typedef + SmallVector, 1> DeclContextVisibleUpdates; typedef llvm::DenseMap DeclContextVisibleUpdatesPending; diff --git a/include/clang/Serialization/Module.h b/include/clang/Serialization/Module.h index 4c93c33842..786ecd33c1 100644 --- a/include/clang/Serialization/Module.h +++ b/include/clang/Serialization/Module.h @@ -27,9 +27,14 @@ namespace clang { class DeclContext; class Module; - +template class OnDiskChainedHashTable; + namespace serialization { +namespace reader { + class ASTDeclContextNameLookupTrait; +} + /// \brief Specifies the kind of module that has been loaded. enum ModuleKind { MK_Module, ///< File is a module proper. @@ -43,7 +48,8 @@ struct DeclContextInfo { DeclContextInfo() : NameLookupTableData(), LexicalDecls(), NumLexicalDecls() {} - void *NameLookupTableData; // an ASTDeclContextNameLookupTable. + OnDiskChainedHashTable + *NameLookupTableData; // an ASTDeclContextNameLookupTable. const KindDeclIDPair *LexicalDecls; unsigned NumLexicalDecls; }; diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index f91b66cf54..05fcb4ba9f 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -1911,7 +1911,8 @@ ASTReader::ReadASTBlock(ModuleFile &F) { case UPDATE_VISIBLE: { unsigned Idx = 0; serialization::DeclID ID = ReadDeclID(F, Record, Idx); - void *Table = ASTDeclContextNameLookupTable::Create( + ASTDeclContextNameLookupTable *Table = + ASTDeclContextNameLookupTable::Create( (const unsigned char *)BlobStart + Record[Idx++], (const unsigned char *)BlobStart, ASTDeclContextNameLookupTrait(*this, F)); @@ -4908,7 +4909,7 @@ namespace { // Look for this name within this module. ASTDeclContextNameLookupTable *LookupTable = - (ASTDeclContextNameLookupTable*)Info->second.NameLookupTableData; + Info->second.NameLookupTableData; ASTDeclContextNameLookupTable::iterator Pos = LookupTable->find(This->Name); if (Pos == LookupTable->end()) @@ -4997,7 +4998,7 @@ namespace { // Look for this name within this module. ASTDeclContextNameLookupTable *LookupTable = - (ASTDeclContextNameLookupTable*)Info->second.NameLookupTableData; + Info->second.NameLookupTableData; for (ASTDeclContextNameLookupTable::key_iterator I = LookupTable->key_begin(), E = LookupTable->key_end(); I != E; ++I) { @@ -6364,6 +6365,6 @@ ASTReader::~ASTReader() { for (DeclContextVisibleUpdates::iterator J = I->second.begin(), F = I->second.end(); J != F; ++J) - delete static_cast(J->first); + delete J->first; } } diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 38b612cbd9..8dd53ee7d2 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "ASTCommon.h" +#include "ASTReaderInternals.h" #include "clang/Serialization/ASTReader.h" #include "clang/Sema/IdentifierResolver.h" #include "clang/Sema/Sema.h" @@ -2104,7 +2105,9 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { DeclContextVisibleUpdates &U = I->second; for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end(); UI != UE; ++UI) { - UI->second->DeclContextInfos[DC].NameLookupTableData = UI->first; + DeclContextInfo &Info = UI->second->DeclContextInfos[DC]; + delete Info.NameLookupTableData; + Info.NameLookupTableData = UI->first; } PendingVisibleUpdates.erase(I); } diff --git a/lib/Serialization/ASTReaderInternals.h b/lib/Serialization/ASTReaderInternals.h index 3a1dfcf4b7..da90c3400a 100644 --- a/lib/Serialization/ASTReaderInternals.h +++ b/lib/Serialization/ASTReaderInternals.h @@ -79,10 +79,6 @@ public: unsigned DataLen); }; -/// \brief The on-disk hash table used for the DeclContext's Name lookup table. -typedef OnDiskChainedHashTable - ASTDeclContextNameLookupTable; - /// \brief Class that performs lookup for an identifier stored in an AST file. class ASTIdentifierLookupTrait { ASTReader &Reader; diff --git a/lib/Serialization/Module.cpp b/lib/Serialization/Module.cpp index 16b95e2a68..ff241d3d41 100644 --- a/lib/Serialization/Module.cpp +++ b/lib/Serialization/Module.cpp @@ -45,8 +45,7 @@ ModuleFile::~ModuleFile() { E = DeclContextInfos.end(); I != E; ++I) { if (I->second.NameLookupTableData) - delete static_cast( - I->second.NameLookupTableData); + delete I->second.NameLookupTableData; } delete static_cast(IdentifierLookupTable);