From ad9ca349dc8e0c17de5636ebd9b17a6a1830d10e Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Thu, 29 Dec 2022 03:45:47 +0530 Subject: [PATCH] cgen: fix generics array delete (#16794) --- vlib/v/gen/c/fn.v | 20 ++++++++++++++++++++ vlib/v/tests/generics_array_drop_test.v | 11 +++++++++++ 2 files changed, 31 insertions(+) create mode 100644 vlib/v/tests/generics_array_drop_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 58d5364219..f10b8d46b4 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -959,6 +959,26 @@ fn (mut g Gen) method_call(node ast.CallExpr) { g.expr(node.args[0].expr) g.write(')') return + } else if left_sym.kind == .array && node.name == 'drop' { + g.write('array_drop(') + if left_type.has_flag(.shared_f) { + if left_type.is_ptr() { + g.write('&') + } + g.expr(node.left) + g.write('->val') + } else { + if left_type.is_ptr() { + g.expr(node.left) + } else { + g.write('&') + g.expr(node.left) + } + } + g.write(', ') + g.expr(node.args[0].expr) + g.write(')') + return } if left_sym.kind in [.sum_type, .interface_] { diff --git a/vlib/v/tests/generics_array_drop_test.v b/vlib/v/tests/generics_array_drop_test.v new file mode 100644 index 0000000000..529eb0480d --- /dev/null +++ b/vlib/v/tests/generics_array_drop_test.v @@ -0,0 +1,11 @@ +fn shift[T](mut a []T) T { + res := a.first() + a.drop(1) + return res +} + +fn test_generic_array_drop() { + mut a := ['x', 'y'] + assert shift(mut a) == 'x' // 'x' + assert a == ['y'] // ['y'] +}