mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-17 01:11:45 +00:00
fix incorrect users for temps resulting from casting the result of ?:
There are probably other situations, but I'll fix them as they show up.
This commit is contained in:
parent
d558444b77
commit
40fefff847
3 changed files with 18 additions and 1 deletions
|
@ -191,6 +191,7 @@ expr_t *new_param_expr (struct type_s *type, int num);
|
|||
expr_t *new_move_expr (expr_t *e1, expr_t *e2, struct type_s *type);
|
||||
|
||||
void inc_users (expr_t *e);
|
||||
void dec_users (expr_t *e);
|
||||
void convert_name (expr_t *e);
|
||||
|
||||
expr_t *append_expr (expr_t *block, expr_t *e);
|
||||
|
|
|
@ -151,7 +151,14 @@ convert_to_float (expr_t *e)
|
|||
case ex_uexpr:
|
||||
case ex_temp:
|
||||
case ex_block:
|
||||
return cast_expr (&type_float, e);
|
||||
e = cast_expr (&type_float, e);
|
||||
// The expression of which this is a sub-expression has already
|
||||
// incremented users, so we don't need cast_expr to do so again,
|
||||
// however, since cast_expr does so unconditionally, we must undo
|
||||
// the increment.
|
||||
if (e && e->type == ex_uexpr && e->e.expr.op == 'C')
|
||||
dec_users (e->e.expr.e1);
|
||||
return e;
|
||||
default:
|
||||
internal_error (e);
|
||||
}
|
||||
|
|
|
@ -336,6 +336,15 @@ inc_users (expr_t *e)
|
|||
inc_users (e->e.block.result);
|
||||
}
|
||||
|
||||
void
|
||||
dec_users (expr_t *e)
|
||||
{
|
||||
if (e && e->type == ex_temp)
|
||||
e->e.temp.users--;
|
||||
else if (e && e->type == ex_block)
|
||||
dec_users (e->e.block.result);
|
||||
}
|
||||
|
||||
expr_t *
|
||||
new_expr (void)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue