diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d5778787755..ebceb404f1a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-02-20 Manuel Lopez-Ibanez + DJ Delorie + + 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 * config/i386/i386.md (expm1xf2): Reorder insn sequence for 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; + ++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)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8e85108942f..b5f91c5e7dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2007-02-20 Manuel Lopez-Ibanez + DJ Delorie + + 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 PR fortran/30522 diff --git a/gcc/testsuite/gcc.dg/Werror-1.c b/gcc/testsuite/gcc.dg/Werror-1.c index 7984740ca88..33fc1d3583c 100644 --- a/gcc/testsuite/gcc.dg/Werror-1.c +++ b/gcc/testsuite/gcc.dg/Werror-1.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/Werror-10.c b/gcc/testsuite/gcc.dg/Werror-10.c index eeadf512b5b..f5646545132 100644 --- a/gcc/testsuite/gcc.dg/Werror-10.c +++ b/gcc/testsuite/gcc.dg/Werror-10.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/Werror-11.c b/gcc/testsuite/gcc.dg/Werror-11.c index 493ded044a8..0dea5faf6a8 100644 --- a/gcc/testsuite/gcc.dg/Werror-11.c +++ b/gcc/testsuite/gcc.dg/Werror-11.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/Werror-5.c b/gcc/testsuite/gcc.dg/Werror-5.c index 40d3cd1f7ad..8a21593fbd8 100644 --- a/gcc/testsuite/gcc.dg/Werror-5.c +++ b/gcc/testsuite/gcc.dg/Werror-5.c @@ -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 (); } diff --git a/gcc/testsuite/gcc.dg/Werror-7.c b/gcc/testsuite/gcc.dg/Werror-7.c index 9829ce9e4f7..6a69fae4ded 100644 --- a/gcc/testsuite/gcc.dg/Werror-7.c +++ b/gcc/testsuite/gcc.dg/Werror-7.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/Wfatal-2.c b/gcc/testsuite/gcc.dg/Wfatal-2.c new file mode 100644 index 00000000000..cbb7c8e8ff8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wfatal-2.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-Woverflow -Wdiv-by-zero -Werror -Wfatal-errors" } */ +#include + +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 } */ diff --git a/gcc/testsuite/gcc.dg/Wfatal.c b/gcc/testsuite/gcc.dg/Wfatal.c new file mode 100644 index 00000000000..bb3efc81369 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wfatal.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-Woverflow -Werror=div-by-zero -Wfatal-errors" } */ +#include + +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 } */ + + +