summaryrefslogtreecommitdiff
path: root/gcc/diagnostic.c
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2007-02-20 10:18:58 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2007-02-20 10:18:58 +0000
commit4e2bae26bfa2eab9678a125a7701291fe3dd7153 (patch)
treefa32faad84393dfa336f79b8f5cfeab5bd3aad7b /gcc/diagnostic.c
parent6bdcc60c754f23ad4cdaa61df43ef5acb1c5465b (diff)
downloadgcc-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.c56
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))