aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
-rw-r--r--evaluate.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/evaluate.c b/evaluate.c
index a0ec99a1..4be62db4 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -116,7 +116,7 @@ static struct symbol *bigger_int_type(struct symbol *left, struct symbol *right)
return ctype_integer(mod);
}
-static struct expression * promote(struct expression *old, struct symbol *type)
+static struct expression * cast_to(struct expression *old, struct symbol *type)
{
struct expression *expr = alloc_expression(old->token, EXPR_CAST);
expr->ctype = type;
@@ -156,9 +156,9 @@ static struct symbol * compatible_integer_binop(struct expression *expr)
/* Don't bother promoting same-size entities, it only adds clutter */
if (ltype->bit_size != ctype->bit_size)
- expr->left = promote(left, ctype);
+ expr->left = cast_to(left, ctype);
if (rtype->bit_size != ctype->bit_size)
- expr->right = promote(right, ctype);
+ expr->right = cast_to(right, ctype);
return ctype;
}
return NULL;
@@ -361,7 +361,12 @@ static int evaluate_compare(struct expression *expr)
static int evaluate_assignment(struct expression *expr)
{
+ struct expression *left = expr->left, *right = expr->right;
+ struct symbol *ltype = left->ctype, *rtype = right->ctype;
+
// FIXME! We need to cast and check the rigth side!
+ if (ltype->bit_size != rtype->bit_size)
+ expr->right = cast_to(right, ltype);
expr->ctype = expr->left->ctype;
return 1;
}