Skip to content

Commit 42638cb

Browse files
authored
cgen: fix codegen for interface method closure get (fix #24810) (#24818)
1 parent 6cbffd5 commit 42638cb

2 files changed

Lines changed: 24 additions & 1 deletion

File tree

‎vlib/v/gen/c/cgen.v‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4473,7 +4473,7 @@ fn (mut g Gen) gen_closure_fn(expr_styp string, m ast.Fn, name string) {
44734473
method_name = g.generic_fn_name(rec_sym.info.concrete_types, m.name)
44744474
}
44754475
}
4476-
if rec_sym.info is ast.Interface {
4476+
if rec_sym.info is ast.Interface && rec_sym.info.get_methods().contains(method_name) {
44774477
left_cc_type := g.cc_type(g.table.unaliased_type(receiver.typ), false)
44784478
left_type_name := util.no_dots(left_cc_type)
44794479
sb.write_string('${c_name(left_type_name)}_name_table[a0->_typ]._method_${method_name}(')
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
interface Doer {
2+
job string
3+
}
4+
5+
fn (d Doer) do() string {
6+
return '${d.job}'
7+
}
8+
9+
struct Expector {
10+
do_fn fn () string @[required]
11+
}
12+
13+
struct Actioner {
14+
job string
15+
}
16+
17+
fn test_main() {
18+
a := &Actioner{'dier'}
19+
e := Expector{
20+
do_fn: Doer(a).do
21+
}
22+
assert e.do_fn() == 'dier'
23+
}

0 commit comments

Comments
 (0)