]> granicus.if.org Git - clang/commitdiff
Support non-owned DiagnosticConsumer in SetupSerializedDiagnostics
authorAlexander Kornienko <alexfh@google.com>
Thu, 13 Nov 2014 13:08:27 +0000 (13:08 +0000)
committerAlexander Kornienko <alexfh@google.com>
Thu, 13 Nov 2014 13:08:27 +0000 (13:08 +0000)
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

include/clang/Frontend/ChainedDiagnosticConsumer.h
lib/Frontend/CompilerInstance.cpp

index 372b381cff690db43a2394eac5ff87d22bb884ea..eb33273c2fb3fa2b8c67ef7605683dafbd92acbd 100644 (file)
@@ -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 {
index 366884ec77588782e0f74ea976887c50c3962e2c..2b7f1832aa4178cddd883bcc444a9cc656027641 100644 (file)
@@ -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,