From 3f8b9166989709d1d893524f5590f8064e824554 Mon Sep 17 00:00:00 2001 From: James Y Knight Date: Tue, 29 Jan 2019 19:33:48 +0000 Subject: [PATCH] Fix the behavior of clang's -w flag. It is intended to disable _all_ warnings, even those upgraded to errors via `-Werror=warningname` or `#pragma clang diagnostic error' Fixes: https://llvm.org/PR38231 Differential Revision: https://reviews.llvm.org/D53199 llvm-svn: 352535 --- clang/lib/Basic/DiagnosticIDs.cpp | 17 +++++++++++------ clang/test/Frontend/optimization-remark.c | 3 +++ clang/test/Frontend/warning-mapping-2.c | 6 ++++-- clang/test/Frontend/warning-mapping-4.c | 4 ++++ clang/test/Frontend/warning-mapping-5.c | 5 ++--- clang/test/Frontend/warning-mapping-6.c | 9 +++++++++ clang/test/Modules/implementation-of-module.m | 10 +++++----- 7 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 clang/test/Frontend/warning-mapping-6.c diff --git a/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp index e8bb10f..a7473d8 100644 --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/lib/Basic/DiagnosticIDs.cpp @@ -456,12 +456,17 @@ DiagnosticIDs::getDiagnosticSeverity(unsigned DiagID, SourceLocation Loc, if (Result == diag::Severity::Ignored) return Result; - // Honor -w, which is lower in priority than pedantic-errors, but higher than - // -Werror. - // FIXME: Under GCC, this also suppresses warnings that have been mapped to - // errors by -W flags and #pragma diagnostic. - if (Result == diag::Severity::Warning && State->IgnoreAllWarnings) - return diag::Severity::Ignored; + // Honor -w: this disables all messages which which are not Error/Fatal by + // default (disregarding attempts to upgrade severity from Warning to Error), + // as well as disabling all messages which are currently mapped to Warning + // (whether by default or downgraded from Error via e.g. -Wno-error or #pragma + // diagnostic.) + if (State->IgnoreAllWarnings) { + if (Result == diag::Severity::Warning || + (Result >= diag::Severity::Error && + !isDefaultMappingAsError((diag::kind)DiagID))) + return diag::Severity::Ignored; + } // If -Werror is enabled, map warnings to errors unless explicitly disabled. if (Result == diag::Severity::Warning) { diff --git a/clang/test/Frontend/optimization-remark.c b/clang/test/Frontend/optimization-remark.c index 29eaa03..234958d 100644 --- a/clang/test/Frontend/optimization-remark.c +++ b/clang/test/Frontend/optimization-remark.c @@ -13,6 +13,9 @@ // RUN: %clang_cc1 %s -Rpass=inline -Rno-everything -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-NO-REMARKS // RUN: %clang_cc1 %s -Rpass=inline -Rno-everything -Reverything -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-REMARKS // +// Check that -w doesn't disable remarks. +// RUN: %clang_cc1 %s -Rpass=inline -w -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-REMARKS +// // FIXME: -Reverything should imply -Rpass=.*. // RUN: %clang_cc1 %s -Reverything -emit-llvm -o - 2>/dev/null | FileCheck %s --check-prefix=CHECK-NO-REMARKS // diff --git a/clang/test/Frontend/warning-mapping-2.c b/clang/test/Frontend/warning-mapping-2.c index 39ba499..4f7f1ee 100644 --- a/clang/test/Frontend/warning-mapping-2.c +++ b/clang/test/Frontend/warning-mapping-2.c @@ -1,5 +1,7 @@ -// Check that -w has lower priority than -pedantic-errors. +// Check that -w takes precedence over -pedantic-errors. // RUN: %clang_cc1 -verify -pedantic-errors -w %s -void f0() { f1(); } // expected-error {{implicit declaration of function}} +// Expect *not* to see a diagnostic for "implicit declaration of function" +// expected-no-diagnostics +void f0() { f1(); } diff --git a/clang/test/Frontend/warning-mapping-4.c b/clang/test/Frontend/warning-mapping-4.c index 6644042..a981363 100644 --- a/clang/test/Frontend/warning-mapping-4.c +++ b/clang/test/Frontend/warning-mapping-4.c @@ -1,5 +1,9 @@ +// Verify that various combinations of flags properly keep the sign-compare +// warning disabled. + // RUN: %clang_cc1 -verify -Wno-error=sign-compare %s // RUN: %clang_cc1 -verify -Wsign-compare -w -Wno-error=sign-compare %s +// RUN: %clang_cc1 -verify -w -Werror=sign-compare %s // expected-no-diagnostics int f0(int x, unsigned y) { diff --git a/clang/test/Frontend/warning-mapping-5.c b/clang/test/Frontend/warning-mapping-5.c index 27d53dc..84efd80 100644 --- a/clang/test/Frontend/warning-mapping-5.c +++ b/clang/test/Frontend/warning-mapping-5.c @@ -1,6 +1,5 @@ -// Check that #pragma diagnostic warning overrides -Werror. This matches GCC's -// original documentation, but not its earlier implementations. -// +// Check that #pragma diagnostic warning overrides -Werror. +// // RUN: %clang_cc1 -verify -Werror %s #pragma clang diagnostic warning "-Wsign-compare" diff --git a/clang/test/Frontend/warning-mapping-6.c b/clang/test/Frontend/warning-mapping-6.c new file mode 100644 index 0000000..ea22f72 --- /dev/null +++ b/clang/test/Frontend/warning-mapping-6.c @@ -0,0 +1,9 @@ +// Check that "#pragma diagnostic error" is suppressed by -w. +// +// RUN: %clang_cc1 -verify -Werror -w %s + +// expected-no-diagnostics +#pragma gcc diagnostic error "-Wsign-compare" +int f0(int x, unsigned y) { + return x < y; +} diff --git a/clang/test/Modules/implementation-of-module.m b/clang/test/Modules/implementation-of-module.m index 712f12c5..140d144 100644 --- a/clang/test/Modules/implementation-of-module.m +++ b/clang/test/Modules/implementation-of-module.m @@ -1,17 +1,17 @@ // RUN: rm -rf %t -// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -w -Werror=auto-import %s -I %S/Inputs \ +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=auto-import %s -I %S/Inputs \ // RUN: -fmodule-implementation-of category_right -fsyntax-only -// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -w -Werror=auto-import %s -I %S/Inputs \ +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=auto-import %s -I %S/Inputs \ // RUN: -fmodule-implementation-of category_right -dM -E -o - 2>&1 | FileCheck %s // CHECK-NOT: __building_module -// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -w -Werror=auto-import %s -I %S/Inputs \ +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=auto-import %s -I %S/Inputs \ // RUN: -fmodule-implementation-of category_left -verify -// RUN: %clang_cc1 -x objective-c-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -w -Werror=auto-import %s -I %S/Inputs \ +// RUN: %clang_cc1 -x objective-c-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=auto-import %s -I %S/Inputs \ // RUN: -fmodule-implementation-of category_right -emit-pch -o %t.pch -// RUN: %clang_cc1 -x objective-c-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -w -Werror=auto-import %s -I %S/Inputs \ +// RUN: %clang_cc1 -x objective-c-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Werror=auto-import %s -I %S/Inputs \ // RUN: -DWITH_PREFIX -fmodules-ignore-macro=WITH_PREFIX -include-pch %t.pch -fmodule-implementation-of category_right #ifndef WITH_PREFIX -- 2.7.4