diff options
| -rw-r--r-- | clang/lib/Frontend/FrontendAction.cpp | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index 6cbd8ba193e..4bb539c88a9 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -408,16 +408,16 @@ void FrontendAction::EndSourceFile() { // Finalize the action. EndSourceFileAction(); - // Release the consumer and the AST, in that order since the consumer may - // perform actions in its destructor which require the context. + // Sema references the ast consumer, so reset sema first. // // FIXME: There is more per-file stuff we could just drop here? - if (CI.getFrontendOpts().DisableFree) { - BuryPointer(CI.takeASTConsumer()); + bool DisableFree = CI.getFrontendOpts().DisableFree; + if (DisableFree) { if (!isCurrentFileAST()) { CI.resetAndLeakSema(); CI.resetAndLeakASTContext(); } + BuryPointer(CI.takeASTConsumer()); } else { if (!isCurrentFileAST()) { CI.setSema(0); @@ -443,7 +443,7 @@ void FrontendAction::EndSourceFile() { // FrontendAction. CI.clearOutputFiles(/*EraseFiles=*/shouldEraseOutputFiles()); - if (isCurrentFileAST()) { + if (DisableFree && isCurrentFileAST()) { CI.resetAndLeakSema(); CI.resetAndLeakASTContext(); CI.resetAndLeakPreprocessor(); |

