From 41e045c5531a3cee908a2fe9b423393f43619ee7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 24 Sep 2024 18:05:38 -0300 Subject: [PATCH] cgen: fix codegen for method call on rangeexpr (fix #12610) (#22291) --- vlib/v/gen/c/fn.v | 9 ++++++++- vlib/v/tests/fns/method_call_on_rangeexpr_test.v | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/fns/method_call_on_rangeexpr_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index a86b1f78d5fd0a..e763c02a249dcc 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -1681,7 +1681,9 @@ fn (mut g Gen) method_call(node ast.CallExpr) { if idx is ast.RangeExpr { // expr is arr[range].clone() // use array_clone_static instead of array_clone - name = util.no_dots('${receiver_type_name}_${node.name}_static') + if node.name == 'clone' { + name = util.no_dots('${receiver_type_name}_${node.name}_static') + } is_range_slice = true } } @@ -1759,6 +1761,11 @@ fn (mut g Gen) method_call(node ast.CallExpr) { && g.typ(left_type) == g.typ(node.receiver_type)) { g.write('&') } + } else { + if node.name != 'clone' && !left_type.is_ptr() { + g.write('ADDR(${rec_cc_type}, ') + cast_n++ + } } } else if !node.receiver_type.is_ptr() && left_type.is_ptr() && node.name != 'str' && node.from_embed_types.len == 0 { diff --git a/vlib/v/tests/fns/method_call_on_rangeexpr_test.v b/vlib/v/tests/fns/method_call_on_rangeexpr_test.v new file mode 100644 index 00000000000000..514b7d2725fc51 --- /dev/null +++ b/vlib/v/tests/fns/method_call_on_rangeexpr_test.v @@ -0,0 +1,16 @@ +type Buffer = []u8 + +pub fn (mut sb Buffer) vbytes() string { + return sb[0..sb.len].a().str() +} + +pub fn (mut sb Buffer) a() Buffer { + return sb +} + +fn test_main() { + mut b := Buffer([]u8{cap: 10}) + b << 1 + b << 2 + assert b.vbytes() == 'Buffer([1, 2])' +}