From: Kaveh R. Ghazi Date: Tue, 19 Dec 2000 01:17:20 +0000 (+0000) Subject: fold-const.c (tree_expr_nonnegative_p): Treat truth values as non-negative. X-Git-Tag: prereleases/libstdc++-2.92~2136 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9d2dc7da92fe49bbe74ce104538cb307d57d5241;p=thirdparty%2Fgcc.git fold-const.c (tree_expr_nonnegative_p): Treat truth values as non-negative. * fold-const.c (tree_expr_nonnegative_p): Treat truth values as non-negative. testsuite: * gcc.dg/compare3.c: New test. From-SVN: r38374 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6932876158be..23c0eb5f38e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-12-18 Kaveh R. Ghazi + + * fold-const.c (tree_expr_nonnegative_p): Treat truth values as + non-negative. + Tue Dec 19 00:37:08 2000 J"orn Rennecke * reload.c (push_reload): When using a dying register for the reload diff --git a/gcc/fold-const.c b/gcc/fold-const.c index d8131faf226c..a0a76b2d4916 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b60cda7515e2..06c54bc3d1f9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-12-18 Kaveh R. Ghazi + + * gcc.dg/compare3.c: New test. + 2000-12-18 Joseph S. Myers * 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 index 000000000000..eda3faf2754a --- /dev/null +++ b/gcc/testsuite/gcc.dg/compare3.c @@ -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 (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" } */ + +}