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
This commit is contained in:
Manuel López-Ibáñez 2007-02-20 10:18:58 +00:00
parent 6bdcc60c75
commit 4e2bae26bf
10 changed files with 81 additions and 27 deletions

View File

@ -1,3 +1,11 @@
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.
2007-02-20 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (expm1xf2): Reorder insn sequence for

View File

@ -202,27 +202,9 @@ diagnostic_count_diagnostic (diagnostic_context *context,
break;
case DK_WARNING:
if (!diagnostic_report_warnings_p ())
return false;
++diagnostic_kind_count (context, DK_WARNING);
break;
/* -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;
}
/* 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))

View File

@ -1,3 +1,15 @@
2007-02-20 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
DJ Delorie <dj@redhat.com>
PR other/30824
* 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.
2007-02-20 Tobias Burnus <burnus@net-b.de>
PR fortran/30522

View File

@ -9,7 +9,7 @@
#pragma GCC diagnostic error "-Waddress"
void __attribute__((dj)) bar() { } /* { dg-warning "warning: .* attribute directive ignored" } */
void __attribute__((dj)) bar() { } /* { dg-error "error: .* attribute directive ignored" } */
int i;

View File

@ -6,7 +6,7 @@
#pragma GCC diagnostic error "-Waddress"
void __attribute__((dj)) bar() { } /* { dg-warning "warning: .* attribute directive ignored" } */
void __attribute__((dj)) bar() { } /* { dg-error "error: .* attribute directive ignored" } */
int i;

View File

@ -6,7 +6,7 @@
#pragma GCC diagnostic warning "-Waddress"
void __attribute__((dj)) bar() { } /* { dg-warning "warning: .* attribute directive ignored" } */
void __attribute__((dj)) bar() { } /* { dg-error "error: .* attribute directive ignored" } */
int i;

View File

@ -4,13 +4,13 @@
/* Make sure -Werror turns warnings in to errors. */
void __attribute__((dj)) bar() { } /* { dg-warning "warning: .* attribute directive ignored" } */
void __attribute__((dj)) bar() { } /* { dg-error "error: .* attribute directive ignored" } */
int i;
void
foo ()
{
if (&i) /* { dg-warning "warning: .* will always evaluate as 'true'" } */
if (&i) /* { dg-error "error: .* will always evaluate as 'true'" } */
grill ();
}

View File

@ -4,7 +4,7 @@
/* Make sure -Wno-error= overrides -Werror. */
void __attribute__((dj)) bar() { } /* { dg-warning "warning: .* attribute directive ignored" } */
void __attribute__((dj)) bar() { } /* { dg-error "error: .* attribute directive ignored" } */
int i;

View File

@ -0,0 +1,9 @@
/* { dg-do compile } */
/* { dg-options "-Woverflow -Wdiv-by-zero -Werror -Wfatal-errors" } */
#include <limits.h>
int i = INT_MAX + 1; /* { dg-error "integer overflow in expression" } */
int k = 1 / 0;
int j = INT_MIN - 1;
/* { dg-warning "being treated as errors" "" { target *-*-* } 0 } */
/* { dg-warning "terminated due to -Wfatal-errors" "" { target *-*-* } 0 } */

View File

@ -0,0 +1,11 @@
/* { dg-do compile } */
/* { dg-options "-Woverflow -Werror=div-by-zero -Wfatal-errors" } */
#include <limits.h>
int i = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */
int k = 1 / 0; /* { dg-error "division by zero" } */
int j = INT_MIN - 1;
/* { dg-warning "terminated due to -Wfatal-errors" "" { target *-*-* } 0 } */