From c909513351a5f85774e2463fe3702f31919b5d17 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 19 Oct 2025 08:10:42 -0300 Subject: [PATCH] cgen: fix markused for option generic param (fix #25501) (#25525) --- vlib/v/markused/walker.v | 19 +++++++++++++------ .../options/option_generic_array_mut_test.v | 11 +++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 vlib/v/tests/options/option_generic_array_mut_test.v diff --git a/vlib/v/markused/walker.v b/vlib/v/markused/walker.v index e25a252ec..34bb07c0a 100644 --- a/vlib/v/markused/walker.v +++ b/vlib/v/markused/walker.v @@ -1100,16 +1100,23 @@ pub fn (mut w Walker) call_expr(mut node ast.CallExpr) { } else if node.return_type.has_flag(.result) { w.used_result++ } - if stmt.params.len > 1 && stmt.generic_names.len > 0 { + if ((node.is_method && stmt.params.len > 1) || !node.is_method) + && stmt.generic_names.len > 0 { // mark concrete []T param as used - for concrete_type_list in w.table.fn_generic_types[node.fkey()] { + max_param_len := if node.is_method { stmt.params.len - 1 } else { stmt.params.len } + param_i := if node.is_method { 1 } else { 0 } + for concrete_type_list in w.table.fn_generic_types[fn_name] { for k, concrete_type in concrete_type_list { - if k >= stmt.params.len - 1 { + if k >= max_param_len { break } - param_typ := stmt.params[k + 1].typ - if param_typ.has_flag(.generic) && w.table.type_kind(param_typ) == .array { - w.mark_by_type(w.table.find_or_register_array(concrete_type)) + param_typ := stmt.params[k + param_i].typ + if param_typ.has_flag(.generic) { + if w.table.type_kind(param_typ) == .array { + w.mark_by_type(w.table.find_or_register_array(concrete_type)) + } else if param_typ.has_flag(.option) { + w.used_option++ + } } } } diff --git a/vlib/v/tests/options/option_generic_array_mut_test.v b/vlib/v/tests/options/option_generic_array_mut_test.v new file mode 100644 index 000000000..0f1bf295c --- /dev/null +++ b/vlib/v/tests/options/option_generic_array_mut_test.v @@ -0,0 +1,11 @@ +fn test_main() { + mut arr := []int{} + mut bbb := unwrap(mut arr) + bbb << 1 + assert bbb.len == 1 + assert bbb == [1] +} + +fn unwrap[T](mut t ?&T) T { + return t or { panic('unexpected `none`') } +} -- 2.39.5