diff options
author | Roger Sayle <roger@eyesopen.com> | 2005-01-05 17:27:26 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2005-01-05 17:27:26 +0000 |
commit | 010c4d9c147b2bf50580f322fbe94fbde1206971 (patch) | |
tree | bd79071ad9a1a01c8b6a9cba6c42a4fdc67ba610 | |
parent | 9368fb8fbc1591c6cc5b20414bff2c1b4f36d05c (diff) | |
download | gcc-010c4d9c147b2bf50580f322fbe94fbde1206971.zip gcc-010c4d9c147b2bf50580f322fbe94fbde1206971.tar.gz gcc-010c4d9c147b2bf50580f322fbe94fbde1206971.tar.bz2 |
re PR middle-end/19100 (Wrong code for ?-operator with casted ?-operator predicat)
PR middle-end/19100
* c-common.c: Include real.h.
(c_common_truthvalue_conversion): Avoid destructively modifying expr.
Correctly handle TREE_CONSTANT_OVERFLOW for INTEGER_CST.
Correctly handle TREE_CONSTANT_OVERFLOW and NaNs for REAL_CST.
* Makefile.in (c-common.o): Update dependencies.
* gcc.dg/conv-3.c: New test case.
From-SVN: r92957
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c-common.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/conv-3.c | 18 |
4 files changed, 43 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 418665c..7589a23 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2005-01-05 Roger Sayle <roger@eyesopen.com> + + PR middle-end/19100 + * c-common.c: Include real.h. + (c_common_truthvalue_conversion): Avoid destructively modifying expr. + Correctly handle TREE_CONSTANT_OVERFLOW for INTEGER_CST. + Correctly handle TREE_CONSTANT_OVERFLOW and NaNs for REAL_CST. + * Makefile.in (c-common.o): Update dependencies. + 2005-01-05 Joseph S. Myers <joseph@codesourcery.com> * c-parse.in (asm_string): Add trailing semicolon. diff --git a/gcc/c-common.c b/gcc/c-common.c index b4c6349..bb81a6f 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -46,6 +46,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "hashtab.h" #include "tree-mudflap.h" #include "opts.h" +#include "real.h" cpp_reader *parse_in; /* Declared in c-pragma.h. */ @@ -2326,17 +2327,24 @@ c_common_truthvalue_conversion (tree expr) case TRUTH_OR_EXPR: case TRUTH_XOR_EXPR: case TRUTH_NOT_EXPR: - TREE_TYPE (expr) = truthvalue_type_node; + if (TREE_TYPE (expr) != truthvalue_type_node) + return build2 (TREE_CODE (expr), truthvalue_type_node, + TREE_OPERAND (expr, 0), TREE_OPERAND (expr, 1)); return expr; case ERROR_MARK: return expr; case INTEGER_CST: - return integer_zerop (expr) ? truthvalue_false_node : truthvalue_true_node; + /* Avoid integer_zerop to ignore TREE_CONSTANT_OVERFLOW. */ + return (TREE_INT_CST_LOW (expr) != 0 || TREE_INT_CST_HIGH (expr) != 0) + ? truthvalue_true_node + : truthvalue_false_node; case REAL_CST: - return real_zerop (expr) ? truthvalue_false_node : truthvalue_true_node; + return real_compare (NE_EXPR, &TREE_REAL_CST (expr), &dconst0) + ? truthvalue_true_node + : truthvalue_false_node; case ADDR_EXPR: { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dfc3aa5..e2ef31b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-01-05 Roger Sayle <roger@eyesopen.com> + + PR middle-end/19100 + * gcc.dg/conv-3.c: New test case. + 2005-01-05 Joseph S. Myers <joseph@codesourcery.com> * gcc.dg/asm-wide-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/conv-3.c b/gcc/testsuite/gcc.dg/conv-3.c new file mode 100644 index 0000000..3b4f430 --- /dev/null +++ b/gcc/testsuite/gcc.dg/conv-3.c @@ -0,0 +1,18 @@ +/* PR middle-end/19100 */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +void abort (void); + +int test (int v) +{ + return ((signed char) (v ? 0x100 : 0)) ? 17 : 18; +} + +int main() +{ + if (test (2) != 18) + abort (); + return 0; +} + |