aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--inline.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/inline.c b/inline.c
index d4323c9..f5a04d1 100644
--- a/inline.c
+++ b/inline.c
@@ -102,8 +102,7 @@ static struct expression * copy_expression(struct expression *expr)
case EXPR_BINOP:
case EXPR_COMMA:
case EXPR_COMPARE:
- case EXPR_LOGICAL:
- case EXPR_ASSIGNMENT: {
+ case EXPR_LOGICAL: {
struct expression *left = copy_expression(expr->left);
struct expression *right = copy_expression(expr->right);
if (left == expr->left && right == expr->right)
@@ -114,11 +113,20 @@ static struct expression * copy_expression(struct expression *expr)
break;
}
+ case EXPR_ASSIGNMENT: {
+ struct expression *left = copy_expression(expr->left);
+ struct expression *right = copy_expression(expr->right);
+ if (expr->op == '=' && left == expr->left && right == expr->right)
+ break;
+ expr = dup_expression(expr);
+ expr->left = left;
+ expr->right = right;
+ break;
+ }
+
/* Dereference */
case EXPR_DEREF: {
struct expression *deref = copy_expression(expr->deref);
- if (deref == expr->deref)
- break;
expr = dup_expression(expr);
expr->deref = deref;
break;