diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-common.c | 15 | ||||
-rw-r--r-- | gcc/fold-const.c | 12 |
3 files changed, 23 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5afe85f..af13373 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 9983cdb..3a22c17 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 73b0189..30499a1 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), |