summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorschwab <schwab@138bc75d-0d04-0410-961f-82ee72b054a4>1998-06-19 01:46:50 +0000
committerschwab <schwab@138bc75d-0d04-0410-961f-82ee72b054a4>1998-06-19 01:46:50 +0000
commita0748b7d9732433c1258d463088aebc04e6283a8 (patch)
tree511e2ebe6a5a9b3cd70413e4381c906b737049fb /gcc
parent6c2f7b46e3440e5108af77ea1c48f43dc538edd6 (diff)
downloadgcc-a0748b7d9732433c1258d463088aebc04e6283a8.tar.gz
* c-common.c (truthvalue_conversion): Protect side effects in the
expression when splitting a complex value. * fold-const.c (fold): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@20580 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-common.c15
-rw-r--r--gcc/fold-const.c12
3 files changed, 23 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5afe85f9894..af13373f7ae 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Fri Jun 19 10:43:52 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * c-common.c (truthvalue_conversion): Protect side effects in the
+ expression when splitting a complex value.
+ * fold-const.c (fold): Likewise.
+
Fri Jun 19 02:31:16 1998 Klaus Kaempf (kkaempf@progis.de)
* cccp.c (hack_vms_include_specification): rewrite to handle
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 9983cdbc5ef..3a22c174180 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -2670,12 +2670,15 @@ truthvalue_conversion (expr)
}
if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
- return (build_binary_op
- ((TREE_SIDE_EFFECTS (expr)
- ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
- truthvalue_conversion (build_unary_op (REALPART_EXPR, expr, 0)),
- truthvalue_conversion (build_unary_op (IMAGPART_EXPR, expr, 0)),
- 0));
+ {
+ tree tem = save_expr (expr);
+ return (build_binary_op
+ ((TREE_SIDE_EFFECTS (expr)
+ ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
+ truthvalue_conversion (build_unary_op (REALPART_EXPR, tem, 0)),
+ truthvalue_conversion (build_unary_op (IMAGPART_EXPR, tem, 0)),
+ 0));
+ }
return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
}
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 73b01892465..30499a178de 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -5656,10 +5656,14 @@ fold (expr)
|| TREE_CODE (arg1) == COMPLEX_EXPR))
{
tree subtype = TREE_TYPE (TREE_TYPE (arg0));
- tree real0 = fold (build1 (REALPART_EXPR, subtype, arg0));
- tree imag0 = fold (build1 (IMAGPART_EXPR, subtype, arg0));
- tree real1 = fold (build1 (REALPART_EXPR, subtype, arg1));
- tree imag1 = fold (build1 (IMAGPART_EXPR, subtype, arg1));
+ tree real0, imag0, real1, imag1;
+
+ arg0 = save_expr (arg0);
+ arg1 = save_expr (arg1);
+ real0 = fold (build1 (REALPART_EXPR, subtype, arg0));
+ imag0 = fold (build1 (IMAGPART_EXPR, subtype, arg0));
+ real1 = fold (build1 (REALPART_EXPR, subtype, arg1));
+ imag1 = fold (build1 (IMAGPART_EXPR, subtype, arg1));
return fold (build ((code == EQ_EXPR ? TRUTH_ANDIF_EXPR
: TRUTH_ORIF_EXPR),