re PR c/81417 (-Wsign-compare should print types being compared)
authorMarek Polacek <polacek@redhat.com>
Thu, 27 Jul 2017 15:02:17 +0000 (15:02 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 27 Jul 2017 15:02:17 +0000 (15:02 +0000)
PR c/81417
* c-warn.c (warn_for_sign_compare): Tweak the warning message.  Print
the types.

* c-c++-common/Wsign-compare-1.c: New test.
* g++.dg/warn/Wsign-compare-2.C: Update dg-warning.
* g++.dg/warn/Wsign-compare-4.C: Likewise.
* g++.dg/warn/Wsign-compare-6.C: Likewise.
* g++.dg/warn/compare1.C: Likewise.
* gcc.dg/compare1.c: Likewise.
* gcc.dg/compare2.c: Likewise.
* gcc.dg/compare4.c: Likewise.
* gcc.dg/compare5.c: Likewise.
* gcc.dg/pr35430.c: Likewise.
* gcc.dg/pr60087.c: Likewise.

From-SVN: r250630

14 files changed:
gcc/c-family/ChangeLog
gcc/c-family/c-warn.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wsign-compare-1.c [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wsign-compare-2.C
gcc/testsuite/g++.dg/warn/Wsign-compare-4.C
gcc/testsuite/g++.dg/warn/Wsign-compare-6.C
gcc/testsuite/g++.dg/warn/compare1.C
gcc/testsuite/gcc.dg/compare1.c
gcc/testsuite/gcc.dg/compare2.c
gcc/testsuite/gcc.dg/compare4.c
gcc/testsuite/gcc.dg/compare5.c
gcc/testsuite/gcc.dg/pr35430.c
gcc/testsuite/gcc.dg/pr60087.c

index 4a2b9ad430f331eae0643a42aa928e573309f165..12683a641779c62d69210fa866d2e9e5634a7d0f 100644 (file)
@@ -1,3 +1,9 @@
+2017-07-27  Marek Polacek  <polacek@redhat.com>
+
+       PR c/81417
+       * c-warn.c (warn_for_sign_compare): Tweak the warning message.  Print
+       the types.
+
 2017-07-27  Jakub Jelinek  <jakub@redhat.com>
 
        * c-attribs.c (c_common_attribute_table): Add noipa attribute.
index a8b38c1b98deae21fa6ce4f1baa5c2823cc91f19..505070e5586ab0f888bb595107c92e4a6a62ace4 100644 (file)
@@ -1891,9 +1891,10 @@ warn_for_sign_compare (location_t location,
                                   c_common_signed_type (base_type)))
        /* OK */;
       else
-       warning_at (location,
-                   OPT_Wsign_compare,
-                   "comparison between signed and unsigned integer expressions");
+       warning_at (location, OPT_Wsign_compare,
+                   "comparison of integer expressions of different "
+                   "signedness: %qT and %qT", TREE_TYPE (orig_op0),
+                   TREE_TYPE (orig_op1));
     }
 
   /* Warn if two unsigned values are being compared in a size larger
index a57caaa65cb39dc45dba67e0455cf7abf4fb22db..5f964a3d35ad87862bb00b78341592718a9ea416 100644 (file)
@@ -1,3 +1,18 @@
+2017-07-27  Marek Polacek  <polacek@redhat.com>
+
+       PR c/81417
+       * c-c++-common/Wsign-compare-1.c: New test.
+       * g++.dg/warn/Wsign-compare-2.C: Update dg-warning.
+       * g++.dg/warn/Wsign-compare-4.C: Likewise.
+       * g++.dg/warn/Wsign-compare-6.C: Likewise.
+       * g++.dg/warn/compare1.C: Likewise.
+       * gcc.dg/compare1.c: Likewise.
+       * gcc.dg/compare2.c: Likewise.
+       * gcc.dg/compare4.c: Likewise.
+       * gcc.dg/compare5.c: Likewise.
+       * gcc.dg/pr35430.c: Likewise.
+       * gcc.dg/pr60087.c: Likewise.
+
 2017-07-27  Peter Bergner  <bergner@vnet.ibm.com>
 
        PR middle-end/81564
diff --git a/gcc/testsuite/c-c++-common/Wsign-compare-1.c b/gcc/testsuite/c-c++-common/Wsign-compare-1.c
new file mode 100644 (file)
index 0000000..b9b17a9
--- /dev/null
@@ -0,0 +1,33 @@
+/* PR c/81417 */
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+int
+fn1 (signed int a, unsigned int b)
+{
+  return a < b; /* { dg-warning "comparison of integer expressions of different signedness: 'int' and 'unsigned int'" } */
+}
+
+int
+fn2 (signed int a, unsigned int b)
+{
+  return b < a; /* { dg-warning "comparison of integer expressions of different signedness: 'unsigned int' and 'int'" } */
+}
+
+int
+fn3 (signed long int a, unsigned long int b)
+{
+  return b < a; /* { dg-warning "comparison of integer expressions of different signedness: 'long unsigned int' and 'long int'" } */
+}
+
+int
+fn4 (signed short int a, unsigned int b)
+{
+  return b < a; /* { dg-warning "comparison of integer expressions of different signedness: 'unsigned int' and 'short int'" } */
+}
+
+int
+fn5 (unsigned int a, signed int b)
+{
+  return a < b; /* { dg-warning "comparison of integer expressions of different signedness: 'unsigned int' and 'int'" } */
+}
index 2b8360648fa02552e438a6907532617adc83dc66..b66e8b46565c59bca57017a9fa41c46dd1d15d68 100644 (file)
@@ -6,5 +6,5 @@ void
 foo (__complex__ int i)
 {
   i == 0u;
-  i == ~1u;    // { dg-warning "comparison between signed and unsigned integer expressions" }
+  i == ~1u;    // { dg-warning "comparison of integer expressions of different signedness" }
 }
index b3eb8e2a7de7b020594fbb2f788fd9f8ecf9610b..e92ab137e3b8c1fe385c2fafde7aba859c6b3314 100644 (file)
@@ -3,10 +3,10 @@
 
 int foo(unsigned int *a, int b)
 {
-  return (*a) <= b; // { dg-warning "comparison between signed and unsigned" }
+  return (*a) <= b; // { dg-warning "comparison of integer expressions of different signedness" }
 }
 
 int bar(unsigned int *a, int b)
 {
-  return *a <= b; // { dg-warning "comparison between signed and unsigned" }
+  return *a <= b; // { dg-warning "comparison of integer expressions of different signedness" }
 }
index 1f8af664c7b68266bb086b626707cf28a33eb8fb..71b4ebf1613c8b8d56bc46acd9bb109781b0957e 100644 (file)
@@ -8,7 +8,7 @@ int main()
   int i = 5;
   int const ic = 5;
 
-  i < 5u;  // { dg-warning "5:comparison between signed and unsigned" }
+  i < 5u;  // { dg-warning "5:comparison of integer expressions of different signedness" }
   ic < 5u;     
   FIVE < 5u;
 }
index e00592262c63d3b8b7a36a424e4a36e223818001..38f4dffd1da81316ec154f56fc844e876444c8ef 100644 (file)
@@ -6,5 +6,5 @@
 
 int f(unsigned a, int b)
 {
-  return a < b;  /* { dg-warning "signed and unsigned" } */
+  return a < b;  /* { dg-warning "comparison of integer expressions of different signedness" } */
 }
index 17ba3ee2098c975e5284070180a71ec38124e9b1..7becfbdb17f5207c5f693ecc6672d8e84c98530b 100644 (file)
@@ -37,5 +37,5 @@ int h(enum mm2 x)
 
 int i(enum mm2 x)
 {
-  return x == (tf?DI2:-1); /* { dg-warning "signed and unsigned" "case 4" } */
+  return x == (tf?DI2:-1); /* { dg-warning "different signedness" "case 4" } */
 }
index 0625eb9c3f65f10ef2637e65ff167dcb162877e3..c309f1d00ebc1e111515c0c746c4a36f90164eb4 100644 (file)
@@ -18,11 +18,11 @@ void f(int x, unsigned int y)
 
   /* ?: branches are signed constants.  */
   x > (tf?64:-1); /* { dg-bogus "signed and unsigned" "case 5" } */
-  y > (tf?64:-1); /* { dg-warning "signed and unsigned" "case 6" } */
+  y > (tf?64:-1); /* { dg-warning "different signedness" "case 6" } */
 
   /* ?: branches are (recursively) signed constants.  */
   x > (tf?64:(tf?128:-1)); /* { dg-bogus "signed and unsigned" "case 7" } */
-  y > (tf?64:(tf?128:-1)); /* { dg-warning "signed and unsigned" "case 8" } */
+  y > (tf?64:(tf?128:-1)); /* { dg-warning "different signedness" "case 8" } */
 
   /* Statement expression.  */
   x > ({tf; 64;}); /* { dg-bogus "signed and unsigned" "case 9" } */
@@ -34,11 +34,11 @@ void f(int x, unsigned int y)
 
   /* Statement expression with signed ?:.  */
   x > ({tf; tf?64:-1;}); /* { dg-bogus "signed and unsigned" "case 13" } */
-  y > ({tf; tf?64:-1;}); /* { dg-warning "signed and unsigned" "case 14" } */
+  y > ({tf; tf?64:-1;}); /* { dg-warning "different signedness" "case 14" } */
 
   /* Statement expression with recursive signed ?:.  */
   x > ({tf; tf?64:(tf?128:-1);}); /* { dg-bogus "signed and unsigned" "case 15" } */
-  y > ({tf; tf?64:(tf?128:-1);}); /* { dg-warning "signed and unsigned" "case 16" } */
+  y > ({tf; tf?64:(tf?128:-1);}); /* { dg-warning "different signedness" "case 16" } */
 
   /* ?: branches are constants.  */
   tf ? x : (tf?64:32); /* { dg-bogus "conditional expression" "case 17" } */
index e5dad4d1e456d68f98f5c7c1e11c43ee470c94e0..299d488edf60e6b0337a326b82cf5220b73f691e 100644 (file)
@@ -10,7 +10,7 @@ int foo(int x, int y, unsigned u)
 {
   /* A COMPOUND_EXPR is non-negative if the last element is known to
      be non-negative.  */
-  if (u < (bar(), -1)) /*{ dg-warning "9:signed and unsigned" "COMPOUND_EXPR" }*/
+  if (u < (bar(), -1)) /*{ dg-warning "9:different signedness" "COMPOUND_EXPR" }*/
     return x;
   if (u < (bar(), 10))
     return x;
@@ -34,7 +34,7 @@ int foo(int x, int y, unsigned u)
 
   /* A MODIFY_EXPR is non-negative if the new value is known to be
      non-negative.  */
-  if (u < (x = -1)) /* { dg-warning "9:signed and unsigned" "MODIFY_EXPR" } */
+  if (u < (x = -1)) /* { dg-warning "9:different signedness" "MODIFY_EXPR" } */
     return x;
   if (u < (x = 10))
     return x;
index f19c575efb7927e20fa03a6010dfb4960e5cf70d..3a502f12de9a3aafcbc95701732d4dff374be601 100644 (file)
@@ -10,7 +10,7 @@ int foo(int x, int y, unsigned u)
 {
   /* A *_DIV_EXPR is non-negative if both operands are.  */
 
-  if (u < ((x=-22)/33)) /* { dg-warning "signed and unsigned" "DIV_EXPR" } */
+  if (u < ((x=-22)/33)) /* { dg-warning "different signedness" "DIV_EXPR" } */
     return x;
 
   if (u < ((x=22)/33))
@@ -25,7 +25,7 @@ int foo(int x, int y, unsigned u)
 
   /* A *_MOD_EXPR is non-negative if the first operand is.  */
 
-  if (u < ((x=-22)%33)) /* { dg-warning "signed and unsigned" "MOD_EXPR" } */
+  if (u < ((x=-22)%33)) /* { dg-warning "different signedness" "MOD_EXPR" } */
     return x;
 
   if (u < ((x=22)%-33))
index ab5e4cac8a5467644754d22fdae8986c22a3149a..7365ccfcf9437cfb2aee326447c9dd640842ace8 100644 (file)
@@ -6,5 +6,5 @@ void
 foo (__complex__ int i)
 {
   i == 0u;
-  i == ~1u;    /* { dg-warning "comparison between signed and unsigned integer expressions" } */
+  i == ~1u;    /* { dg-warning "comparison of integer expressions of different signedness" } */
 }
index 9cdd5897354e1a95ca6630d44355cb756a68f43d..c6cf7aa460757d9d4e5684b01c19eb8c03fbbe21 100644 (file)
@@ -10,5 +10,5 @@ foo (unsigned int ui, int i)
   b = 0 != ~uc; /* { dg-warning "9:promoted ~unsigned is always non-zero" } */
   b = 2 != ~uc; /* { dg-warning "9:comparison of promoted ~unsigned with constant" } */
   b = uc == ~uc; /* { dg-warning "10:comparison of promoted ~unsigned with unsigned" } */
-  b = i == ui; /* { dg-warning "9:comparison between signed and unsigned integer expressions" } */
+  b = i == ui; /* { dg-warning "9:comparison of integer expressions of different signedness" } */
 }