diff options
-rw-r--r-- | clang/include/clang/Basic/Diagnostic.h | 11 | ||||
-rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 15 | ||||
-rw-r--r-- | clang/test/Misc/diag-mapping2.c | 19 | ||||
-rw-r--r-- | clang/tools/clang-cc/Warnings.cpp | 2 |
4 files changed, 44 insertions, 3 deletions
diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h index 1d071110bc2..99251709aa9 100644 --- a/clang/include/clang/Basic/Diagnostic.h +++ b/clang/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/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 19bfeeea72a..6b7f732b3f0 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/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/clang/test/Misc/diag-mapping2.c b/clang/test/Misc/diag-mapping2.c new file mode 100644 index 00000000000..7e0d7742a9f --- /dev/null +++ b/clang/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/clang/tools/clang-cc/Warnings.cpp b/clang/tools/clang-cc/Warnings.cpp index ccaa6533e1c..818e7743d87 100644 --- a/clang/tools/clang-cc/Warnings.cpp +++ b/clang/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; } |