re PR c/66098 (#pragma diagnostic 'ignored' not fully undone by pop for strict-overflow)
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 11 Aug 2015 13:34:00 +0000 (13:34 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 11 Aug 2015 13:34:00 +0000 (13:34 +0000)
gcc/ChangeLog:

2015-08-11  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR c/66098
PR c/66711
* diagnostic.c (diagnostic_classify_diagnostic): Take -Werror into
account when deciding what was the command-line status.

gcc/testsuite/ChangeLog:

2015-08-11  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR c/66098
PR c/66711
* gcc.dg/pragma-diag-3.c: New test.
* gcc.dg/pragma-diag-4.c: New test.

From-SVN: r226780

gcc/ChangeLog
gcc/diagnostic.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pragma-diag-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pragma-diag-4.c [new file with mode: 0644]

index cb2d6a06b9a335b53d9c98a4b2574cb1cca28b44..099d2c1b6897fcaa145a7dce9aa42eef162c103c 100644 (file)
@@ -1,3 +1,10 @@
+2015-08-11  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       PR c/66098
+       PR c/66711
+       * diagnostic.c (diagnostic_classify_diagnostic): Take -Werror into
+       account when deciding what was the command-line status.
+
 2015-08-11  Nathan Sidwell  <nathan@acm.org>
 
        * tree-vrp.c (simplify_abs_using_ranges): Simplify.
index fb9d1fbfd1ba72681b29f0f463aa877f0edf221a..01a8e35d73bf25c1ac0182efffc665986c1f9e44 100644 (file)
@@ -696,9 +696,10 @@ diagnostic_classify_diagnostic (diagnostic_context *context,
       /* Record the command-line status, so we can reset it back on DK_POP. */
       if (old_kind == DK_UNSPECIFIED)
        {
-         old_kind = context->option_enabled (option_index,
-                                             context->option_state)
-           ? DK_WARNING : DK_IGNORED;
+         old_kind = !context->option_enabled (option_index,
+                                              context->option_state)
+           ? DK_IGNORED : (context->warning_as_error_requested
+                           ? DK_ERROR : DK_WARNING);
          context->classify_diagnostic[option_index] = old_kind;
        }
 
index 8d4903f5b62141b6ae8399374e7238ddbe842127..7a35aadd828bbd85b5b790356b721cd53e9a6cc1 100644 (file)
@@ -1,3 +1,10 @@
+2015-08-11  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       PR c/66098
+       PR c/66711
+       * gcc.dg/pragma-diag-3.c: New test.
+       * gcc.dg/pragma-diag-4.c: New test.
+
 2015-08-11  Nathan Sidwell  <nathan@acm.org>
 
        * c-c++-common/dfp/operator-comma.c: Call init function.
diff --git a/gcc/testsuite/gcc.dg/pragma-diag-3.c b/gcc/testsuite/gcc.dg/pragma-diag-3.c
new file mode 100644 (file)
index 0000000..2ee439d
--- /dev/null
@@ -0,0 +1,64 @@
+/* { dg-do compile } */
+/* { dg-options "-Wswitch-enum -Wsign-compare -fstrict-overflow -Wstrict-overflow -Werror -Wno-error=switch-enum" } */
+/* PR c/66098 - #pragma diagnostic 'ignored' not fully undone by pop for strict-overflow 
+   PR c/66711 - GCC does not correctly restore diagnostic state after pragma GCC diagnostic pop with -Werror 
+*/
+/* { dg-message "warnings being treated as errors" "" {target "*-*-*"} 0 } */
+
+void testing2() {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-overflow"
+  int j = 4;
+  j + 4 < j;
+#pragma GCC diagnostic pop
+}
+
+void testing3() {
+  int k = 4;
+  k + 4 < k; /* { dg-error "overflow" } */
+}
+
+int bar()
+{
+  unsigned x = 0;
+  int y = 1;
+
+  /* generates an error - ok */
+  x += x < y ? 1 : 0; /* { dg-error "comparison" } */
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wsign-compare"
+  /* generates no diagnostic - ok */
+  x += x < y ? 1 : 0;
+#pragma GCC diagnostic pop
+
+  x += x < y ? 1 : 0; /* { dg-error "comparison" } */
+
+  return x;
+}
+
+enum EE { ONE, TWO };
+
+int f (enum EE e)
+{
+  int r = 0;
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wswitch-enum"
+
+  switch (e)
+    {
+    case ONE:
+      r = 1;
+      break;
+    }
+#pragma GCC diagnostic pop
+
+  switch (e) /* { dg-warning "switch" } */
+    {
+    case ONE:
+      r = 1;
+      break;
+    }
+  return r;
+}
diff --git a/gcc/testsuite/gcc.dg/pragma-diag-4.c b/gcc/testsuite/gcc.dg/pragma-diag-4.c
new file mode 100644 (file)
index 0000000..fc8d4b1
--- /dev/null
@@ -0,0 +1,48 @@
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare -Werror=sign-compare -Werror=switch-enum" } */
+/* { dg-message "warnings being treated as errors" "" {target "*-*-*"} 0 } */
+
+int bar()
+{
+  unsigned x = 0;
+  int y = 1;
+
+  /* generates an error - ok */
+  x += x < y ? 1 : 0; /* { dg-error "comparison" } */
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wsign-compare"
+  /* generates no diagnostic - ok */
+  x += x < y ? 1 : 0;
+#pragma GCC diagnostic pop
+
+  x += x < y ? 1 : 0; /* { dg-error "comparison" } */
+
+  return x;
+}
+
+enum EE { ONE, TWO };
+
+int f (enum EE e)
+{
+  int r = 0;
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wswitch-enum"
+
+  switch (e)
+    {
+    case ONE:
+      r = 1;
+      break;
+    }
+#pragma GCC diagnostic pop
+
+  switch (e) /* { dg-error "switch" } */
+    {
+    case ONE:
+      r = 1;
+      break;
+    }
+  return r;
+}