From 237f11c472a8da826682fd111d0c432b37cdabf5 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 8 Apr 2011 13:55:26 +0900 Subject: [PATCH] Fix cast expressions. Casting between ints and floats needs special treatment to get the conversion operator, but other casts need to be aliases. --- tools/qfcc/source/expr.c | 6 +++++- tools/qfcc/source/statements.c | 16 ++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) 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; }