From 1e473ccb0e0f6fd1954bef330f7193c1a3fb3ba1 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 18 Aug 2011 01:12:56 +0000 Subject: [PATCH] Implement '-Weverything', which enables all warnings except those explicitly mapped to be ignored. Currently this includes -pedantic warnings as well; we'll need to consider whether these should be included. This works as expected with -Werror. Test cases were added to Sema/warn-unused-parameters.c, but they should probably be broken off into their own test file. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137910 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/Diagnostic.h | 9 ++++++++- lib/Basic/Diagnostic.cpp | 1 + lib/Basic/DiagnosticIDs.cpp | 27 ++++++++++++++++++++------- lib/Frontend/Warnings.cpp | 7 +++++++ test/Sema/warn-unused-parameters.c | 10 +++++++++- 5 files changed, 45 insertions(+), 9 deletions(-) diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index 8cc1771f4f..c02654b2c7 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -149,7 +149,8 @@ public: private: unsigned char AllExtensionsSilenced; // Used by __extension__ bool IgnoreAllWarnings; // Ignore all warnings: -w - bool WarningsAsErrors; // Treat warnings like errors: + bool WarningsAsErrors; // Treat warnings like errors. + bool EnableAllWarnings; // Enable all warnings. bool ErrorsAsFatal; // Treat errors like fatal errors. bool SuppressSystemWarnings; // Suppress warnings in system headers. bool SuppressAllDiagnostics; // Suppress all diagnostics. @@ -370,6 +371,12 @@ public: void setIgnoreAllWarnings(bool Val) { IgnoreAllWarnings = Val; } bool getIgnoreAllWarnings() const { return IgnoreAllWarnings; } + /// setEnableAllWarnings - When set to true, any unmapped ignored warnings + /// are no longer ignored. If this and IgnoreAllWarnings are both set, + /// then that one wins. + void setEnableAllWarnings(bool Val) { EnableAllWarnings = Val; } + bool getEnableAllWarnngs() const { return EnableAllWarnings; } + /// setWarningsAsErrors - When set to true, any warnings reported are issued /// as errors. void setWarningsAsErrors(bool Val) { WarningsAsErrors = Val; } diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index b82b062a72..0e4159db8d 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -43,6 +43,7 @@ Diagnostic::Diagnostic(const llvm::IntrusiveRefCntPtr &diags, AllExtensionsSilenced = 0; IgnoreAllWarnings = false; WarningsAsErrors = false; + EnableAllWarnings = false; ErrorsAsFatal = false; SuppressSystemWarnings = false; SuppressAllDiagnostics = false; diff --git a/lib/Basic/DiagnosticIDs.cpp b/lib/Basic/DiagnosticIDs.cpp index fa397c9ac9..ace92aceb4 100644 --- a/lib/Basic/DiagnosticIDs.cpp +++ b/lib/Basic/DiagnosticIDs.cpp @@ -496,14 +496,27 @@ DiagnosticIDs::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass, switch (MappingInfo & 7) { default: assert(0 && "Unknown mapping!"); case diag::MAP_IGNORE: - // Ignore this, unless this is an extension diagnostic and we're mapping - // them onto warnings or errors. - if (!isBuiltinExtensionDiag(DiagID) || // Not an extension - Diag.ExtBehavior == Diagnostic::Ext_Ignore || // Ext ignored - (MappingInfo & 8) != 0) // User explicitly mapped it. + if (Diag.EnableAllWarnings) { + // Leave the warning disabled if it was explicitly ignored. + if ((MappingInfo & 8) != 0) + return DiagnosticIDs::Ignored; + + Result = Diag.WarningsAsErrors ? DiagnosticIDs::Error + : DiagnosticIDs::Warning; + } + // Otherwise, ignore this diagnostic unless this is an extension diagnostic + // and we're mapping them onto warnings or errors. + else if (!isBuiltinExtensionDiag(DiagID) || // Not an extension + Diag.ExtBehavior == Diagnostic::Ext_Ignore || // Ext ignored + (MappingInfo & 8) != 0) { // User explicitly mapped it. return DiagnosticIDs::Ignored; - Result = DiagnosticIDs::Warning; - if (Diag.ExtBehavior == Diagnostic::Ext_Error) Result = DiagnosticIDs::Error; + } + else { + Result = DiagnosticIDs::Warning; + } + + if (Diag.ExtBehavior == Diagnostic::Ext_Error) + Result = DiagnosticIDs::Error; if (Result == DiagnosticIDs::Error && Diag.ErrorsAsFatal) Result = DiagnosticIDs::Fatal; break; diff --git a/lib/Frontend/Warnings.cpp b/lib/Frontend/Warnings.cpp index 215f8f8b22..d24779e1a9 100644 --- a/lib/Frontend/Warnings.cpp +++ b/lib/Frontend/Warnings.cpp @@ -98,6 +98,13 @@ void clang::ProcessWarningOptions(Diagnostic &Diags, Mapping = isPositive ? diag::MAP_ERROR : diag::MAP_WARNING_NO_WERROR; Opt = Specifier; } + + // -Weverything is a special case as well. It implicitly enables all + // warnings, including ones not explicitly in a warning group. + if (Opt == "everything") { + Diags.setEnableAllWarnings(true); + continue; + } // -Wfatal-errors is yet another special case. if (Opt.startswith("fatal-errors")) { diff --git a/test/Sema/warn-unused-parameters.c b/test/Sema/warn-unused-parameters.c index e47ddd5e00..af048e77e8 100644 --- a/test/Sema/warn-unused-parameters.c +++ b/test/Sema/warn-unused-parameters.c @@ -19,4 +19,12 @@ static void achor() {}; // CHECK: 5:12: warning: unused parameter 'y' // CHECK: 12:15: warning: unused parameter 'y' -// CHECK-unused: 1 warning generated \ No newline at end of file +// CHECK-unused: 1 warning generated + +// RUN: %clang_cc1 -fblocks -fsyntax-only -Weverything %s 2>&1 | FileCheck -check-prefix=CHECK-everything %s +// RUN: %clang_cc1 -fblocks -fsyntax-only -Weverything -Werror %s 2>&1 | FileCheck -check-prefix=CHECK-everything-error %s +// RUN: %clang_cc1 -fblocks -fsyntax-only -Weverything -Wno-unused %s 2>&1 | FileCheck -check-prefix=CHECK-everything-no-unused %s +// CHECK-everything: 6 warnings generated +// CHECK-everything-error: 5 errors generated +// CHECK-everything-no-unused: 5 warnings generated + -- 2.40.0