mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-17 01:11:45 +00:00
allow casts between pointers and integers
This commit is contained in:
parent
a08efafb7a
commit
6086aa2b99
2 changed files with 19 additions and 2 deletions
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue