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:
Bill Currie 2010-01-13 06:25:06 +00:00 committed by Jeff Teunissen
parent d558444b77
commit 40fefff847
3 changed files with 18 additions and 1 deletions

View file

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

View file

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

View file

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