diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 257d5bd19..9bc14fa9d 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -2238,6 +2238,7 @@ address_expr (expr_t *e1, expr_t *e2, type_t *t) return new_label_ref (&e1->e.label); case ex_temp: e = new_unary_expr ('&', e1); + e->e.expr.type = pointer_type (t); break; default: return error (e1, "invalid type for unary &"); diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index 948b5558f..79f2ba3d3 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -706,10 +706,12 @@ expr_call (sblock_t *sblock, expr_t *call, operand_t **op) static sblock_t * expr_address (sblock_t *sblock, expr_t *e, operand_t **op) { - if (e->type == ex_uexpr) { - sblock = statement_subexpr (sblock, e->e.expr.e1, op); - (*op)->type = ev_pointer; - } + statement_t *s; + s = new_statement (st_expr, "&", e); + sblock = statement_subexpr (sblock, e->e.expr.e1, &s->opa); + s->opc = temp_operand (e->e.expr.type); + sblock_add_statement (sblock, s); + *(op) = s->opc; return sblock; }