c-common.c (maybe_warn_shift_overflow): Warn on all overflows if shifting 1 out of...
authorPaolo Bonzini <bonzini@gnu.org>
Fri, 4 Dec 2015 17:43:53 +0000 (17:43 +0000)
committerPaolo Bonzini <bonzini@gcc.gnu.org>
Fri, 4 Dec 2015 17:43:53 +0000 (17:43 +0000)
gcc:
2015-12-04  Paolo Bonzini  <bonzini@gnu.org>

* c-family/c-common.c (maybe_warn_shift_overflow): Warn on all
overflows if shifting 1 out of the sign bit.

gcc/testsuite:
2015-12-04  Paolo Bonzini  <bonzini@gnu.org>

* c-c++-common/Wshift-overflow-1.c: Test shifting 1 out of the sign bit.
* c-c++-common/Wshift-overflow-2.c: Test shifting 1 out of the sign bit.
* c-c++-common/Wshift-overflow-3.c: Test shifting 1 out of the sign bit.
* c-c++-common/Wshift-overflow-4.c: Test shifting 1 out of the sign bit.
* c-c++-common/Wshift-overflow-6.c: Test shifting 1 out of the sign bit.
* c-c++-common/Wshift-overflow-7.c: Test shifting 1 out of the sign bit.

From-SVN: r231290

gcc/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wshift-overflow-1.c
gcc/testsuite/c-c++-common/Wshift-overflow-2.c
gcc/testsuite/c-c++-common/Wshift-overflow-3.c
gcc/testsuite/c-c++-common/Wshift-overflow-4.c
gcc/testsuite/c-c++-common/Wshift-overflow-6.c
gcc/testsuite/c-c++-common/Wshift-overflow-7.c

index 572b9a68d84764e38d632b014fde98d408883232..b25e6430f9bd94bec8848bee7f219ad58691c10c 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-04  Paolo Bonzini  <bonzini@gnu.org>
+
+       * c-family/c-common.c (maybe_warn_shift_overflow): Warn on all
+       overflows if shifting 1 out of the sign bit.
+
 2015-12-04  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * (cstore<mode>4_unsigned): Use gpc_reg_operand instead of
index 381a925331ce2470efbb3f1cd14c26eae244962f..f89deb32889f649a9554a8676fe6c2599e59cbf0 100644 (file)
@@ -12107,8 +12107,11 @@ maybe_warn_shift_overflow (location_t loc, tree op0, tree op1)
 
   unsigned int min_prec = (wi::min_precision (op0, SIGNED)
                           + TREE_INT_CST_LOW (op1));
-  /* Handle the left-shifting 1 into the sign bit case.  */
-  if (min_prec == prec0 + 1)
+  /* Handle the case of left-shifting 1 into the sign bit.
+   * However, shifting 1 _out_ of the sign bit, as in
+   * INT_MIN << 1, is considered an overflow.
+   */
+  if (!tree_int_cst_sign_bit(op0) && min_prec == prec0 + 1)
     {
       /* Never warn for C++14 onwards.  */
       if (cxx_dialect >= cxx14)
index 2f73100ddafefa94b79558b02d422055c1ff367f..e9ad14a12e5feb8d9e428f78668480a9971cef7f 100644 (file)
@@ -1,3 +1,12 @@
+2015-12-04  Paolo Bonzini  <bonzini@gnu.org>
+
+       * c-c++-common/Wshift-overflow-1.c: Test shifting 1 out of the sign bit.
+       * c-c++-common/Wshift-overflow-2.c: Test shifting 1 out of the sign bit.
+       * c-c++-common/Wshift-overflow-3.c: Test shifting 1 out of the sign bit.
+       * c-c++-common/Wshift-overflow-4.c: Test shifting 1 out of the sign bit.
+       * c-c++-common/Wshift-overflow-6.c: Test shifting 1 out of the sign bit.
+       * c-c++-common/Wshift-overflow-7.c: Test shifting 1 out of the sign bit.
+
 2015-11-25  Nick Clifton  <nickc@redhat.com>
 
        * gcc.target/msp430/msp_abi_div_funcs.c: New test.
index 9969629f2b0fb9de3d8a7009fc24206e2599a75d..a69f2b83464c4f14802745684b692d3a31b2858e 100644 (file)
@@ -8,6 +8,9 @@
 #define LLONGM1 (sizeof (long long) * __CHAR_BIT__ - 1)
 #define LLONGM2 (sizeof (long long) * __CHAR_BIT__ - 2)
 
+#define INT_MIN (-__INT_MAX__-1)
+#define LONG_LONG_MIN (-__LONG_LONG_MAX__-1)
+
 int i1 = 1 << INTM1;
 int i2 = 9 << INTM1; /* { dg-warning "requires 36 bits to represent" } */
 int i3 = 10 << INTM2; /* { dg-warning "requires 35 bits to represent" } */
@@ -18,6 +21,7 @@ int i7 = -9 << INTM1; /* { dg-warning "requires 36 bits to represent" } */
 int i8 = -10 << INTM2; /* { dg-warning "requires 35 bits to represent" } */
 int i9 = -__INT_MAX__ << 2; /* { dg-warning "requires 34 bits to represent" } */
 int i10 = -__INT_MAX__ << INTM1; /* { dg-warning "requires 63 bits to represent" } */
+int i11 = INT_MIN << 1; /* { dg-warning "requires 33 bits to represent" } */
 
 int r1 = 1 >> INTM1;
 int r2 = 9 >> INTM1;
@@ -46,6 +50,7 @@ long long int l7 = -9LL << LLONGM1; /* { dg-warning "requires 68 bits to represe
 long long int l8 = -10LL << LLONGM2; /* { dg-warning "requires 67 bits to represent" } */
 long long int l9 = -__LONG_LONG_MAX__ << 2; /* { dg-warning "requires 66 bits to represent" } */
 long long int l10 = -__LONG_LONG_MAX__ << LLONGM1; /* { dg-warning "requires 127 bits to represent" } */
+long long int l11 = LONG_LONG_MIN << 1; /* { dg-warning "requires 65 bits to represent" } */
 
 void
 fn (void)
index d5115d01eaebb3aae45141658f4b26723e50c340..30fd2552df33e72d6954eee9c98ae1b72c2006dc 100644 (file)
@@ -8,6 +8,9 @@
 #define LLONGM1 (sizeof (long long) * __CHAR_BIT__ - 1)
 #define LLONGM2 (sizeof (long long) * __CHAR_BIT__ - 2)
 
+#define INT_MIN (-__INT_MAX__-1)
+#define LONG_LONG_MIN (-__LONG_LONG_MAX__-1)
+
 int i1 = 1 << INTM1;
 int i2 = 9 << INTM1;
 int i3 = 10 << INTM2;
@@ -18,6 +21,7 @@ int i7 = -9 << INTM1;
 int i8 = -10 << INTM2;
 int i9 = -__INT_MAX__ << 2;
 int i10 = -__INT_MAX__ << INTM1;
+int i11 = INT_MIN << 1;
 
 int r1 = 1 >> INTM1;
 int r2 = 9 >> INTM1;
@@ -46,6 +50,7 @@ long long int l7 = -9LL << LLONGM1;
 long long int l8 = -10LL << LLONGM2;
 long long int l9 = -__LONG_LONG_MAX__ << 2;
 long long int l10 = -__LONG_LONG_MAX__ << LLONGM1;
+long long int l11 = LONG_LONG_MIN << 1;
 
 void
 fn (void)
index ed57d5d8becf6d3dc455165027462fb783f845ed..03b07f8092c76dcc087afe4627b69018091c815b 100644 (file)
@@ -9,6 +9,9 @@
 #define LLONGM1 (sizeof (long long) * __CHAR_BIT__ - 1)
 #define LLONGM2 (sizeof (long long) * __CHAR_BIT__ - 2)
 
+#define INT_MIN (-__INT_MAX__-1)
+#define LONG_LONG_MIN (-__LONG_LONG_MAX__-1)
+
 int i1 = 1 << INTM1;
 int i2 = 9 << INTM1; /* { dg-warning "requires 36 bits to represent" } */
 int i3 = 10 << INTM2; /* { dg-warning "requires 35 bits to represent" } */
@@ -19,6 +22,7 @@ int i7 = -9 << INTM1; /* { dg-warning "requires 36 bits to represent" } */
 int i8 = -10 << INTM2; /* { dg-warning "requires 35 bits to represent" } */
 int i9 = -__INT_MAX__ << 2; /* { dg-warning "requires 34 bits to represent" } */
 int i10 = -__INT_MAX__ << INTM1; /* { dg-warning "requires 63 bits to represent" } */
+int i11 = INT_MIN << 1; /* { dg-warning "requires 33 bits to represent" } */
 
 int r1 = 1 >> INTM1;
 int r2 = 9 >> INTM1;
@@ -47,6 +51,7 @@ long long int l7 = -9LL << LLONGM1; /* { dg-warning "requires 68 bits to represe
 long long int l8 = -10LL << LLONGM2; /* { dg-warning "requires 67 bits to represent" } */
 long long int l9 = -__LONG_LONG_MAX__ << 2; /* { dg-warning "requires 66 bits to represent" } */
 long long int l10 = -__LONG_LONG_MAX__ << LLONGM1; /* { dg-warning "requires 127 bits to represent" } */
+long long int l11 = LONG_LONG_MIN << 1; /* { dg-warning "requires 65 bits to represent" } */
 
 void
 fn (void)
index 92f8cf85b505e94f675a881dfc2b179be30139f1..d44f9dc9804eb67691c3309638ed90e70038b6b5 100644 (file)
@@ -9,6 +9,9 @@
 #define LLONGM1 (sizeof (long long) * __CHAR_BIT__ - 1)
 #define LLONGM2 (sizeof (long long) * __CHAR_BIT__ - 2)
 
+#define INT_MIN (-__INT_MAX__-1)
+#define LONG_LONG_MIN (-__LONG_LONG_MAX__-1)
+
 int i1 = 1 << INTM1;
 int i2 = 9 << INTM1;
 int i3 = 10 << INTM2;
@@ -19,6 +22,7 @@ int i7 = -9 << INTM1;
 int i8 = -10 << INTM2;
 int i9 = -__INT_MAX__ << 2;
 int i10 = -__INT_MAX__ << INTM1;
+int i11 = INT_MIN << 1;
 
 int r1 = 1 >> INTM1;
 int r2 = 9 >> INTM1;
@@ -47,6 +51,7 @@ long long int l7 = -9LL << LLONGM1;
 long long int l8 = -10LL << LLONGM2;
 long long int l9 = -__LONG_LONG_MAX__ << 2;
 long long int l10 = -__LONG_LONG_MAX__ << LLONGM1;
+long long int l11 = LONG_LONG_MIN << 1;
 
 void
 fn (void)
index d540dea8aae6a815c56c3366a2a0181cea38b0ec..64797f44a13fd6ce35d6af279269e074b88e85e4 100644 (file)
@@ -34,3 +34,4 @@ int i27 = 0b1000000000000000000000000000 << 4;
 int i28 = 0b10000000000000000000000000000 << 3;
 int i29 = 0b100000000000000000000000000000 << 2;
 int i30 = 0b1000000000000000000000000000000 << 1;
+int i31 = (int) 0b10000000000000000000000000000000u << 1; /* { dg-warning "requires 33 bits to represent" } */
index 0eb1fef94c76df76bf088fb688e06f119920aadf..ca99d2e46fe44281fcb337d85a39ca6719145b48 100644 (file)
@@ -34,3 +34,4 @@ int i27 = 0b1000000000000000000000000000 << 4; /* { dg-warning "requires 33 bits
 int i28 = 0b10000000000000000000000000000 << 3; /* { dg-warning "requires 33 bits to represent" } */
 int i29 = 0b100000000000000000000000000000 << 2; /* { dg-warning "requires 33 bits to represent" } */
 int i30 = 0b1000000000000000000000000000000 << 1; /* { dg-warning "requires 33 bits to represent" } */
+int i31 = (int) 0b10000000000000000000000000000000u << 1; /* { dg-warning "requires 33 bits to represent" } */