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:
parent
8299dd5cbb
commit
b32bc1ac16
5 changed files with 130 additions and 3 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
64
gcc/testsuite/gcc.dg/pragma-diag-3.c
Normal file
64
gcc/testsuite/gcc.dg/pragma-diag-3.c
Normal 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;
|
||||
}
|
48
gcc/testsuite/gcc.dg/pragma-diag-4.c
Normal file
48
gcc/testsuite/gcc.dg/pragma-diag-4.c
Normal 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue