diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 8f03ab4726a086..1aec14203399eb 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -3981,7 +3981,14 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) { } if !has_embeds { if !node.has_hidden_receiver { - g.write('${g.typ(node.expr_type.idx())}_${m.name}') + if node.expr is ast.Ident && sym.info is ast.Interface { + left_cc_type := g.cc_type(g.table.unaliased_type(node.expr_type), + false) + left_type_name := util.no_dots(left_cc_type) + g.write('${c_name(left_type_name)}_name_table[${node.expr.name}${g.dot_or_ptr(node.expr_type)}_typ]._method_${m.name}') + } else { + g.write('${g.typ(node.expr_type.idx())}_${m.name}') + } return } receiver := m.params[0] diff --git a/vlib/v/tests/interface_var_selector_test.v b/vlib/v/tests/interface_var_selector_test.v new file mode 100644 index 00000000000000..b4df3df234fa3c --- /dev/null +++ b/vlib/v/tests/interface_var_selector_test.v @@ -0,0 +1,28 @@ +interface Module { + import_() +} + +struct TestModule {} + +fn (mod TestModule) import_() { + println("I'm called!") +} + +fn t_func(a voidptr, b &char) bool { + return true +} + +fn import_module[T]() bool { + $if T !is Module { + println("Type doesn't implement Module.") + return + } + + mod := Module(T{}) + + return t_func(mod.import_, &char(T.name.str)) +} + +fn test_main() { + assert import_module[TestModule]() == true +}