diff options
author | manu <manu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-20 12:48:16 +0000 |
---|---|---|
committer | manu <manu@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-20 12:48:16 +0000 |
commit | e472ce46eb03159d7e97532ee63c890988164946 (patch) | |
tree | 3164cedfb7fb422a18eb3305ee3af6daa65943fa | |
parent | cfcb0b368832113b30735c77239a815006672350 (diff) | |
download | gcc-e472ce46eb03159d7e97532ee63c890988164946.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@214221 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/diagnostic.c | 9 | ||||
-rw-r--r-- | gcc/opts-common.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr59304.c | 40 |
5 files changed, 68 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 360db1140c8..00497633a9b 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 2226821bc49..62447212d49 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 007a546e388..3b942016183 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 2e023a88fbb..73390a2cd50 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 00000000000..f56ebc374bd --- /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; +} |