mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-21 09:51:41 +00:00
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:
parent
c4a398850a
commit
237f11c472
2 changed files with 13 additions and 9 deletions
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue