From 845ce0d8bd95fee0b9037d9118135688de0aa783 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 26 Feb 2026 20:00:32 +0300 Subject: [PATCH] cgen: fix error when trying to convey a variadic argument (fixes #22049) --- vlib/v/gen/c/fn.v | 16 +++++++++++++++- vlib/v/tests/fns/fn_variadic_test.v | 13 +++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 7e76b9186..fd085d103 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -2566,7 +2566,21 @@ fn (mut g Gen) call_args(node ast.CallExpr) { } else if arg.expr is ast.ArrayDecompose { mut d_count := 0 remaining_params := expected_types.len - i - if !arg.expr.expr_type.has_flag(.variadic) && remaining_params > 0 { + if node.language == .v && node.is_variadic && arg.expr.expr_type.has_flag(.variadic) + && remaining_params > 0 && i < expected_types.len - 1 { + tmp_array := g.new_tmp_var() + line := g.go_before_last_stmt() + array_typ := g.styp(arg.expr.expr_type) + g.write('\t${array_typ} ${tmp_array} = ') + g.expr(arg.expr) + g.writeln(';') + g.write(line.trim_left('\t')) + for d_i in i .. expected_types.len - 1 { + g.write('*(${g.styp(expected_types[d_i])}*)builtin__array_get(${tmp_array}, ${d_count}), ') + d_count++ + } + g.write('builtin__array_slice(${tmp_array}, ${d_count}, 2147483647)') + } else if !arg.expr.expr_type.has_flag(.variadic) && remaining_params > 0 { tmp_array := g.new_tmp_var() line := g.go_before_last_stmt() array_typ := g.styp(arg.expr.expr_type) diff --git a/vlib/v/tests/fns/fn_variadic_test.v b/vlib/v/tests/fns/fn_variadic_test.v index 06a1b41f8..71b0e4a74 100644 --- a/vlib/v/tests/fns/fn_variadic_test.v +++ b/vlib/v/tests/fns/fn_variadic_test.v @@ -48,6 +48,19 @@ fn test_fn_variadic_forward() { assert variadic_forward_a('a', 'b', 'c') == 'abc' } +fn variadic_fn_head_tail(head string, tail ...string) string { + return '${head}|${tail.join(',')}' +} + +fn variadic_forward_with_fixed_arg(args ...string) string { + return variadic_fn_head_tail(...args) +} + +fn test_fn_variadic_forward_with_fixed_arg() { + assert variadic_forward_with_fixed_arg('a') == 'a|' + assert variadic_forward_with_fixed_arg('a', 'b', 'c') == 'a|b,c' +} + fn fn_variadic_with_arg_no_vargs(name string, groups ...VaTestGroup) { assert groups.len == 0 } -- 2.39.5