diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 11d594c01..cedeaf87b 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -2622,7 +2622,11 @@ cast_expr (type_t *type, expr_t *e) if (is_array (e_type)) { return address_expr (e, 0, 0); } - if (e->type == ex_uexpr && e->e.expr.op == '.') { + if ((is_float (type) && is_integral (e_type)) + || (is_integral (type) && is_float (e_type))) { + c = new_unary_expr ('C', e); + c->e.expr.type = type; + } else if (e->type == ex_uexpr && e->e.expr.op == '.') { e->e.expr.type = type; c = e; } else { diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index a240d02b0..388f0c173 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -618,22 +618,22 @@ expr_alias (sblock_t *sblock, expr_t *e, operand_t **op) static sblock_t * expr_cast (sblock_t *sblock, expr_t *e, operand_t **op) { - operand_t *src = 0; + type_t *src_type; type_t *type = e->e.expr.type; statement_t *s; - sblock = statement_subexpr (sblock, e->e.expr.e1, &src); - if ((src->type == ev_integer && type->type == ev_float) - || (src->type == ev_float && type->type == ev_integer)) { - if (!*op) - *op = temp_operand (e->e.expr.type); + src_type = get_type (e->e.expr.e1); + if ((src_type->type == ev_integer && type->type == ev_float) + || (src_type->type == ev_float && type->type == ev_integer)) { + operand_t *src = 0; + sblock = statement_subexpr (sblock, e->e.expr.e1, &src); + *op = temp_operand (e->e.expr.type); s = new_statement ("=", e); s->opa = src; s->opc = *op; sblock_add_statement (sblock, s); } else { - src->type = low_level_type (e->e.expr.type); - *op = src; + sblock = expr_alias (sblock, e, op); } return sblock; }