diff options
-rw-r--r-- | clang/Driver/SerializationTest.cpp | 5 | ||||
-rw-r--r-- | clang/include/clang/AST/TranslationUnit.h | 9 | ||||
-rw-r--r-- | clang/lib/AST/TranslationUnit.cpp | 5 |
3 files changed, 15 insertions, 4 deletions
diff --git a/clang/Driver/SerializationTest.cpp b/clang/Driver/SerializationTest.cpp index 6e9309dc28b..5f7b94fca40 100644 --- a/clang/Driver/SerializationTest.cpp +++ b/clang/Driver/SerializationTest.cpp @@ -44,7 +44,10 @@ public: ~SerializationTest(); virtual void Initialize(ASTContext& context) { - if (!TU) TU.reset(new TranslationUnit(context, lopts)); + if (!TU) { + TU.reset(new TranslationUnit(context, lopts)); + TU->SetOwnsDecls(false); + } } virtual void HandleTopLevelDecl(Decl *D) { diff --git a/clang/include/clang/AST/TranslationUnit.h b/clang/include/clang/AST/TranslationUnit.h index 6aa3a40b87c..13b29c14a8f 100644 --- a/clang/include/clang/AST/TranslationUnit.h +++ b/clang/include/clang/AST/TranslationUnit.h @@ -35,13 +35,18 @@ class TranslationUnit { ASTContext* Context; std::vector<Decl*> TopLevelDecls; bool OwnsMetaData; + bool OwnsDecls; // The default ctor is only invoked during deserialization. - explicit TranslationUnit() : Context(NULL), OwnsMetaData(true) {} + explicit TranslationUnit() : Context(NULL), OwnsMetaData(true), + OwnsDecls(true) {} public: explicit TranslationUnit(ASTContext& Ctx, const LangOptions& lopt) - : LangOpts(lopt), Context(&Ctx), OwnsMetaData(false) {} + : LangOpts(lopt), Context(&Ctx), OwnsMetaData(false), + OwnsDecls(true) {} + + void SetOwnsDecls(bool val) { OwnsDecls = val; } ~TranslationUnit(); diff --git a/clang/lib/AST/TranslationUnit.cpp b/clang/lib/AST/TranslationUnit.cpp index bfe6ee27fbe..f1505b06218 100644 --- a/clang/lib/AST/TranslationUnit.cpp +++ b/clang/lib/AST/TranslationUnit.cpp @@ -31,7 +31,7 @@ enum { BasicMetadataBlock = 1, DeclsBlock = 3 }; TranslationUnit::~TranslationUnit() { - if (OwnsMetaData && Context) { + if (OwnsDecls) { llvm::DenseSet<Decl*> Killed; for (iterator I=begin(), E=end(); I!=E; ++I) { if (Killed.count(*I)) continue; @@ -39,10 +39,13 @@ TranslationUnit::~TranslationUnit() { Killed.insert(*I); (*I)->Destroy(*Context); } + } + if (OwnsMetaData && Context) { // The ASTContext object has the sole references to the IdentifierTable // Selectors, and the Target information. Go and delete them, since // the TranslationUnit effectively owns them. + delete &(Context->Idents); delete &(Context->Selectors); delete &(Context->Target); |