diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2007-02-20 10:18:58 +0000 |
---|---|---|
committer | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2007-02-20 10:18:58 +0000 |
commit | 4e2bae26bfa2eab9678a125a7701291fe3dd7153 (patch) | |
tree | fa32faad84393dfa336f79b8f5cfeab5bd3aad7b /gcc/diagnostic.c | |
parent | 6bdcc60c754f23ad4cdaa61df43ef5acb1c5465b (diff) | |
download | gcc-4e2bae26bfa2eab9678a125a7701291fe3dd7153.tar.gz |
re PR other/30824 (-Werror -Wfatal-errors should stop after the first warning)
2007-02-20 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
DJ Delorie <dj@redhat.com>
PR other/30824
* diagnostic.c (diagnostic_count_diagnostic): Move -Werror
logic to...
(diagnostic_report_diagnostic): ... here, and turn them into
real errors. If warnings are inhibited, no need to do
anything.
testsuite/
* gcc.dg/Wfatal.c: New.
* gcc.dg/Wfatal-2.c: New.
* gcc.dg/Werror-1.c: Adjust expectations.
* gcc.dg/Werror-5.c: Likewise.
* gcc.dg/Werror-7.c: Likewise.
* gcc.dg/Werror-10.c: Likewise.
* gcc.dg/Werror-11.c: Likewise.
Co-Authored-By: DJ Delorie <dj@redhat.com>
From-SVN: r122159
Diffstat (limited to 'gcc/diagnostic.c')
-rw-r--r-- | gcc/diagnostic.c | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index 3691477e07b..2199c7d24db 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -202,27 +202,9 @@ diagnostic_count_diagnostic (diagnostic_context *context, break; case DK_WARNING: - if (!diagnostic_report_warnings_p ()) - return false; - - /* -Werror can reclassify warnings as errors, but - classify_diagnostic can reclassify it back to a warning. The - second part of this test detects that case. */ - if (!context->warning_as_error_requested - || (context->classify_diagnostic[diagnostic->option_index] - == DK_WARNING)) - { - ++diagnostic_kind_count (context, DK_WARNING); - break; - } - else if (context->issue_warnings_are_errors_message) - { - pp_verbatim (context->printer, - "%s: warnings being treated as errors\n", progname); - context->issue_warnings_are_errors_message = false; - } + ++diagnostic_kind_count (context, DK_WARNING); + break; - /* And fall through. */ case DK_ERROR: ++diagnostic_kind_count (context, DK_ERROR); break; @@ -362,6 +344,14 @@ void diagnostic_report_diagnostic (diagnostic_context *context, diagnostic_info *diagnostic) { + bool maybe_print_warnings_as_errors_message = false; + + /* Give preference to being able to inhibit warnings, before they + get reclassified to something else. */ + if (diagnostic->kind == DK_WARNING + && !diagnostic_report_warnings_p ()) + return; + if (context->lock > 0) { /* If we're reporting an ICE in the middle of some other error, @@ -373,6 +363,17 @@ diagnostic_report_diagnostic (diagnostic_context *context, error_recursion (context); } + /* If the user requested that warnings be treated as errors, so be + it. Note that we do this before the next block so that + individual warnings can be overridden back to warnings with + -Wno-error=*. */ + if (context->warning_as_error_requested + && diagnostic->kind == DK_WARNING) + { + diagnostic->kind = DK_ERROR; + maybe_print_warnings_as_errors_message = true; + } + if (diagnostic->option_index) { /* This tests if the user provided the appropriate -Wfoo or @@ -382,13 +383,26 @@ diagnostic_report_diagnostic (diagnostic_context *context, /* This tests if the user provided the appropriate -Werror=foo option. */ if (context->classify_diagnostic[diagnostic->option_index] != DK_UNSPECIFIED) - diagnostic->kind = context->classify_diagnostic[diagnostic->option_index]; + { + diagnostic->kind = context->classify_diagnostic[diagnostic->option_index]; + maybe_print_warnings_as_errors_message = false; + } /* This allows for future extensions, like temporarily disabling warnings for ranges of source code. */ if (diagnostic->kind == DK_IGNORED) return; } + /* If we changed the kind due to -Werror, and didn't override it, we + need to print this message. */ + if (context->issue_warnings_are_errors_message + && maybe_print_warnings_as_errors_message) + { + pp_verbatim (context->printer, + "%s: warnings being treated as errors\n", progname); + context->issue_warnings_are_errors_message = false; + } + context->lock++; if (diagnostic_count_diagnostic (context, diagnostic)) |