diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index c23a3f6456fb7e1bef503737abf6df4e4713a532..c68826c38d5d84bc20f00aff1bd6e3425cc9c697 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -700,6 +700,9 @@ private: return Diags->ProcessDiag(*this); } + /// \brief Emit the current diagnostic and clear the diagnostic state. + bool EmitCurrentDiagnostic(); + friend class ASTReader; friend class ASTWriter; }; @@ -764,7 +767,11 @@ class DiagnosticBuilder { friend class PartialDiagnostic; protected: - void FlushCounts(); + void FlushCounts() { + DiagObj->NumDiagArgs = NumArgs; + DiagObj->NumDiagRanges = NumRanges; + DiagObj->NumDiagFixItHints = NumFixits; + } /// \brief Clear out the current diagnostic. void Clear() { DiagObj = 0; } @@ -792,7 +799,24 @@ protected: /// /// \returns true if a diagnostic was emitted, false if the /// diagnostic was suppressed. - bool Emit(); + bool Emit() { + // If DiagObj is null, then its soul was stolen by the copy ctor + // or the user called Emit(). + if (DiagObj == 0) return false; + + // When emitting diagnostics, we set the final argument count into + // the DiagnosticsEngine object. + FlushCounts(); + + // Process the diagnostic. + bool Result = DiagObj->EmitCurrentDiagnostic(); + + // This diagnostic is dead. + DiagObj = 0; + + return Result; + } + public: /// Copy constructor. When copied, this "takes" the diagnostic info from the @@ -808,8 +832,7 @@ public: /// Destructor - The dtor emits the diagnostic if it hasn't already /// been emitted. ~DiagnosticBuilder() { - if (DiagObj) - Emit(); + Emit(); } /// Operator bool: conversion of DiagnosticBuilder to bool always returns diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index a36f3ce38a172991deb3625c068d51c896936d9d..f7d5d87b367edddcab16597e8e1009d747ce0e34 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -385,35 +385,18 @@ void DiagnosticsEngine::Report(const StoredDiagnostic &storedDiag) { CurDiagID = ~0U; } -void DiagnosticBuilder::FlushCounts() { - DiagObj->NumDiagArgs = NumArgs; - DiagObj->NumDiagRanges = NumRanges; - DiagObj->NumDiagFixItHints = NumFixits; -} - -bool DiagnosticBuilder::Emit() { - // If DiagObj is null, then its soul was stolen by the copy ctor - // or the user called Emit(). - if (DiagObj == 0) return false; - - // When emitting diagnostics, we set the final argument count into - // the DiagnosticsEngine object. - FlushCounts(); - +bool DiagnosticsEngine::EmitCurrentDiagnostic() { // Process the diagnostic, sending the accumulated information to the // DiagnosticConsumer. - bool Emitted = DiagObj->ProcessDiag(); + bool Emitted = ProcessDiag(); // Clear out the current diagnostic object. - unsigned DiagID = DiagObj->CurDiagID; - DiagObj->Clear(); + unsigned DiagID = CurDiagID; + Clear(); // If there was a delayed diagnostic, emit it now. - if (DiagObj->DelayedDiagID && DiagObj->DelayedDiagID != DiagID) - DiagObj->ReportDelayed(); - - // This diagnostic is dead. - DiagObj = 0; + if (DelayedDiagID && DelayedDiagID != DiagID) + ReportDelayed(); return Emitted; }