aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-common.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2005-01-05 17:27:26 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2005-01-05 17:27:26 +0000
commit010c4d9c147b2bf50580f322fbe94fbde1206971 (patch)
treebd79071ad9a1a01c8b6a9cba6c42a4fdc67ba610 /gcc/c-common.c
parent9368fb8fbc1591c6cc5b20414bff2c1b4f36d05c (diff)
downloadgcc-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
Diffstat (limited to 'gcc/c-common.c')
-rw-r--r--gcc/c-common.c14
1 files changed, 11 insertions, 3 deletions
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:
{