diff options
-rw-r--r-- | include/clang/AST/DeclContextInternals.h | 1 | ||||
-rw-r--r-- | include/clang/AST/DependentDiagnostic.h | 5 | ||||
-rw-r--r-- | include/clang/Basic/PartialDiagnostic.h | 22 | ||||
-rw-r--r-- | lib/AST/DeclBase.cpp | 19 |
4 files changed, 28 insertions, 19 deletions
diff --git a/include/clang/AST/DeclContextInternals.h b/include/clang/AST/DeclContextInternals.h index 132ca87a5f..16cb491344 100644 --- a/include/clang/AST/DeclContextInternals.h +++ b/include/clang/AST/DeclContextInternals.h @@ -275,7 +275,6 @@ private: class DependentStoredDeclsMap : public StoredDeclsMap { public: DependentStoredDeclsMap() : FirstDiagnostic(0) {} - ~DependentStoredDeclsMap(); private: friend class DependentDiagnostic; diff --git a/include/clang/AST/DependentDiagnostic.h b/include/clang/AST/DependentDiagnostic.h index fb119a9f45..1954a282e8 100644 --- a/include/clang/AST/DependentDiagnostic.h +++ b/include/clang/AST/DependentDiagnostic.h @@ -86,7 +86,10 @@ public: } private: - DependentDiagnostic(const PartialDiagnostic &PDiag) : Diag(PDiag) {} + DependentDiagnostic(const PartialDiagnostic &PDiag, + PartialDiagnostic::Storage *Storage) + : Diag(PDiag, Storage) {} + static DependentDiagnostic *Create(ASTContext &Context, DeclContext *Parent, const PartialDiagnostic &PDiag); diff --git a/include/clang/Basic/PartialDiagnostic.h b/include/clang/Basic/PartialDiagnostic.h index 56082b7b09..d49e621d2f 100644 --- a/include/clang/Basic/PartialDiagnostic.h +++ b/include/clang/Basic/PartialDiagnostic.h @@ -19,12 +19,15 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/System/DataTypes.h" +#include <cassert> namespace clang { class DeclarationName; class PartialDiagnostic { +public: struct Storage { Storage() : NumDiagArgs(0), NumDiagRanges(0), NumCodeModificationHints(0) { } @@ -69,7 +72,6 @@ class PartialDiagnostic { CodeModificationHint CodeModificationHints[MaxCodeModificationHints]; }; -public: /// \brief An allocator for Storage objects, which uses a small cache to /// objects, used to reduce malloc()/free() traffic for partial diagnostics. class StorageAllocator { @@ -126,8 +128,10 @@ private: if (Allocator) DiagStorage = Allocator->Allocate(); - else + else { + assert(Allocator != reinterpret_cast<StorageAllocator *>(~uintptr_t(0))); DiagStorage = new Storage; + } return DiagStorage; } @@ -137,7 +141,7 @@ private: if (Allocator) Allocator->Deallocate(DiagStorage); - else + else if (Allocator != reinterpret_cast<StorageAllocator *>(~uintptr_t(0))) delete DiagStorage; DiagStorage = 0; } @@ -189,6 +193,14 @@ public: } } + PartialDiagnostic(const PartialDiagnostic &Other, Storage *DiagStorage) + : DiagID(Other.DiagID), DiagStorage(DiagStorage), + Allocator(reinterpret_cast<StorageAllocator *>(~uintptr_t(0))) + { + if (Other.DiagStorage) + *this->DiagStorage = *Other.DiagStorage; + } + PartialDiagnostic &operator=(const PartialDiagnostic &Other) { DiagID = Other.DiagID; if (Other.DiagStorage) { @@ -235,6 +247,8 @@ public: freeStorage(); } + bool hasStorage() const { return DiagStorage != 0; } + friend const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, QualType T) { PD.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), @@ -285,4 +299,4 @@ inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, } // end namespace clang -#endif +#endif diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index cb6b76c248..c693e153dd 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -994,17 +994,6 @@ void StoredDeclsMap::DestroyAll(StoredDeclsMap *Map, bool Dependent) { } } -DependentStoredDeclsMap::~DependentStoredDeclsMap() { - // Kill off the dependent diagnostics. They don't need to be - // deleted, but they do need to be destructed. - DependentDiagnostic *CurD = FirstDiagnostic; - while (CurD) { - DependentDiagnostic *NextD = CurD->NextDiagnostic; - CurD->~DependentDiagnostic(); - CurD = NextD; - } -} - DependentDiagnostic *DependentDiagnostic::Create(ASTContext &C, DeclContext *Parent, const PartialDiagnostic &PDiag) { @@ -1017,9 +1006,13 @@ DependentDiagnostic *DependentDiagnostic::Create(ASTContext &C, DependentStoredDeclsMap *Map = static_cast<DependentStoredDeclsMap*>(Parent->LookupPtr); - // FIXME: Allocate the copy of the PartialDiagnostic via the ASTContext's + // Allocate the copy of the PartialDiagnostic via the ASTContext's // BumpPtrAllocator, rather than the ASTContext itself. - DependentDiagnostic *DD = new (C) DependentDiagnostic(PDiag); + PartialDiagnostic::Storage *DiagStorage = 0; + if (PDiag.hasStorage()) + DiagStorage = new (C) PartialDiagnostic::Storage; + + DependentDiagnostic *DD = new (C) DependentDiagnostic(PDiag, DiagStorage); // TODO: Maybe we shouldn't reverse the order during insertion. DD->NextDiagnostic = Map->FirstDiagnostic; |