allow casts between pointers and integers

This commit is contained in:
Bill Currie 2003-08-24 08:03:25 +00:00
parent a08efafb7a
commit 6086aa2b99
2 changed files with 19 additions and 2 deletions

View file

@ -107,6 +107,7 @@ add_statement_ref (def_t *def, dstatement_t *st, int field)
if (def->alias) {
def = def->alias;
def->users--;
def->used = 1;
reloc_op_def_ofs (def, st_ofs, field);
} else
@ -547,6 +548,20 @@ emit_sub_expr (expr_t *e, def_t *dest)
&& e->e.expr.type->type == ev_func)) {
return def_a;
}
if ((def_a->type->type == ev_pointer
&& (e->e.expr.type->type == ev_integer
|| e->e.expr.type->type == ev_uinteger))
|| ((def_a->type->type == ev_integer
|| def_a->type->type == ev_uinteger)
&& e->e.expr.type->type == ev_pointer)) {
def_t *tmp;
tmp = new_def (e->e.expr.type, 0, def_a->scope);
tmp->ofs = 0;
tmp->alias = def_a;
tmp->users = def_a->users;
tmp->freed = 1;
return tmp;
}
def_b = &def_void;
if (!dest) {
dest = get_tempdef (e->e.expr.type, current_scope);

View file

@ -2365,11 +2365,13 @@ cast_expr (type_t *type, expr_t *e)
if (type == e_type)
return e;
if (!(type->type == ev_pointer && e_type->type == ev_pointer)
if (!(type->type == ev_pointer
&& (e_type->type == ev_pointer
|| e_type == &type_integer || e_type == &type_uinteger))
&& !(type->type == ev_func && e_type->type == ev_func)
&& !(((type == &type_integer || type == &type_uinteger)
&& (e_type == &type_float || e_type == &type_integer
|| e_type == &type_uinteger))
|| e_type == &type_uinteger || e_type->type == ev_pointer))
|| (type == &type_float
&& (e_type == &type_integer || e_type == &type_uinteger)))) {
c = error (e, "can not cast from %s to %s",