Index: include/clang/Basic/Diagnostic.h =================================================================== --- include/clang/Basic/Diagnostic.h +++ include/clang/Basic/Diagnostic.h @@ -1055,6 +1055,9 @@ // Emit() would end up with if we used that as our status variable. mutable bool IsActive = false; + /// Flag indicating an active dummy builder that will not emit anything. + mutable bool IsDummy = false; + /// Flag indicating that this diagnostic is being emitted via a /// call to ForceEmit. mutable bool IsForceEmit = false; @@ -1077,6 +1080,7 @@ void Clear() const { DiagObj = nullptr; IsActive = false; + IsDummy = false; IsForceEmit = false; } @@ -1095,6 +1099,12 @@ // (or by a subclass, as in SemaDiagnosticBuilder). if (!isActive()) return false; + if (IsDummy) { + DiagObj->Clear(); + Clear(); + return false; + } + // When emitting diagnostics, we set the final argument count into // the DiagnosticsEngine object. FlushCounts(); @@ -1114,6 +1124,7 @@ DiagnosticBuilder(const DiagnosticBuilder &D) { DiagObj = D.DiagObj; IsActive = D.IsActive; + IsDummy = D.IsDummy; IsForceEmit = D.IsForceEmit; D.Clear(); NumArgs = D.NumArgs; @@ -1131,6 +1142,13 @@ return {}; } + /// Retrieve an active diagnostic builder that will not emit anything. + static DiagnosticBuilder getDummy(DiagnosticsEngine *diagObj) { + DiagnosticBuilder D(diagObj); + D.IsDummy = true; + return D; + } + /// Forces the diagnostic to be emitted. const DiagnosticBuilder &setForceEmit() const { IsForceEmit = true;