]> granicus.if.org Git - clang/commitdiff
Implement support for -w, which silences all warnings. PR2384.
authorChris Lattner <sabre@nondot.org>
Thu, 29 May 2008 15:36:45 +0000 (15:36 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 29 May 2008 15:36:45 +0000 (15:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51683 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/clang.cpp
include/clang/Basic/Diagnostic.h
lib/Basic/Diagnostic.cpp

index 21f1eb4f68fb19497ba203bc64595189a327ac44..714b03eca30745915a0bb21b6fc0bf56dad3f963 100644 (file)
@@ -461,6 +461,9 @@ void InitializeGCMode(LangOptions &Options) {
 static llvm::cl::opt<bool>
 WarningsAsErrors("Werror", llvm::cl::desc("Treat all warnings as errors"));
 
+static llvm::cl::opt<bool>
+SilenceWarnings("w", llvm::cl::desc("Do not emit any warnings"));
+
 static llvm::cl::opt<bool>
 WarnOnExtensions("pedantic", llvm::cl::init(false),
                  llvm::cl::desc("Issue a warning on uses of GCC extensions"));
@@ -492,6 +495,7 @@ WarnImplicitFunctionDeclaration("Wimplicit-function-declaration"
 /// InitializeDiagnostics - Initialize the diagnostic object, based on the
 /// current command line option settings.
 static void InitializeDiagnostics(Diagnostic &Diags) {
+  Diags.setIgnoreAllWarnings(SilenceWarnings);
   Diags.setWarningsAsErrors(WarningsAsErrors);
   Diags.setWarnOnExtensions(WarnOnExtensions);
   Diags.setErrorOnExtensions(ErrorOnExtensions);
index 4307955b2cf7c37ed2edc36558cbb184d886d11f..617702c7f9eba3625e881fb731b8a6332d7ed41e 100644 (file)
@@ -57,6 +57,7 @@ public:
   };
   
 private:  
+  bool IgnoreAllWarnings;     // Ignore all warnings: -w
   bool WarningsAsErrors;      // Treat warnings like errors: 
   bool WarnOnExtensions;      // Enables warnings for gcc extensions: -pedantic.
   bool ErrorOnExtensions;     // Error on extensions: -pedantic-errors.
@@ -87,6 +88,11 @@ public:
   
   const DiagnosticClient &getClient() const { return Client; };
 
+  /// 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; }
+  bool getIgnoreAllWarnings() const { return IgnoreAllWarnings; }
+  
   /// setWarningsAsErrors - When set to true, any warnings reported are issued
   /// as errors.
   void setWarningsAsErrors(bool Val) { WarningsAsErrors = Val; }
index 5835e75c1a7a8869043e384279a9379cbe4dc15c..fbf118f27578da653a6f7fb2852af37f7e2e7daa 100644 (file)
@@ -108,6 +108,7 @@ namespace clang {
 //===----------------------------------------------------------------------===//
 
 Diagnostic::Diagnostic(DiagnosticClient &client) : Client(client) {
+  IgnoreAllWarnings = false;
   WarningsAsErrors = false;
   WarnOnExtensions = false;
   ErrorOnExtensions = false;
@@ -167,7 +168,7 @@ Diagnostic::Level Diagnostic::getDiagnosticLevel(unsigned DiagID) const {
   if (DiagClass < ERROR) {
     switch (getDiagnosticMapping((diag::kind)DiagID)) {
     case diag::MAP_DEFAULT: break;
-    case diag::MAP_IGNORE:  return Ignored;
+    case diag::MAP_IGNORE:  return Diagnostic::Ignored;
     case diag::MAP_WARNING: DiagClass = WARNING; break;
     case diag::MAP_ERROR:   DiagClass = ERROR; break;
     }
@@ -183,9 +184,13 @@ Diagnostic::Level Diagnostic::getDiagnosticLevel(unsigned DiagID) const {
       return Ignored;
   }
   
-  // If warnings are to be treated as errors, indicate this as such.
-  if (DiagClass == WARNING && WarningsAsErrors)
-    DiagClass = ERROR;
+  // If warnings are globally mapped to ignore or error, do it.
+  if (DiagClass == WARNING) {
+    if (IgnoreAllWarnings)
+      return Diagnostic::Ignored;
+    if (WarningsAsErrors)
+      DiagClass = ERROR;
+  }
   
   switch (DiagClass) {
   default: assert(0 && "Unknown diagnostic class!");