The -Wshift-negative-value patch caused grief since it breaks building some programs. The following patch should alleviate the pain a bit: mark a left shift of a negative value as non-const only if pedantic.
Bootstrapped/regtested on x86_64-linux, ok for trunk? 2015-05-11 Marek Polacek <pola...@redhat.com> PR c/66066 * c-typeck.c (build_binary_op): Mark left shift of a negative value as non-const only if pedantic. * gcc.dg/c99-left-shift-2.c: New test. diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c index 3fcb7c2..05b2709 100644 --- gcc/c/c-typeck.c +++ gcc/c/c-typeck.c @@ -10702,7 +10702,7 @@ build_binary_op (location_t location, enum tree_code code, { /* Don't reject a left shift of a negative value in a context where a constant expression is needed in C90. */ - if (flag_isoc99) + if (pedantic && flag_isoc99) int_const = false; if (c_inhibit_evaluation_warnings == 0) warning_at (location, OPT_Wshift_negative_value, diff --git gcc/testsuite/gcc.dg/c99-left-shift-2.c gcc/testsuite/gcc.dg/c99-left-shift-2.c index e69de29..a4cd9d0 100644 --- gcc/testsuite/gcc.dg/c99-left-shift-2.c +++ gcc/testsuite/gcc.dg/c99-left-shift-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1999" } */ + +enum E { A = -2 << 1 }; +int i = -1 << 0; + +int +f (int i) +{ + switch (i) + case -1 << 0: break; +} Marek