diff options
Diffstat (limited to 'src/compile/promotions.c')
| -rw-r--r-- | src/compile/promotions.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/compile/promotions.c b/src/compile/promotions.c index 68b4f64c..b3cbb361 100644 --- a/src/compile/promotions.c +++ b/src/compile/promotions.c @@ -182,8 +182,10 @@ Text_t compile_to_type(env_t *env, ast_t *ast, type_t *t) { } // Promote values to views-of-values if needed: - if (t->tag == PointerType && Match(t, PointerType)->is_stack && actual->tag != PointerType) - return Texts("stack(", compile_to_type(env, ast, Match(t, PointerType)->pointed), ")"); + if (t->tag == PointerType && Match(t, PointerType)->is_stack && actual->tag != PointerType) { + if (type_eq(actual, Match(t, PointerType)->pointed) && can_be_mutated(env, ast)) + return Texts("&(", compile_lvalue(env, ast), ")"); + } if (!is_incomplete_type(actual)) { Text_t code = compile(env, ast); |
