[clang] [clang-tools-extra] Fix OOM in FormatDiagnostic (PR #108187)

Vakhurin Sergei via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 12 06:31:31 PDT 2024


================
@@ -538,24 +511,51 @@ bool DiagnosticsEngine::EmitCurrentDiagnostic(bool Force) {
     Emitted = (DiagLevel != DiagnosticIDs::Ignored);
     if (Emitted) {
       // Emit the diagnostic regardless of suppression level.
-      Diags->EmitDiag(*this, DiagLevel);
+      Diags->EmitDiag(*this, DB, DiagLevel);
     }
   } else {
     // Process the diagnostic, sending the accumulated information to the
     // DiagnosticConsumer.
-    Emitted = ProcessDiag();
+    Emitted = ProcessDiag(DB);
   }
 
-  // Clear out the current diagnostic object.
-  Clear();
+  return Emitted;
+}
 
-  // If there was a delayed diagnostic, emit it now.
-  if (!Force && DelayedDiagID)
-    ReportDelayed();
+DiagnosticBuilder::DiagnosticBuilder(DiagnosticsEngine *diagObj,
+                                     SourceLocation CurDiagLoc,
+                                     unsigned CurDiagID)
+    : StreamingDiagnostic(diagObj->DiagAllocator), DiagObj(diagObj),
+      CurDiagLoc(CurDiagLoc), CurDiagID(CurDiagID), IsActive(true) {
+  assert(diagObj && "DiagnosticBuilder requires a valid DiagnosticsEngine!");
+}
 
-  return Emitted;
+DiagnosticBuilder::DiagnosticBuilder(const DiagnosticBuilder &D)
+    : StreamingDiagnostic() {
+  CurDiagLoc = D.CurDiagLoc;
+  CurDiagID = D.CurDiagID;
+  FlagValue = D.FlagValue;
+  DiagObj = D.DiagObj;
+  DiagStorage = D.DiagStorage;
+  D.DiagStorage = nullptr;
----------------
igelbox wrote:

> and be caught off-guard by the copy constructor mutating the original object

Yeah. But this is the original behavior (see the original "and neuters it" comment above the constructor declaration) even before my patch.

I'll try to declare it as a moving constructor.. and spend another hour to re-build the code.. soo slow and resource-demanding operation)

https://github.com/llvm/llvm-project/pull/108187


More information about the cfe-commits mailing list