From db8d2510a20fcf30d6c96a8229e94392707a35c4 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 15 Jan 2025 14:32:03 -0300 Subject: [PATCH] cgen: fix array decomposing on variadic call (found while working on solving #23474) (#23476) --- vlib/v/gen/c/fn.v | 6 +++++- vlib/v/tests/fns/decompose_variadic_test.v | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/fns/decompose_variadic_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 649ba98abe..76dfc5eb70 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -2369,6 +2369,7 @@ fn (mut g Gen) call_args(node ast.CallExpr) { // only v variadic, C variadic args will be appended like normal args is_variadic := expected_types.len > 0 && expected_types.last().has_flag(.variadic) && node.language == .v + mut already_decomposed := false for i, arg in args { if is_variadic && i == expected_types.len - 1 { break @@ -2409,6 +2410,7 @@ fn (mut g Gen) call_args(node ast.CallExpr) { } d_count++ } + already_decomposed = true continue } else if arg.expr is ast.ComptimeSelector && i < node.expected_arg_types.len && node.expected_arg_types[i].has_flag(.generic) { @@ -2509,7 +2511,9 @@ fn (mut g Gen) call_args(node ast.CallExpr) { // TODOC2V handle this in a better place g.expr(args[0].expr) } else if args.len > 0 && args.last().expr is ast.ArrayDecompose { - g.expr(args.last().expr) + if !already_decomposed { + g.expr(args.last().expr) + } } else { if variadic_count > 0 { if g.pref.translated || g.file.is_translated { diff --git a/vlib/v/tests/fns/decompose_variadic_test.v b/vlib/v/tests/fns/decompose_variadic_test.v new file mode 100644 index 0000000000..95678cef81 --- /dev/null +++ b/vlib/v/tests/fns/decompose_variadic_test.v @@ -0,0 +1,22 @@ +import arrays + +fn get() []int { + return [1, 2, 3, 4, 5] +} + +fn get2() [][]int { + return [[0], [1, 2, 3, 4, 5]] +} + +fn receive(a ...int) { +} + +fn test_main() { + assert arrays.concat([0], ...get().map(it)) == [0, 1, 2, 3, 4, 5] + assert arrays.concat[int]([], ...get().map(it)) == [1, 2, 3, 4, 5] + assert arrays.concat[[]int]([[0]], ...[get().map(it)]) == [ + [0], + [1, 2, 3, 4, 5], + ] + assert arrays.concat[int](...get2()) == [0, 1, 2, 3, 4, 5] +}