]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
fold-const.c (tree_expr_nonnegative_p): Treat truth values as non-negative.
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>
Tue, 19 Dec 2000 01:17:20 +0000 (01:17 +0000)
committerKaveh Ghazi <ghazi@gcc.gnu.org>
Tue, 19 Dec 2000 01:17:20 +0000 (01:17 +0000)
* fold-const.c (tree_expr_nonnegative_p): Treat truth values as
non-negative.

testsuite:
* gcc.dg/compare3.c: New test.

From-SVN: r38374

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/compare3.c [new file with mode: 0644]

index 6932876158beac2844ea5687dde7360e2b661d62..23c0eb5f38e2c82f2021b24788361de033f8c6d6 100644 (file)
@@ -1,3 +1,8 @@
+2000-12-18  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * fold-const.c (tree_expr_nonnegative_p): Treat truth values as
+       non-negative.
+
 Tue Dec 19 00:37:08 2000  J"orn Rennecke <amylaar@redhat.com>
 
        * reload.c (push_reload): When using a dying register for the reload
index d8131faf226c66f982183f47379492dadcfb4be7..a0a76b2d4916f8413dc9710915a0cf390080c1e7 100644 (file)
@@ -7299,8 +7299,12 @@ tree_expr_nonnegative_p (t)
       return rtl_expr_nonnegative_p (RTL_EXPR_RTL (t));
       
     default:
-      /* We don't know sign of `t', so be safe and return false.  */
-      return 0;
+      if (truth_value_p (TREE_CODE (t)))
+       /* Truth values evaluate to 0 or 1, which is nonnegative.  */
+       return 1;
+      else
+       /* We don't know sign of `t', so be conservative and return false.  */
+       return 0;
     }
 }
 
index b60cda7515e265d497287157f3e7e8aafc6ae806..06c54bc3d1f9f3369f02d9de29da2f3e9209b512 100644 (file)
@@ -1,3 +1,7 @@
+2000-12-18  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * gcc.dg/compare3.c: New test.
+
 2000-12-18  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * gcc.dg/format-warnll-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/compare3.c b/gcc/testsuite/gcc.dg/compare3.c
new file mode 100644 (file)
index 0000000..eda3faf
--- /dev/null
@@ -0,0 +1,59 @@
+/* Test for a bogus warning on comparison between signed and unsigned.
+   This was inspired by code in gcc. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+int tf = 1;
+
+void f(int x, unsigned int y)
+{
+  /* Test comparing conditional expressions containing truth values.
+     This can occur explicitly, or e.g. when (foo?2:(bar?1:0)) is
+     optimized into (foo?2:(bar!=0)).  */
+  x > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 1" } */
+  y > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 2" } */
+  x > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 3" } */
+  y > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 4" } */
+
+  x > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 5" } */
+  y > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 6" } */
+  x > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 7" } */
+  y > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 8" } */
+
+  x > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 9" } */
+  y > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 10" } */
+  x > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 11" } */
+  y > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 12" } */
+
+  x < (tf?64:(tf<x)); /* { dg-bogus "signed and unsigned" "case 13" } */
+  y < (tf?64:(tf<x)); /* { dg-bogus "signed and unsigned" "case 14" } */
+  x < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 15" } */
+  y < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 16" } */
+
+  x > (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 17" } */
+  y > (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 18" } */
+  x > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 19" } */
+  y > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 20" } */
+
+  x > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 21" } */
+  y > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 22" } */
+  x > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 23" } */
+  y > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 24" } */
+
+  x > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 25" } */
+  y > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 26" } */
+  x > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 27" } */
+  y > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 28" } */
+
+  x > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 29" } */
+  y > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 30" } */
+  x > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 31" } */
+  y > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 32" } */
+
+  x > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 33" } */
+  y > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 34" } */
+  x > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 35" } */
+  y > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 36" } */
+
+}