aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
parent6bdcc60c754f23ad4cdaa61df43ef5acb1c5465b (diff)
downloadgcc-4e2bae26bfa2eab9678a125a7701291fe3dd7153.zip
gcc-4e2bae26bfa2eab9678a125a7701291fe3dd7153.tar.gz
gcc-4e2bae26bfa2eab9678a125a7701291fe3dd7153.tar.bz2
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')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/diagnostic.c56
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/gcc.dg/Werror-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/Werror-10.c2
-rw-r--r--gcc/testsuite/gcc.dg/Werror-11.c2
-rw-r--r--gcc/testsuite/gcc.dg/Werror-5.c4
-rw-r--r--gcc/testsuite/gcc.dg/Werror-7.c2
-rw-r--r--gcc/testsuite/gcc.dg/Wfatal-2.c9
-rw-r--r--gcc/testsuite/gcc.dg/Wfatal.c11
10 files changed, 81 insertions, 27 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d577878..ebceb40 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index 3691477..2199c7d 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))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8e85108..b5f91c5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/Werror-1.c b/gcc/testsuite/gcc.dg/Werror-1.c
index 7984740..33fc1d3 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 eeadf51..f564654 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 493ded0..0dea5fa 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 40d3cd1..8a21593 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 9829ce9..6a69fae 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 0000000..cbb7c8e
--- /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 <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 } */
diff --git a/gcc/testsuite/gcc.dg/Wfatal.c b/gcc/testsuite/gcc.dg/Wfatal.c
new file mode 100644
index 0000000..bb3efc8
--- /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 <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 } */
+
+
+