diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -217,8 +217,13 @@ // Add to Consumers the main consumer, then all the plugins that go after it Consumers.push_back(std::move(Consumer)); - for (auto &C : AfterConsumers) { - Consumers.push_back(std::move(C)); + if (!AfterConsumers.empty()) { + // If we have plugins after the main consumer, which may be the codegen + // action, they likely will need the ASTContext, so don't clear it in the + // codegen action. + CI.getCodeGenOpts().ClearASTBeforeBackend = false; + for (auto &C : AfterConsumers) + Consumers.push_back(std::move(C)); } return std::make_unique(std::move(Consumers)); diff --git a/clang/test/Misc/clear-ast-before-backend-plugins.c b/clang/test/Misc/clear-ast-before-backend-plugins.c new file mode 100644 --- /dev/null +++ b/clang/test/Misc/clear-ast-before-backend-plugins.c @@ -0,0 +1,9 @@ +// REQUIRES: plugins, examples, asserts + +// RUN: %clang_cc1 -mllvm -debug-only=codegenaction -clear-ast-before-backend -emit-obj -o /dev/null -load %llvmshlibdir/PrintFunctionNames%pluginext %s 2>&1 | FileCheck %s --check-prefix=YES +// YES: Clearing AST + +// RUN: %clang_cc1 -mllvm -debug-only=codegenaction -clear-ast-before-backend -emit-obj -o /dev/null -load %llvmshlibdir/PrintFunctionNames%pluginext -add-plugin print-fns -plugin-arg-print-fns help %s 2>&1 | FileCheck %s --check-prefix=NO +// NO-NOT: Clearing AST + +void f() {}