From 93df2f65eca3ad532808567f18de1476006b8fbc Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Thu, 24 Oct 2024 03:45:24 -0300 Subject: [PATCH] cgen: fix selector indexexpr with fntype on assignment (fix #22635) (#22637) --- vlib/v/gen/c/cgen.v | 11 ++++++++++- vlib/v/tests/selector_indexexpr_fn_type_assign_test.v | 11 +++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/selector_indexexpr_fn_type_assign_test.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 28d172a26..dcef21b11 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -4063,8 +4063,14 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) { if !receiver.typ.is_ptr() { g.write('memdup_uncollectable(') } + mut has_addr := false if !node.expr_type.is_ptr() { - g.write('&') + if node.expr is ast.IndexExpr { + has_addr = true + g.write('ADDR(${g.styp(node.expr_type)}, ') + } else { + g.write('&') + } } if !node.expr.is_lvalue() { current_stmt := g.go_before_last_stmt() @@ -4075,6 +4081,9 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) { } else { g.expr(node.expr) } + if has_addr { + g.write(')') + } if !receiver.typ.is_ptr() { g.write(', sizeof(${expr_styp}))') } diff --git a/vlib/v/tests/selector_indexexpr_fn_type_assign_test.v b/vlib/v/tests/selector_indexexpr_fn_type_assign_test.v new file mode 100644 index 000000000..03042e159 --- /dev/null +++ b/vlib/v/tests/selector_indexexpr_fn_type_assign_test.v @@ -0,0 +1,11 @@ +fn test_main() { + a := 'abcd' + b := a[0].str + println(typeof(b).name) + assert b() == u8(`a`).str() + + c := [1] + d := c[0].str + println(typeof(d).name) + assert d() == '1' +} -- 2.39.5