From f30078a21a696178d428fdea719c5e0dab4b32d8 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 28 Sep 2024 11:11:59 -0300 Subject: [PATCH] cgen: fix codegen for address of range (fix #18528) (#22336) --- vlib/v/gen/c/cgen.v | 12 +++++++++++- vlib/v/gen/c/testdata/addr_from_range.c.must_have | 1 + vlib/v/gen/c/testdata/addr_from_range.out | 1 + vlib/v/gen/c/testdata/addr_from_range.vv | 5 +++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 vlib/v/gen/c/testdata/addr_from_range.c.must_have create mode 100644 vlib/v/gen/c/testdata/addr_from_range.out create mode 100644 vlib/v/gen/c/testdata/addr_from_range.vv diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 9d57ed195..c278393be 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -3711,10 +3711,20 @@ fn (mut g Gen) expr(node_ ast.Expr) { if g.is_option_auto_heap { g.write('(${g.base_type(node.right_type)}*)') } + mut has_slice_call := false if !g.is_option_auto_heap && !(g.is_amp && node.right.is_auto_deref_var()) { - g.write(node.op.str()) + has_slice_call = node.op == .amp && node.right is ast.IndexExpr + && node.right.index is ast.RangeExpr + if has_slice_call { + g.write('ADDR(${g.typ(node.right_type)}, ') + } else { + g.write(node.op.str()) + } } g.expr(node.right) + if has_slice_call { + g.write(')') + } if g.is_option_auto_heap { g.write('.data') } diff --git a/vlib/v/gen/c/testdata/addr_from_range.c.must_have b/vlib/v/gen/c/testdata/addr_from_range.c.must_have new file mode 100644 index 000000000..cede8bf3a --- /dev/null +++ b/vlib/v/gen/c/testdata/addr_from_range.c.must_have @@ -0,0 +1 @@ +Array_int* pointer_to_slice = ADDR(Array_int, array_slice((*(new_data)), 1, 2)); \ No newline at end of file diff --git a/vlib/v/gen/c/testdata/addr_from_range.out b/vlib/v/gen/c/testdata/addr_from_range.out new file mode 100644 index 000000000..c458eb320 --- /dev/null +++ b/vlib/v/gen/c/testdata/addr_from_range.out @@ -0,0 +1 @@ +&[1] diff --git a/vlib/v/gen/c/testdata/addr_from_range.vv b/vlib/v/gen/c/testdata/addr_from_range.vv new file mode 100644 index 000000000..922e64e54 --- /dev/null +++ b/vlib/v/gen/c/testdata/addr_from_range.vv @@ -0,0 +1,5 @@ +fn main() { + new_data := [0, 1] + pointer_to_slice := &new_data[1..2] + println(pointer_to_slice) +} -- 2.39.5