Fix cast expressions.

Casting between ints and floats needs special treatment to get the
conversion operator, but other casts need to be aliases.
This commit is contained in:
Bill Currie 2011-04-08 13:55:26 +09:00
parent c4a398850a
commit 237f11c472
2 changed files with 13 additions and 9 deletions

View file

@ -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 {

View file

@ -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;
}