This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C PATCH for -Wshift-negative-value (PR c/66066)
- From: Marek Polacek <polacek at redhat dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Joseph Myers <joseph at codesourcery dot com>
- Date: Mon, 11 May 2015 16:21:12 +0200
- Subject: C PATCH for -Wshift-negative-value (PR c/66066)
- Authentication-results: sourceware.org; auth=none
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 <polacek@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