From e2d38815162ec66bd55ed8f16dd51ae1b8ec9eae Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 1 Dec 2024 14:21:10 -0300 Subject: [PATCH] checker, cgen: fix array.delete_many() codegen (fix #23024) (#23025) --- vlib/v/checker/fn.v | 13 +++++++++++++ vlib/v/gen/c/fn.v | 6 +++++- .../builtin_arrays/array_delete_many_test.v | 17 +++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/builtin_arrays/array_delete_many_test.v diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 33901bbab..b87aa24ac 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -3637,6 +3637,19 @@ fn (mut c Checker) array_builtin_method_call(mut node ast.CallExpr, left_type as } } node.return_type = ast.void_type + } else if method_name == 'delete_many' { + if node.args.len != 2 { + c.error('`.delete_many()` expected 2 arguments, but got ${node.args.len}', + node.pos) + } else { + for i, mut arg in node.args { + arg_typ := c.expr(mut arg.expr) + c.check_expected_call_arg(arg_typ, ast.int_type, node.language, arg) or { + c.error('${err.msg()} in argument ${i + 1} to `.delete_many()`', arg.pos) + } + } + } + node.return_type = ast.void_type } else if method_name == 'reverse' { c.table.used_features.arr_reverse = true } diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 0f7522ed1..d2f3eb59b 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -1150,12 +1150,16 @@ fn (mut g Gen) gen_array_method_call(node ast.CallExpr, left_type ast.Type, left 'all' { g.gen_array_all(node) } - 'delete', 'drop', 'delete_last' { + 'delete', 'drop', 'delete_last', 'delete_many' { g.write('array_${node.name}(') g.gen_arg_from_type(left_type, node.left) if node.name != 'delete_last' { g.write(', ') g.expr(node.args[0].expr) + if node.name == 'delete_many' { + g.write(', ') + g.expr(node.args[1].expr) + } } g.write(')') } diff --git a/vlib/v/tests/builtin_arrays/array_delete_many_test.v b/vlib/v/tests/builtin_arrays/array_delete_many_test.v new file mode 100644 index 000000000..24ce31e82 --- /dev/null +++ b/vlib/v/tests/builtin_arrays/array_delete_many_test.v @@ -0,0 +1,17 @@ +struct Test[T] { +mut: + values []T +} + +fn (mut t Test[T]) delete_many(start int, end int) { + t.values.delete_many(start, end) +} + +fn test_main() { + mut x := Test[int]{} + x.values = []int{len: 5, init: index} + x.delete_many(1, 3) + assert x.values.len == 2 + assert x.values[0] == 0 + assert x.values[1] == 4 +} -- 2.39.5