re PR c/66098 (#pragma diagnostic 'ignored' not fully undone by pop for strict-overflow)

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
This commit is contained in:
Manuel López-Ibáñez 2015-08-11 13:34:00 +00:00
parent 8299dd5cbb
commit b32bc1ac16
5 changed files with 130 additions and 3 deletions

View 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.

View 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;
}

View 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.

View File

@ -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;
}

View File

@ -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;
}