From 75bb38a10c9fa069cfbc731a1f50e4f977447987 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sat, 1 Nov 2025 12:58:52 -0400 Subject: Fix case where `foo.baz.method()` failed to pass `baz` as `(&(foo.baz))` when `foo` was a `&Foo` and `baz.method()` takes a `&Baz`. --- src/compile/assignments.c | 6 +++--- src/compile/promotions.c | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/compile/assignments.c b/src/compile/assignments.c index 74d1b543..c0f45f5b 100644 --- a/src/compile/assignments.c +++ b/src/compile/assignments.c @@ -183,9 +183,9 @@ Text_t compile_lvalue(env_t *env, ast_t *ast) { compile_type_info(container_t), ")"); } return Texts("*(", compile_type(Type(PointerType, table_type->value_type)), ")Table$reserve(", - compile_to_pointer_depth(env, index->indexed, 1, false), ", ", - compile_to_type(env, index->index, Type(PointerType, table_type->key_type, .is_stack = true)), - ", NULL,", compile_type_info(container_t), ")"); + compile_to_pointer_depth(env, index->indexed, 1, false), ", ", "stack(", + compile_to_type(env, index->index, table_type->key_type), ")", ", NULL,", + compile_type_info(container_t), ")"); } else { code_err(ast, "I don't know how to assign to this target"); } 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); -- cgit v1.2.3