Skip to content

Commit 58477f3

Browse files
authored
cgen: fix variadic on translated (fix #25862) (#25876)
1 parent 0a143f6 commit 58477f3

File tree

5 files changed

+14
-1
lines changed

5 files changed

+14
-1
lines changed

vlib/v/ast/ast.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,7 @@ pub mut:
832832
is_file_translated bool // true, when the file it resides in is `@[translated]`
833833
is_static_method bool // it is a static method call
834834
is_variadic bool
835+
is_c_variadic bool // it is a C variadic
835836
args []CallArg
836837
expected_arg_types []Type
837838
comptime_ret_val bool

vlib/v/checker/fn.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2957,6 +2957,7 @@ fn (mut c Checker) check_expected_arg_count(mut node ast.CallExpr, f &ast.Fn) !
29572957
}
29582958
if f.is_variadic {
29592959
node.is_variadic = f.is_variadic
2960+
node.is_c_variadic = f.is_c_variadic
29602961
min_required_params--
29612962
c.markused_array_method(!c.is_builtin_mod, '')
29622963
} else {

vlib/v/gen/c/fn.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2632,7 +2632,7 @@ fn (mut g Gen) call_args(node ast.CallExpr) {
26322632
}
26332633
} else {
26342634
if variadic_count > 0 {
2635-
if g.pref.translated || g.file.is_translated {
2635+
if node.is_c_variadic {
26362636
// Handle passing e.g. C string literals to `...` C varargs:
26372637
// void DEH_snprintf(char *buffer, size_t len, const char *fmt, ...)
26382638
// deh_snprintf(buffer, 9, c'STCFN%.3d', j++)

vlib/v/parser/fn.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
485485
params_t, are_params_type_only, mut is_variadic, mut is_c_variadic := p.fn_params()
486486
if is_c2v_variadic {
487487
is_variadic = true
488+
is_c_variadic = true
488489
}
489490
params << params_t
490491
// Return type
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
@[translated]
2+
module main
3+
4+
fn foo(args ...string) {
5+
println(args)
6+
}
7+
8+
fn test_main() {
9+
foo(42.str(), 'bar')
10+
}

0 commit comments

Comments
 (0)