From 58477f3dc362bbcde6199d1cfb853a0af356d721 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 2 Dec 2025 14:01:01 -0300 Subject: [PATCH] cgen: fix variadic on translated (fix #25862) (#25876) --- vlib/v/ast/ast.v | 1 + vlib/v/checker/fn.v | 1 + vlib/v/gen/c/fn.v | 2 +- vlib/v/parser/fn.v | 1 + vlib/v/tests/fns/translated_variadic_test.v | 10 ++++++++++ 5 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/fns/translated_variadic_test.v diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index 897faf448..eed6837a3 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -832,6 +832,7 @@ pub mut: is_file_translated bool // true, when the file it resides in is `@[translated]` is_static_method bool // it is a static method call is_variadic bool + is_c_variadic bool // it is a C variadic args []CallArg expected_arg_types []Type comptime_ret_val bool diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 00d298cc9..ef418d942 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -2957,6 +2957,7 @@ fn (mut c Checker) check_expected_arg_count(mut node ast.CallExpr, f &ast.Fn) ! } if f.is_variadic { node.is_variadic = f.is_variadic + node.is_c_variadic = f.is_c_variadic min_required_params-- c.markused_array_method(!c.is_builtin_mod, '') } else { diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index f10035b89..2da8a8de7 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -2632,7 +2632,7 @@ fn (mut g Gen) call_args(node ast.CallExpr) { } } else { if variadic_count > 0 { - if g.pref.translated || g.file.is_translated { + if node.is_c_variadic { // Handle passing e.g. C string literals to `...` C varargs: // void DEH_snprintf(char *buffer, size_t len, const char *fmt, ...) // deh_snprintf(buffer, 9, c'STCFN%.3d', j++) diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 7de3ee48e..500fa9849 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -485,6 +485,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl { params_t, are_params_type_only, mut is_variadic, mut is_c_variadic := p.fn_params() if is_c2v_variadic { is_variadic = true + is_c_variadic = true } params << params_t // Return type diff --git a/vlib/v/tests/fns/translated_variadic_test.v b/vlib/v/tests/fns/translated_variadic_test.v new file mode 100644 index 000000000..1a42f1b16 --- /dev/null +++ b/vlib/v/tests/fns/translated_variadic_test.v @@ -0,0 +1,10 @@ +@[translated] +module main + +fn foo(args ...string) { + println(args) +} + +fn test_main() { + foo(42.str(), 'bar') +} -- 2.39.5