aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2014-08-20 12:48:16 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2014-08-20 12:48:16 +0000
commit3ba421e8becbd17526a88ec76226d7213b96af14 (patch)
tree3164cedfb7fb422a18eb3305ee3af6daa65943fa /gcc
parentc84d88e45c50cadf07edfaac07b174490d48bbde (diff)
downloadgcc-3ba421e8becbd17526a88ec76226d7213b96af14.zip
gcc-3ba421e8becbd17526a88ec76226d7213b96af14.tar.gz
gcc-3ba421e8becbd17526a88ec76226d7213b96af14.tar.bz2
re PR c/59304 (#pragma diagnostic pop after warning fails for options unspecified in the command-line and disabled by default)
gcc/ChangeLog: 2014-08-20 Manuel López-Ibáñez <manu@gcc.gnu.org> PR c/59304 * opts-common.c (set_option): Call diagnostic_classify_diagnostic before setting the option. * diagnostic.c (diagnostic_classify_diagnostic): Record command-line status. gcc/testsuite/ChangeLog: 2014-08-20 Manuel López-Ibáñez <manu@gcc.gnu.org> PR c/59304 * gcc.dg/pr59304.c: New test. From-SVN: r214221
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/diagnostic.c9
-rw-r--r--gcc/opts-common.c7
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/pr59304.c40
5 files changed, 68 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 360db11..0049763 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2014-08-20 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c/59304
+ * opts-common.c (set_option): Call diagnostic_classify_diagnostic
+ before setting the option.
+ * diagnostic.c (diagnostic_classify_diagnostic): Record
+ command-line status.
+
2014-08-20 Richard Biener <rguenther@suse.de>
PR lto/62190
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index 2226821..6244721 100644
--- a/gcc/diagnostic.c
+++ b/gcc/diagnostic.c
@@ -584,6 +584,15 @@ diagnostic_classify_diagnostic (diagnostic_context *context,
{
int i;
+ /* 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;
+ context->classify_diagnostic[option_index] = old_kind;
+ }
+
for (i = context->n_classification_history - 1; i >= 0; i --)
if (context->classification_history[i].option == option_index)
{
diff --git a/gcc/opts-common.c b/gcc/opts-common.c
index 007a546..3b94201 100644
--- a/gcc/opts-common.c
+++ b/gcc/opts-common.c
@@ -1119,6 +1119,9 @@ set_option (struct gcc_options *opts, struct gcc_options *opts_set,
if (!flag_var)
return;
+ if ((diagnostic_t) kind != DK_UNSPECIFIED && dc != NULL)
+ diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
+
if (opts_set != NULL)
set_flag_var = option_flag_var (opt_index, opts_set);
@@ -1198,10 +1201,6 @@ set_option (struct gcc_options *opts, struct gcc_options *opts_set,
}
break;
}
-
- if ((diagnostic_t) kind != DK_UNSPECIFIED
- && dc != NULL)
- diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
}
/* Return the address of the flag variable for option OPT_INDEX in
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2e023a8..73390a2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2014-08-20 Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c/59304
+ * opts-common.c (set_option): Call diagnostic_classify_diagnostic
+ before setting the option.
+ * diagnostic.c (diagnostic_classify_diagnostic): Record
+ command-line status.
+
2014-08-20 Mark Wielaard <mjw@redhat.com>
* gcc.dg/guality/restrict.c: Add `used' attribute to all variables.
diff --git a/gcc/testsuite/gcc.dg/pr59304.c b/gcc/testsuite/gcc.dg/pr59304.c
new file mode 100644
index 0000000..f56ebc3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr59304.c
@@ -0,0 +1,40 @@
+/* { dg-do compile } */
+enum EE
+ {
+ ONE, TWO, THREE
+ };
+
+int f (enum EE e)
+{
+ int r = 0;
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic error "-Wswitch-enum"
+
+ switch (e)
+ {
+ case ONE:
+ r = 1;
+ break;
+ case TWO:
+ r = 2;
+ break;
+ case THREE:
+ r = 3;
+ break;
+ }
+
+#pragma GCC diagnostic pop
+
+ switch (e)
+ {
+ case ONE:
+ r = 1;
+ break;
+ case TWO:
+ r = 2;
+ break;
+ }
+
+ return r;
+}