@@ -2483,15 +2483,47 @@ fn (mut g Gen) call_args(node ast.CallExpr) {
24832483 }
24842484 } else if arg.expr is ast.ArrayDecompose {
24852485 mut d_count := 0
2486- for d_i in i .. expected_types.len {
2487- g.write ('*(${g .styp (expected_types [d_i ])}*)builtin__array_get(' )
2488- g.expr (arg.expr)
2489- g.write (', ${d_count })' )
2490-
2491- if d_i < expected_types.len - 1 {
2492- g.write (', ' )
2486+ remaining_params := expected_types.len - i
2487+ if ! arg.expr.expr_type.has_flag (.variadic) && remaining_params > 0 {
2488+ tmp_array := g.new_tmp_var ()
2489+ line := g.go_before_last_stmt ()
2490+ array_typ := g.styp (arg.expr.expr_type)
2491+ g.write ('\t ${array_typ } ${tmp_array } = ' )
2492+ g.expr (arg.expr.expr)
2493+ g.writeln (';' )
2494+ g.writeln ('if (${tmp_array }.len < ${remaining_params }) {' )
2495+ elem_word := if remaining_params == 1 { 'element is' } else { 'elements are' }
2496+ tmp_err_msg := g.new_tmp_var ()
2497+ g.writeln ('\t string ${tmp_err_msg };' )
2498+ g.writeln ('\t if (${tmp_array }.len == 1) {' )
2499+ g.writeln ('\t\t ${tmp_err_msg } = builtin__str_intp(2, _MOV((StrIntpData[]){' )
2500+ g.writeln ('\t\t\t {_S("array decompose: array has "), 0xfe07, {.d_i32 = ${tmp_array }.len}},' )
2501+ g.writeln ('\t\t\t {_S(" element but ${remaining_params } ${elem_word } needed"), 0, {.d_c = 0 }}}));' )
2502+ g.writeln ('\t } else {' )
2503+ g.writeln ('\t\t ${tmp_err_msg } = builtin__str_intp(2, _MOV((StrIntpData[]){' )
2504+ g.writeln ('\t\t\t {_S("array decompose: array has "), 0xfe07, {.d_i32 = ${tmp_array }.len}},' )
2505+ g.writeln ('\t\t\t {_S(" elements but ${remaining_params } ${elem_word } needed"), 0, {.d_c = 0 }}}));' )
2506+ g.writeln ('\t }' )
2507+ g.writeln ('\t builtin___v_panic(${tmp_err_msg });' )
2508+ g.writeln ('}' )
2509+ g.write (line.trim_left ('\t ' ))
2510+ for d_i in i .. expected_types.len {
2511+ g.write ('*(${g .styp (expected_types [d_i ])}*)builtin__array_get(${tmp_array }, ${d_count })' )
2512+ if d_i < expected_types.len - 1 {
2513+ g.write (', ' )
2514+ }
2515+ d_count++
2516+ }
2517+ } else {
2518+ for d_i in i .. expected_types.len {
2519+ g.write ('*(${g .styp (expected_types [d_i ])}*)builtin__array_get(' )
2520+ g.expr (arg.expr)
2521+ g.write (', ${d_count })' )
2522+ if d_i < expected_types.len - 1 {
2523+ g.write (', ' )
2524+ }
2525+ d_count++
24932526 }
2494- d_count++
24952527 }
24962528 already_decomposed = true
24972529 continue
0 commit comments