]> granicus.if.org Git - clang/commitdiff
add capabilities to stop emitting errors after some limit.
authorChris Lattner <sabre@nondot.org>
Wed, 7 Apr 2010 20:21:58 +0000 (20:21 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 7 Apr 2010 20:21:58 +0000 (20:21 +0000)
Right now the limit is 0 (aka disabled)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100684 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/Diagnostic.h
include/clang/Basic/DiagnosticCommonKinds.td
lib/Basic/Diagnostic.cpp

index 9279871997ccbab20f22f7170a0b45f8760509a4..8eb68a396a3d4358e87638b5bf9093384bd420b1 100644 (file)
@@ -188,6 +188,7 @@ private:
   bool ErrorsAsFatal;            // Treat errors like fatal errors.
   bool SuppressSystemWarnings;   // Suppress warnings in system headers.
   bool SuppressAllDiagnostics;   // Suppress all diagnostics.
+  unsigned MaxErrorsEmitted;     // Cap of # errors emitted, 0 -> no limit.
   ExtensionHandling ExtBehavior; // Map extensions onto warnings or errors?
   DiagnosticClient *Client;
 
@@ -270,6 +271,10 @@ public:
 
   void setClient(DiagnosticClient* client) { Client = client; }
 
+  /// setMaxErrorsEmitted - Specify a limit for the number of errors we should
+  /// emit before giving up.  Zero disables the limit.
+  void setMaxErrorsEmitted(unsigned Limit) { MaxErrorsEmitted = Limit; }
+  
   /// setIgnoreAllWarnings - When set to true, any unmapped warnings are
   /// ignored.  If this and WarningsAsErrors are both set, then this one wins.
   void setIgnoreAllWarnings(bool Val) { IgnoreAllWarnings = Val; }
index 8e791c3422fc3e8697466ca6ed701e1600f01dc8..1402e96ce08a53f77e740bb712731ac708dca607 100644 (file)
 
 let Component = "Common" in {
 
+// Basic.
+
+def fatal_too_many_errors
+  : Error<"too many errors emitted, stopping now">, DefaultFatal; 
+
 def note_previous_definition : Note<"previous definition is here">;
 def note_previous_declaration : Note<"previous declaration is here">;
 def note_previous_implicit_declaration : Note<
index a1094ad95cafc2c7076fa308225e8b346e5baf66..388875cf631a46fe321fc66fec35c8d937f21309 100644 (file)
@@ -223,6 +223,7 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) {
 
   ErrorOccurred = false;
   FatalErrorOccurred = false;
+  MaxErrorsEmitted = 0;
   
   NumWarnings = 0;
   NumErrors = 0;
@@ -551,6 +552,12 @@ bool Diagnostic::ProcessDiag() {
   if (DiagLevel >= Diagnostic::Error) {
     ErrorOccurred = true;
     ++NumErrors;
+    
+    // If we've emitted a lot of errors, emit a fatal error after it to stop a
+    // flood of bogus errors.
+    if (MaxErrorsEmitted && NumErrors >= MaxErrorsEmitted &&
+        DiagLevel == Diagnostic::Error)
+      SetDelayedDiagnostic(diag::fatal_too_many_errors);
   }
 
   // Finally, report it.