From 9a2df0df0e0bdfa74c4f3036583c6a6ae939eb24 Mon Sep 17 00:00:00 2001 From: yuyi Date: Mon, 28 Feb 2022 19:31:04 +0800 Subject: [PATCH] cgen: fix fn mut argument of interface type (#13616) --- vlib/v/gen/c/fn.v | 5 ++++ vlib/v/tests/fn_mut_arg_of_interface_test.v | 27 +++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 vlib/v/tests/fn_mut_arg_of_interface_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 868ad196e4..3d7e06364d 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -1709,6 +1709,11 @@ fn (mut g Gen) ref_or_deref_arg(arg ast.CallArg, expected_type ast.Type, lang as g.write('&/*sum*/') g.expr(arg.expr) return + } else if arg_sym.kind == .interface_ && exp_sym.kind == .interface_ + && (arg.expr is ast.Ident || arg.expr is ast.SelectorExpr) { + g.write('&/*iface*/') + g.expr(arg.expr) + return } } if !g.is_json_fn { diff --git a/vlib/v/tests/fn_mut_arg_of_interface_test.v b/vlib/v/tests/fn_mut_arg_of_interface_test.v new file mode 100644 index 0000000000..7d96706455 --- /dev/null +++ b/vlib/v/tests/fn_mut_arg_of_interface_test.v @@ -0,0 +1,27 @@ +interface TheInterface { +mut: + an_interface() ? +} + +struct Implementation { +} + +fn (mut i Implementation) an_interface() ? { + return +} + +fn maker() ?TheInterface { + inner := Implementation{} + return inner +} + +fn do(mut inter TheInterface) string { + return 'ok' +} + +fn test_fn_mut_arg_of_interface() ? { + mut inner := maker() ? + ret := do(mut inner) + println(ret) + assert ret == 'ok' +}