From fc99781de25d5b54570f1e9eebdc49d62280daa8 Mon Sep 17 00:00:00 2001 From: shove Date: Mon, 27 Nov 2023 13:36:04 +0800 Subject: [PATCH] checker, cgen: fix generics call with interface arg (fix #19976) (#20002) --- vlib/v/checker/check_types.v | 4 ++-- vlib/v/gen/c/infix.v | 6 +++--- .../v/tests/generics_call_with_interface_arg_test.v | 13 +++++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 vlib/v/tests/generics_call_with_interface_arg_test.v diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index ba6e9e2409a01e..a4b56ebceb02bf 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -279,8 +279,8 @@ fn (mut c Checker) check_expected_call_arg(got ast.Type, expected_ ast.Type, lan } } else { got_typ_sym := c.table.sym(c.unwrap_generic(got)) - expected_typ_sym := c.table.sym(c.unwrap_generic(expected_)) - if expected_typ_sym.kind == .interface_ && c.type_implements(got, expected_, token.Pos{}) { + expected_typ_sym := c.table.sym(c.unwrap_generic(expected)) + if expected_typ_sym.kind == .interface_ && c.type_implements(got, expected, token.Pos{}) { return } diff --git a/vlib/v/gen/c/infix.v b/vlib/v/gen/c/infix.v index d97bdeb26c4e4f..efbde5809dd1b5 100644 --- a/vlib/v/gen/c/infix.v +++ b/vlib/v/gen/c/infix.v @@ -828,7 +828,7 @@ fn (mut g Gen) infix_expr_left_shift_op(node ast.InfixExpr) { } else { g.write(', (') } - g.expr_with_cast(node.right, node.right_type, left.unaliased.clear_flag(.shared_f)) + g.expr_with_cast(node.right, right.typ, left.unaliased.clear_flag(.shared_f)) styp := g.typ(expected_push_many_atype) g.write('), ${tmp_var}, ${styp})') } else { @@ -854,7 +854,7 @@ fn (mut g Gen) infix_expr_left_shift_op(node ast.InfixExpr) { g.write(', _MOV((${elem_type_str}[]){ ') } if array_info.elem_type.has_flag(.option) { - g.expr_with_opt(node.right, node.right_type, array_info.elem_type) + g.expr_with_opt(node.right, right.typ, array_info.elem_type) } else { // if g.autofree needs_clone := !g.is_builtin_mod @@ -863,7 +863,7 @@ fn (mut g Gen) infix_expr_left_shift_op(node ast.InfixExpr) { if needs_clone { g.write('string_clone(') } - g.expr_with_cast(node.right, node.right_type, array_info.elem_type) + g.expr_with_cast(node.right, right.typ, array_info.elem_type) if needs_clone { g.write(')') } diff --git a/vlib/v/tests/generics_call_with_interface_arg_test.v b/vlib/v/tests/generics_call_with_interface_arg_test.v new file mode 100644 index 00000000000000..e7c6252eb3bdd8 --- /dev/null +++ b/vlib/v/tests/generics_call_with_interface_arg_test.v @@ -0,0 +1,13 @@ +import arrays + +interface Foo {} + +fn test_main() { + mut arr := []Foo{} + str := 'abc' + i := 0 + arr = arrays.concat(arr, str, i) + assert arr == [Foo('abc'), Foo(0)] + arr = arrays.concat(arr, Foo(str), Foo(i)) + assert arr == [Foo('abc'), Foo(0), Foo('abc'), Foo(0)] +}