diff options
author | Alexander Kornienko <alexfh@google.com> | 2014-11-13 13:08:27 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2014-11-13 13:08:27 +0000 |
commit | 254b7dba27abf991a99df4c4cc12fa88d9b3905f (patch) | |
tree | 7b6a54d42764e1ce18aeb53a20ce759ab0bef74f | |
parent | d5e95b57e033ee5bc91e2da3116879ef3a1a0581 (diff) | |
download | bcm5719-llvm-254b7dba27abf991a99df4c4cc12fa88d9b3905f.tar.gz bcm5719-llvm-254b7dba27abf991a99df4c4cc12fa88d9b3905f.zip |
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!
llvm-svn: 221884
-rw-r--r-- | clang/include/clang/Frontend/ChainedDiagnosticConsumer.h | 11 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 12 |
2 files changed, 17 insertions, 6 deletions
diff --git a/clang/include/clang/Frontend/ChainedDiagnosticConsumer.h b/clang/include/clang/Frontend/ChainedDiagnosticConsumer.h index 372b381cff6..eb33273c2fb 100644 --- a/clang/include/clang/Frontend/ChainedDiagnosticConsumer.h +++ b/clang/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<DiagnosticConsumer> Primary; + std::unique_ptr<DiagnosticConsumer> OwningPrimary; + DiagnosticConsumer *Primary; std::unique_ptr<DiagnosticConsumer> Secondary; public: ChainedDiagnosticConsumer(std::unique_ptr<DiagnosticConsumer> Primary, std::unique_ptr<DiagnosticConsumer> 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<DiagnosticConsumer> Secondary) + : Primary(Primary), Secondary(std::move(Secondary)) {} void BeginSourceFile(const LangOptions &LO, const Preprocessor *PP) override { diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index 366884ec775..2b7f1832aa4 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/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<DiagnosticConsumer>(Diags.takeClient()), - std::move(SerializedConsumer))); + if (Diags.ownsClient()) { + Diags.setClient(new ChainedDiagnosticConsumer( + std::unique_ptr<DiagnosticConsumer>(Diags.takeClient()), + std::move(SerializedConsumer))); + } else { + Diags.setClient(new ChainedDiagnosticConsumer( + Diags.takeClient(), std::move(SerializedConsumer))); + } } void CompilerInstance::createDiagnostics(DiagnosticConsumer *Client, |