Skip to content

Commit

Permalink
cgen: fix selector with interface var (#22006)
Browse files Browse the repository at this point in the history
  • Loading branch information
felipensp authored Aug 10, 2024
1 parent a741db4 commit 99da572
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 1 deletion.
9 changes: 8 additions & 1 deletion vlib/v/gen/c/cgen.v
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
28 changes: 28 additions & 0 deletions vlib/v/tests/interface_var_selector_test.v
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 99da572

Please sign in to comment.