From d46274a29e71d5bb03a1e277cfe6cc50724c4467 Mon Sep 17 00:00:00 2001 From: shove Date: Wed, 17 Jan 2024 05:25:20 +0800 Subject: [PATCH] cgen: add a necessary clone, when the closure param is string/array with -autofree (fix #20498) (#20557) --- vlib/v/gen/c/fn.v | 4 ++++ vlib/v/tests/closure_test.v | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 7648bc3a4c..b55c41859b 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -534,6 +534,10 @@ fn (mut g Gen) gen_anon_fn(mut node ast.AnonFn) { g.write('${var.name}[${i}],') } g.writeln('},') + } else if g.is_autofree && !var.is_mut && var_sym.info is ast.Array { + g.writeln('.${var.name} = array_clone(&${var.name}),') + } else if g.is_autofree && !var.is_mut && var_sym.kind == .string { + g.writeln('.${var.name} = string_clone(${var.name}),') } else { g.writeln('.${var.name} = ${var.name},') } diff --git a/vlib/v/tests/closure_test.v b/vlib/v/tests/closure_test.v index 1061361654..eca3ac6cbc 100644 --- a/vlib/v/tests/closure_test.v +++ b/vlib/v/tests/closure_test.v @@ -243,3 +243,20 @@ fn test_cross_var_assign_with_inherited() { } f() } + +// for issue 20498 +// test array / string as closure params with -auto-free +fn get_func_that_contains_closure() fn () { + arr := [1, 2, 3] + str := '${'a'}bcabc' + return fn [arr, str] () { + assert arr == [1, 2, 3] + assert str == 'abcabc' + } +} + +fn test_array_and_string_as_closure_params_with_autofree() { + func := get_func_that_contains_closure() + func() + assert true +}