From 778b83a132168bf0f40a419a95108b473e70c82f Mon Sep 17 00:00:00 2001 From: Enzo Date: Sun, 31 Jan 2021 18:44:55 +0100 Subject: [PATCH] gen: fix multiple blank param with interface (#8480) --- vlib/v/gen/cgen.v | 20 ++++++++++---------- vlib/v/tests/blank_ident_test.v | 12 ++++++++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 9cc1b0398b..da4a8ebbd8 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -6016,22 +6016,22 @@ $staticprefix $interface_name* I_${cctype}_to_Interface_${interface_name}_ptr($c // inline void Cat_speak_method_wrapper(Cat c) { return Cat_speak(*c); } methods_wrapper.write('static inline ${g.typ(method.return_type)}') methods_wrapper.write(' ${method_call}_method_wrapper(') - methods_wrapper.write('$cctype* ${method.params[0].name}') - // TODO g.fn_args - for j in 1 .. method.params.len { - arg := method.params[j] - methods_wrapper.write(', ${g.typ(arg.typ)} $arg.name') + // + params_start_pos := g.out.len + mut params := method.params.clone() + first_param := params[0] // workaround, { params[0] | ... } doesn't work + params[0] = { + first_param | + typ: params[0].typ.set_nr_muls(1) } + fargs, _ := g.fn_args(params, false) // second argument is ignored anyway + methods_wrapper.write(g.out.cut_last(g.out.len - params_start_pos)) methods_wrapper.writeln(') {') methods_wrapper.write('\t') if method.return_type != table.void_type { methods_wrapper.write('return ') } - methods_wrapper.write('${method_call}(*${method.params[0].name}') - for j in 1 .. method.params.len { - methods_wrapper.write(', ${method.params[j].name}') - } - methods_wrapper.writeln(');') + methods_wrapper.writeln('${method_call}(*${fargs.join(', ')});') methods_wrapper.writeln('}') // .speak = Cat_speak_method_wrapper method_call += '_method_wrapper' diff --git a/vlib/v/tests/blank_ident_test.v b/vlib/v/tests/blank_ident_test.v index 2b98ac6053..a526645fc2 100644 --- a/vlib/v/tests/blank_ident_test.v +++ b/vlib/v/tests/blank_ident_test.v @@ -14,6 +14,10 @@ fn fn_with_multiple_blank_param(_ int, _ f32) { _ = 'not an int nor a float' } +interface Foo { + fn_with_multiple_blank_param(int, f32) +} + struct Abc {} fn (_ Abc) fn_with_multiple_blank_param(_ int, _ f32) {} @@ -24,6 +28,14 @@ fn test_fn_with_multiple_blank_param() { a.fn_with_multiple_blank_param(1, 1.1) } +fn call_fn_with_multiple_blank_param(foo Foo) { + foo.fn_with_multiple_blank_param(1, 1.1) +} + +fn test_interface_fn_with_multiple_blank_param() { + call_fn_with_multiple_blank_param(Abc{}) +} + fn test_for_in_range() { for _ in 1 .. 10 { assert true