From: Alexander Kornienko Date: Thu, 13 Nov 2014 13:08:27 +0000 (+0000) Subject: Support non-owned DiagnosticConsumer in SetupSerializedDiagnostics X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=97fba2d728dbf5c148492c018be1a2f933ff71de;p=clang Support non-owned DiagnosticConsumer in SetupSerializedDiagnostics This fixes an assertion when running clang-tidy on a file having --serialize-diagnostics in compiler options. Committing a regression test for clang-tidy separately. Patch by Aaron Wishnick! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221884 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Frontend/ChainedDiagnosticConsumer.h b/include/clang/Frontend/ChainedDiagnosticConsumer.h index 372b381cff..eb33273c2f 100644 --- a/include/clang/Frontend/ChainedDiagnosticConsumer.h +++ b/include/clang/Frontend/ChainedDiagnosticConsumer.h @@ -22,13 +22,20 @@ class LangOptions; /// diagnostics should be included in counts. class ChainedDiagnosticConsumer : public DiagnosticConsumer { virtual void anchor(); - std::unique_ptr Primary; + std::unique_ptr OwningPrimary; + DiagnosticConsumer *Primary; std::unique_ptr Secondary; public: ChainedDiagnosticConsumer(std::unique_ptr Primary, std::unique_ptr Secondary) - : Primary(std::move(Primary)), Secondary(std::move(Secondary)) {} + : OwningPrimary(std::move(Primary)), Primary(OwningPrimary.get()), + Secondary(std::move(Secondary)) {} + + /// \brief Construct without taking ownership of \c Primary. + ChainedDiagnosticConsumer(DiagnosticConsumer *Primary, + std::unique_ptr Secondary) + : Primary(Primary), Secondary(std::move(Secondary)) {} void BeginSourceFile(const LangOptions &LO, const Preprocessor *PP) override { diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 366884ec77..2b7f1832aa 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -170,10 +170,14 @@ static void SetupSerializedDiagnostics(DiagnosticOptions *DiagOpts, auto SerializedConsumer = clang::serialized_diags::create(OutputFile, DiagOpts); - assert(Diags.ownsClient()); - Diags.setClient(new ChainedDiagnosticConsumer( - std::unique_ptr(Diags.takeClient()), - std::move(SerializedConsumer))); + if (Diags.ownsClient()) { + Diags.setClient(new ChainedDiagnosticConsumer( + std::unique_ptr(Diags.takeClient()), + std::move(SerializedConsumer))); + } else { + Diags.setClient(new ChainedDiagnosticConsumer( + Diags.takeClient(), std::move(SerializedConsumer))); + } } void CompilerInstance::createDiagnostics(DiagnosticConsumer *Client,