[backport gcc-4.8/trunk r185586 ] gcc/ 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. gcc/testsuite/ 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. --- gcc-4.7.2/gcc/convert.c.~1~ 2012-04-27 12:51:58.000000000 +0200 +++ gcc-4.7.2/gcc/convert.c 2012-12-09 18:40:38.000000000 +0100 @@ -583,7 +583,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, @@ -601,13 +600,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 --- gcc-4.7.2/gcc/stmt.c.~1~ 2012-01-05 21:18:15.000000000 +0100 +++ gcc-4.7.2/gcc/stmt.c 2012-12-09 18:43:50.000000000 +0100 @@ -1515,6 +1515,7 @@ warn_if_unused_value (const_tree exp, lo case SAVE_EXPR: case NON_LVALUE_EXPR: + case NOP_EXPR: exp = TREE_OPERAND (exp, 0); goto restart; --- gcc-4.7.2/gcc/testsuite/gcc.dg/pr37985.c.~1~ 1970-01-01 01:00:00.000000000 +0100 +++ gcc-4.7.2/gcc/testsuite/gcc.dg/pr37985.c 2012-12-09 18:40:38.000000000 +0100 @@ -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; +} --- gcc-4.7.2/gcc/testsuite/gcc.dg/pr52283.c.~1~ 1970-01-01 01:00:00.000000000 +0100 +++ gcc-4.7.2/gcc/testsuite/gcc.dg/pr52283.c 2012-12-09 18:40:38.000000000 +0100 @@ -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)): + ; + } +} +