From 007a787db4538b34e254963ee27d43ea48cbb8c6 Mon Sep 17 00:00:00 2001 From: Christian Bruel Date: Thu, 19 Apr 2012 11:06:53 +0200 Subject: [PATCH] Fix #52283 error: case label does not reduce to an integer constant From-SVN: r186586 --- gcc/ChangeLog | 6 ++++++ gcc/c-family/c-common.c | 1 + gcc/convert.c | 9 +-------- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/gcc.dg/pr37985.c | 8 ++++++++ gcc/testsuite/gcc.dg/pr52283.c | 16 ++++++++++++++++ 6 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr37985.c create mode 100644 gcc/testsuite/gcc.dg/pr52283.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2a9e0ae29fc..7f3d9ac6b9a7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-04-19 Manuel López-Ibáñez + + PR c/52283/37985 + * stmt.c (warn_if_unused_value): Skip NOP_EXPR. + * convert.c (convert_to_integer): Don't set TREE_NO_WARNING. + 2012-04-19 Richard Guenther PR rtl-optimization/44688 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index a08db464dfd4..339eefeea84a 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -1692,6 +1692,7 @@ warn_if_unused_value (const_tree exp, location_t locus) case SAVE_EXPR: case NON_LVALUE_EXPR: + case NOP_EXPR: exp = TREE_OPERAND (exp, 0); goto restart; diff --git a/gcc/convert.c b/gcc/convert.c index 8ff2e9a825af..5e6b09e06545 100644 --- a/gcc/convert.c +++ b/gcc/convert.c @@ -537,7 +537,6 @@ convert_to_integer (tree type, tree expr) else if (outprec >= inprec) { enum tree_code code; - tree tem; /* If the precision of the EXPR's type is K bits and the destination mode has more bits, and the sign is changing, @@ -555,13 +554,7 @@ convert_to_integer (tree type, tree expr) else code = NOP_EXPR; - tem = fold_unary (code, type, expr); - if (tem) - return tem; - - tem = build1 (code, type, expr); - TREE_NO_WARNING (tem) = 1; - return tem; + return fold_build1 (code, type, expr); } /* If TYPE is an enumeral type or a type with a precision less diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6d9506edb273..e838343e3b7f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2012-04-19 Christian Bruel + + * gcc.dg/pr52283.c: New test. + +2012-04-19 Manuel López-Ibáñez + + * gcc.dg/pr37985.c: New test. + 2012-04-19 Richard Guenther PR rtl-optimization/44688 diff --git a/gcc/testsuite/gcc.dg/pr37985.c b/gcc/testsuite/gcc.dg/pr37985.c new file mode 100644 index 000000000000..93e640b4a366 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr37985.c @@ -0,0 +1,8 @@ +/* PR c37985 */ +/* { dg-do compile } */ +/* { dg-options " -Wall -Wextra " } */ +unsigned char foo(unsigned char a) +{ + a >> 2; /* { dg-warning "no effect" } */ + return a; +} diff --git a/gcc/testsuite/gcc.dg/pr52283.c b/gcc/testsuite/gcc.dg/pr52283.c new file mode 100644 index 000000000000..33785a598e2b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr52283.c @@ -0,0 +1,16 @@ +/* Test for case labels not integer constant expressions but folding + to integer constants (used in Linux kernel). */ +/* { dg-do compile } */ + +extern unsigned int u; + +void +b (int c) +{ + switch (c) + { + case (int) (2 | ((4 < 8) ? 8 : u)): + ; + } +} +