diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 9cec92a2ed..3c200e9d41 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -4473,7 +4473,7 @@ fn (mut g Gen) gen_closure_fn(expr_styp string, m ast.Fn, name string) { method_name = g.generic_fn_name(rec_sym.info.concrete_types, m.name) } } - if rec_sym.info is ast.Interface { + if rec_sym.info is ast.Interface && rec_sym.info.get_methods().contains(method_name) { left_cc_type := g.cc_type(g.table.unaliased_type(receiver.typ), false) left_type_name := util.no_dots(left_cc_type) sb.write_string('${c_name(left_type_name)}_name_table[a0->_typ]._method_${method_name}(') diff --git a/vlib/v/tests/interfaces/interface_method_closure_test.v b/vlib/v/tests/interfaces/interface_method_closure_test.v new file mode 100644 index 0000000000..c59244d5e4 --- /dev/null +++ b/vlib/v/tests/interfaces/interface_method_closure_test.v @@ -0,0 +1,23 @@ +interface Doer { + job string +} + +fn (d Doer) do() string { + return '${d.job}' +} + +struct Expector { + do_fn fn () string @[required] +} + +struct Actioner { + job string +} + +fn test_main() { + a := &Actioner{'dier'} + e := Expector{ + do_fn: Doer(a).do + } + assert e.do_fn() == 'dier' +}