Skip to content

Commit db8d251

Browse files
authored
cgen: fix array decomposing on variadic call (found while working on solving #23474) (#23476)
1 parent 1281957 commit db8d251

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

vlib/v/gen/c/fn.v

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2369,6 +2369,7 @@ fn (mut g Gen) call_args(node ast.CallExpr) {
23692369
// only v variadic, C variadic args will be appended like normal args
23702370
is_variadic := expected_types.len > 0 && expected_types.last().has_flag(.variadic)
23712371
&& node.language == .v
2372+
mut already_decomposed := false
23722373
for i, arg in args {
23732374
if is_variadic && i == expected_types.len - 1 {
23742375
break
@@ -2409,6 +2410,7 @@ fn (mut g Gen) call_args(node ast.CallExpr) {
24092410
}
24102411
d_count++
24112412
}
2413+
already_decomposed = true
24122414
continue
24132415
} else if arg.expr is ast.ComptimeSelector && i < node.expected_arg_types.len
24142416
&& node.expected_arg_types[i].has_flag(.generic) {
@@ -2509,7 +2511,9 @@ fn (mut g Gen) call_args(node ast.CallExpr) {
25092511
// TODOC2V handle this in a better place
25102512
g.expr(args[0].expr)
25112513
} else if args.len > 0 && args.last().expr is ast.ArrayDecompose {
2512-
g.expr(args.last().expr)
2514+
if !already_decomposed {
2515+
g.expr(args.last().expr)
2516+
}
25132517
} else {
25142518
if variadic_count > 0 {
25152519
if g.pref.translated || g.file.is_translated {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import arrays
2+
3+
fn get() []int {
4+
return [1, 2, 3, 4, 5]
5+
}
6+
7+
fn get2() [][]int {
8+
return [[0], [1, 2, 3, 4, 5]]
9+
}
10+
11+
fn receive(a ...int) {
12+
}
13+
14+
fn test_main() {
15+
assert arrays.concat([0], ...get().map(it)) == [0, 1, 2, 3, 4, 5]
16+
assert arrays.concat[int]([], ...get().map(it)) == [1, 2, 3, 4, 5]
17+
assert arrays.concat[[]int]([[0]], ...[get().map(it)]) == [
18+
[0],
19+
[1, 2, 3, 4, 5],
20+
]
21+
assert arrays.concat[int](...get2()) == [0, 1, 2, 3, 4, 5]
22+
}

0 commit comments

Comments
 (0)