diff options
-rw-r--r-- | include/clang/Frontend/PCHReader.h | 3 | ||||
-rw-r--r-- | include/clang/Sema/ExternalSemaSource.h | 3 | ||||
-rw-r--r-- | include/clang/Sema/SemaConsumer.h | 3 | ||||
-rw-r--r-- | lib/Sema/ParseAST.cpp | 9 |
4 files changed, 17 insertions, 1 deletions
diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h index 85861fab4a..ae7cb14422 100644 --- a/include/clang/Frontend/PCHReader.h +++ b/include/clang/Frontend/PCHReader.h @@ -625,6 +625,9 @@ public: /// tree. virtual void InitializeSema(Sema &S); + /// \brief Inform the semantic consumer that Sema is no longer available. + virtual void ForgetSema() { SemaObj = 0; } + /// \brief Retrieve the IdentifierInfo for the named identifier. /// /// This routine builds a new IdentifierInfo for the given identifier. If any diff --git a/include/clang/Sema/ExternalSemaSource.h b/include/clang/Sema/ExternalSemaSource.h index 05c56451b2..d27e29281b 100644 --- a/include/clang/Sema/ExternalSemaSource.h +++ b/include/clang/Sema/ExternalSemaSource.h @@ -34,6 +34,9 @@ public: /// tree. virtual void InitializeSema(Sema &S) {} + /// \brief Inform the semantic consumer that Sema is no longer available. + virtual void ForgetSema() {} + /// \brief Load the contents of the global method pool for a given /// selector. /// diff --git a/include/clang/Sema/SemaConsumer.h b/include/clang/Sema/SemaConsumer.h index b213daf8a3..3689a6e7a8 100644 --- a/include/clang/Sema/SemaConsumer.h +++ b/include/clang/Sema/SemaConsumer.h @@ -34,6 +34,9 @@ namespace clang { /// tree. virtual void InitializeSema(Sema &S) {} + /// \brief Inform the semantic consumer that Sema is no longer available. + virtual void ForgetSema() {} + // isa/cast/dyn_cast support static bool classof(const ASTConsumer *Consumer) { return Consumer->SemaConsumer; diff --git a/lib/Sema/ParseAST.cpp b/lib/Sema/ParseAST.cpp index 7c7df4bb61..898b3c230e 100644 --- a/lib/Sema/ParseAST.cpp +++ b/lib/Sema/ParseAST.cpp @@ -75,7 +75,7 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, while ((ADecl = P.RetrievePendingObjCImpDecl())) Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>()); - // process any TopLevelDecls generated by #pragma weak + // Process any TopLevelDecls generated by #pragma weak. for (llvm::SmallVector<Decl*,2>::iterator I = S.WeakTopLevelDecls().begin(), E = S.WeakTopLevelDecls().end(); I != E; ++I) @@ -83,6 +83,13 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, Consumer->HandleTranslationUnit(Ctx); + if (ExternalSemaSource *ESS = + dyn_cast_or_null<ExternalSemaSource>(Ctx.getExternalSource())) + ESS->ForgetSema(); + + if (SemaConsumer *SC = dyn_cast<SemaConsumer>(Consumer)) + SC->ForgetSema(); + if (PrintStats) { fprintf(stderr, "\nSTATISTICS:\n"); P.getActions().PrintStats(); |