From 4d7e3578f7c3b4fe095fcf98dd2b5351f4147d7b Mon Sep 17 00:00:00 2001 From: Krchi <997054144@qq.com> Date: Sun, 14 Dec 2025 19:17:26 +0800 Subject: [PATCH] checker,cgen: fix variadic call on sumtype with array of itself (fix #25898) (#25964) --- vlib/v/checker/fn.v | 3 +- .../tests/sumtype_array_to_variadic.vv | 2 +- vlib/v/gen/c/fn.v | 3 +- ...iadic_sumtype_with_it_array_variant_test.v | 29 +++++++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 vlib/v/tests/fns/call_args_variadic_sumtype_with_it_array_variant_test.v diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index ef418d942..cc7c04ade 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -4068,7 +4068,8 @@ fn (mut c Checker) check_variadic_arg(arg_expr ast.Expr, typ ast.Type, expected_ styp := c.table.type_to_str(typ) elem_styp := c.table.type_to_str(expected_type) expected_kind := c.table.sym(expected_type).kind - sum_type_needs_spread := expected_kind == .sum_type && is_single_array_arg + sum_type_needs_spread := expected_kind == .sum_type + && !c.table.sumtype_has_variant(expected_type, typ, false) && is_single_array_arg if kind == .array && !is_decompose && !allow_variadic_pass && (expected_kind !in [.sum_type, .interface] || sum_type_needs_spread) && !param_typ.has_flag(.generic) && expected_type != typ { diff --git a/vlib/v/checker/tests/sumtype_array_to_variadic.vv b/vlib/v/checker/tests/sumtype_array_to_variadic.vv index 711374ae7..1ba594821 100644 --- a/vlib/v/checker/tests/sumtype_array_to_variadic.vv +++ b/vlib/v/checker/tests/sumtype_array_to_variadic.vv @@ -2,7 +2,7 @@ type Nil = u8 const c_nil = Nil(`\0`) -pub type Value = Nil | int | string | []Value | Map +pub type Value = Nil | int | string | Map pub fn (v Value) string() string { return '${v.str()}' diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 2da8a8de7..52bfe22cd 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -2647,7 +2647,8 @@ fn (mut g Gen) call_args(node ast.CallExpr) { if variadic_count == 1 && ((args[arg_nr].typ.has_flag(.variadic) && args[arg_nr].typ == varg_type) || (varg_type.has_flag(.variadic) - && args[arg_nr].typ == varg_type.clear_flag(.variadic))) { + && args[arg_nr].typ == varg_type.clear_flag(.variadic) + && !g.table.sumtype_has_variant(arr_info.elem_type, args[arg_nr].typ, false))) { g.ref_or_deref_arg(args[arg_nr], arr_info.elem_type, node.language, false) } else { diff --git a/vlib/v/tests/fns/call_args_variadic_sumtype_with_it_array_variant_test.v b/vlib/v/tests/fns/call_args_variadic_sumtype_with_it_array_variant_test.v new file mode 100644 index 000000000..79541e26c --- /dev/null +++ b/vlib/v/tests/fns/call_args_variadic_sumtype_with_it_array_variant_test.v @@ -0,0 +1,29 @@ +type Any = []Any | int + +fn print_any(arr ...Any) { + if any := arr[0] { + match any { + int { + assert any == 1 + } + []Any { + assert any == [Any(1)] + } + } + } + println(arr) +} + +fn print_int_any(_ int, arr ...Any) { + print_any(...arr) +} + +fn test_main() { + print_any(1, Any(1), [Any(1)]) + print_any(1) + print_any(Any(1)) + print_any([Any(1)]) + print_any([Any(1)], 1) + print_int_any(1, 1) + print_int_any(1, [Any(1)]) +} -- 2.39.5