aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/c-common.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/conv-3.c18
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;
+}
+