]> granicus.if.org Git - clang/commitdiff
add clang -cc1 level support for "-ferror-limit 42"
authorChris Lattner <sabre@nondot.org>
Wed, 7 Apr 2010 20:37:06 +0000 (20:37 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 7 Apr 2010 20:37:06 +0000 (20:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100687 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/Diagnostic.h
include/clang/Driver/CC1Options.td
include/clang/Frontend/DiagnosticOptions.h
lib/Basic/Diagnostic.cpp
lib/Frontend/CompilerInvocation.cpp
lib/Frontend/Warnings.cpp

index 8eb68a396a3d4358e87638b5bf9093384bd420b1..e088965996052e7033fe384b5be9fd991d7a32eb 100644 (file)
@@ -188,7 +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.
+  unsigned ErrorLimit;           // Cap of # errors emitted, 0 -> no limit.
   ExtensionHandling ExtBehavior; // Map extensions onto warnings or errors?
   DiagnosticClient *Client;
 
@@ -271,9 +271,9 @@ public:
 
   void setClient(DiagnosticClient* client) { Client = client; }
 
-  /// setMaxErrorsEmitted - Specify a limit for the number of errors we should
+  /// setErrorLimit - Specify a limit for the number of errors we should
   /// emit before giving up.  Zero disables the limit.
-  void setMaxErrorsEmitted(unsigned Limit) { MaxErrorsEmitted = Limit; }
+  void setErrorLimit(unsigned Limit) { ErrorLimit = Limit; }
   
   /// setIgnoreAllWarnings - When set to true, any unmapped warnings are
   /// ignored.  If this and WarningsAsErrors are both set, then this one wins.
index 124288a76305c55ade8802bd912a0777902b908c..93cf495b52891e323398c0443fa63dc940424e64 100644 (file)
@@ -192,6 +192,8 @@ def fdiagnostics_show_option : Flag<"-fdiagnostics-show-option">,
   HelpText<"Print diagnostic name with mappable diagnostics">;
 def ftabstop : Separate<"-ftabstop">, MetaVarName<"<N>">,
   HelpText<"Set the tab stop distance.">;
+def ferror_limit : Separate<"-ferror-limit">, MetaVarName<"<N>">,
+  HelpText<"Set the maximum number of errors to emit before stopping (0 = no limit).">;
 def fmessage_length : Separate<"-fmessage-length">, MetaVarName<"<N>">,
   HelpText<"Format message diagnostics so that they fit within N columns or fewer, when possible.">;
 def fcolor_diagnostics : Flag<"-fcolor-diagnostics">,
index b37c18057f0fd5f70229e6a91eec25238a8cd425..d8ec14f9a3f7175b973a5fb7eccd4c422d7eb8a5 100644 (file)
@@ -38,6 +38,8 @@ public:
                                  /// binary serialization mechanism, to be
                                  /// deserialized by, e.g., the CIndex library.
 
+  unsigned ErrorLimit;           /// Limit # errors emitted.
+  
   /// The distance between tab stops.
   unsigned TabStop;
   enum { DefaultTabStop = 8, MaxTabStop = 100 };
@@ -70,6 +72,7 @@ public:
     ShowSourceRanges = 0;
     VerifyDiagnostics = 0;
     BinaryOutput = 0;
+    ErrorLimit = 0;
   }
 };
 
index 388875cf631a46fe321fc66fec35c8d937f21309..738c27ccae761425a7b502d885518ec956d9f17f 100644 (file)
@@ -223,7 +223,7 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) {
 
   ErrorOccurred = false;
   FatalErrorOccurred = false;
-  MaxErrorsEmitted = 0;
+  ErrorLimit = 0;
   
   NumWarnings = 0;
   NumErrors = 0;
@@ -555,7 +555,7 @@ bool Diagnostic::ProcessDiag() {
     
     // 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 &&
+    if (ErrorLimit && NumErrors >= ErrorLimit &&
         DiagLevel == Diagnostic::Error)
       SetDelayedDiagnostic(diag::fatal_too_many_errors);
   }
index dc2c6bf3614aec3f8d3b44ccebabfcc99a650ae8..b9afcb5cfa6030f0655b27ab70178fd5ab4dca7d 100644 (file)
@@ -232,6 +232,10 @@ static void DiagnosticOptsToArgs(const DiagnosticOptions &Opts,
     Res.push_back("-fdiagnostics-binary");
   if (Opts.ShowOptionNames)
     Res.push_back("-fdiagnostics-show-option");
+  if (Opts.ErrorLimit) {
+    Res.push_back("-ferror-limit");
+    Res.push_back(llvm::utostr(Opts.ErrorLimit));
+  }
   if (Opts.TabStop != DiagnosticOptions::DefaultTabStop) {
     Res.push_back("-ftabstop");
     Res.push_back(llvm::utostr(Opts.TabStop));
@@ -830,6 +834,7 @@ static void ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
   Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);
   Opts.VerifyDiagnostics = Args.hasArg(OPT_verify);
   Opts.BinaryOutput = Args.hasArg(OPT_fdiagnostics_binary);
+  Opts.ErrorLimit = getLastArgIntValue(Args, OPT_ferror_limit, 0, Diags);
   Opts.TabStop = getLastArgIntValue(Args, OPT_ftabstop,
                                     DiagnosticOptions::DefaultTabStop, Diags);
   if (Opts.TabStop == 0 || Opts.TabStop > DiagnosticOptions::MaxTabStop) {
index ea9635e79849a3e298e447c6dc3c0cba06664746..39cda8783b48e673aba9212712c621dfaff656c7 100644 (file)
@@ -35,6 +35,10 @@ void clang::ProcessWarningOptions(Diagnostic &Diags,
                                   const DiagnosticOptions &Opts) {
   Diags.setSuppressSystemWarnings(true);  // Default to -Wno-system-headers
   Diags.setIgnoreAllWarnings(Opts.IgnoreWarnings);
+  
+  // Handle -ferror-limit
+  if (Opts.ErrorLimit)
+    Diags.setErrorLimit(Opts.ErrorLimit);
 
   // If -pedantic or -pedantic-errors was specified, then we want to map all
   // extension diagnostics onto WARNING or ERROR unless the user has futz'd