From: Chris Lattner Date: Thu, 16 Apr 2009 04:32:54 +0000 (+0000) Subject: arrange for -Wno-error=foo warnings to be immune to -Werror as X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2b07d8fe9e8a8ba12d64066632e17a9a5308a12e;p=clang arrange for -Wno-error=foo warnings to be immune to -Werror as they are supposed to be. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69265 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index 1d071110bc..99251709aa 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -65,7 +65,16 @@ namespace clang { MAP_IGNORE = 1, //< Map this diagnostic to nothing, ignore it. MAP_WARNING = 2, //< Map this diagnostic to a warning. MAP_ERROR = 3, //< Map this diagnostic to an error. - MAP_FATAL = 4 //< Map this diagnostic to a fatal error. + MAP_FATAL = 4, //< Map this diagnostic to a fatal error. + + /// Map this diagnostic to "warning", but make it immune to + /// -pedantic-errors. This happens when you specify -Wfoo for an + /// extension warning. + MAP_WARNING_NO_PEDANTIC_ERROR = 5, + + /// Map this diagnostic to "warning", but make it immune to -Werror and + /// -pedantic-errors. This happens when you specify -Wno-error=foo. + MAP_WARNING_NO_WERROR = 6 }; } diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp index 19bfeeea72..6b7f732b3f 100644 --- a/lib/Basic/Diagnostic.cpp +++ b/lib/Basic/Diagnostic.cpp @@ -382,7 +382,20 @@ Diagnostic::getDiagnosticLevel(unsigned DiagID, unsigned DiagClass) const { // If warnings are globally mapped to ignore or error, do it. if (IgnoreAllWarnings) return Diagnostic::Ignored; - Result = WarningsAsErrors ? Diagnostic::Error : Diagnostic::Warning; + + Result = Diagnostic::Warning; + if (WarningsAsErrors) + Result = Diagnostic::Error; + break; + case diag::MAP_WARNING_NO_WERROR: + // Diagnostics specified with -Wno-error=foo should be set to warnings, but + // not be adjusted by -Werror or -pedantic-errors. + Result = Diagnostic::Warning; + + // If warnings are globally mapped to ignore or error, do it. + if (IgnoreAllWarnings) + return Diagnostic::Ignored; + break; } diff --git a/test/Misc/diag-mapping2.c b/test/Misc/diag-mapping2.c new file mode 100644 index 0000000000..7e0d7742a9 --- /dev/null +++ b/test/Misc/diag-mapping2.c @@ -0,0 +1,19 @@ +// This should warn by default. +// RUN: clang-cc %s 2>&1 | grep "warning:" && + +// This should not emit anything. +// RUN: clang-cc %s -w 2>&1 | not grep diagnostic && +// RUN: clang-cc %s -Wno-#warnings 2>&1 | not grep diagnostic && + +// -Werror can map all warnings to error. +// RUN: clang-cc %s -Werror 2>&1 | grep "error:" && + +// -Werror can map this one warning to error. +// RUN: clang-cc %s -Werror=#warnings 2>&1 | grep "error:" && + +// -Wno-error= overrides -Werror. rdar://3158301 +// RUN: clang-cc %s -Werror -Wno-error=#warnings 2>&1 | grep "warning:" + +#warning foo + + diff --git a/tools/clang-cc/Warnings.cpp b/tools/clang-cc/Warnings.cpp index ccaa6533e1..818e7743d8 100644 --- a/tools/clang-cc/Warnings.cpp +++ b/tools/clang-cc/Warnings.cpp @@ -138,7 +138,7 @@ bool clang::ProcessWarningOptions(Diagnostic &Diags) { } // -Werror=foo maps foo to Error, -Wno-error=foo maps it to Warning. - Mapping = isPositive ? diag::MAP_ERROR : diag::MAP_WARNING; + Mapping = isPositive ? diag::MAP_ERROR : diag::MAP_WARNING_NO_WERROR; OptStart = Specifier; }