On Thu, Jul 30, 2015 at 05:35:39PM +0200, Manuel López-Ibáñez wrote: > When I fixed PR59304, I forgot that a command-line warning can be also > an error if -Werror was enabled. This introduced a regression since > anything enabled in the command-line together with -Werror would get > initially classified as a warning when reaching the first #pragma GCC > diagnostic, and this will be the setting after a #pragma pop. > > Options that appear as arguments of -W[no-]error= are not affected by > this since those are initially classified as errors/warnings even > before reaching the first #pragma, thus the pop sets them correctly > (before and after this patch). Nonetheless, the tests also check that > they work correctly.
Sorry for the delay (vacation/Cauldron). > Index: gcc/diagnostic.c > =================================================================== > --- gcc/diagnostic.c (revision 226312) > +++ gcc/diagnostic.c (working copy) > @@ -694,13 +694,14 @@ diagnostic_classify_diagnostic (diagnost > 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; > + old_kind = !context->option_enabled (option_index, > + context->option_state) > + ? DK_IGNORED : (context->warning_as_error_requested > + ? DK_ERROR: DK_WARNING); Missing space before the colon. > Index: gcc/testsuite/gcc.dg/pragma-diag-3.c > =================================================================== > --- gcc/testsuite/gcc.dg/pragma-diag-3.c (revision 0) > +++ gcc/testsuite/gcc.dg/pragma-diag-3.c (revision 0) > @@ -0,0 +1,72 @@ > +/* { 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 foo() { > + testing2(); > + testing3(); > + > + return 0; > +} > + > + I think you can drop the foo function. Otherwise LGTM. Marek