Skip to content

Commit 1658c47

Browse files
authored
cgen: fix matching interface types (#8889)
1 parent 15daeae commit 1658c47

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

vlib/v/gen/c/cgen.v

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3610,16 +3610,15 @@ fn (mut g Gen) match_expr_sumtype(node ast.MatchExpr, is_expr bool, cond_var str
36103610
g.write('if (')
36113611
}
36123612
g.write(cond_var)
3613-
// branch_sym := g.table.get_type_symbol(branch.typ)
3613+
dot_or_ptr := if node.cond_type.is_ptr() { '->' } else { '.' }
36143614
if sym.kind == .sum_type {
3615-
dot_or_ptr := if node.cond_type.is_ptr() { '->' } else { '.' }
3616-
g.write(dot_or_ptr)
3617-
g.write('typ == ')
3615+
g.write('${dot_or_ptr}typ == ')
3616+
g.expr(branch.exprs[sumtype_index])
36183617
} else if sym.kind == .interface_ {
3619-
// g.write('._interface_idx == _${sym.name}_${branch_sym} ')
3620-
g.write('._interface_idx == ')
3618+
typ := branch.exprs[sumtype_index] as ast.Type
3619+
branch_sym := g.table.get_type_symbol(typ.typ)
3620+
g.write('${dot_or_ptr}_interface_idx == _${sym.cname}_${branch_sym.cname}_index')
36213621
}
3622-
g.expr(branch.exprs[sumtype_index])
36233622
if is_expr && tmp_var.len == 0 {
36243623
g.write(') ? ')
36253624
} else {

vlib/v/tests/match_interface_test.v

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
interface Animal { name string }
2+
struct Dog { name string }
3+
struct Cat { name string }
4+
5+
fn test_interface_match() {
6+
a := Animal(Dog{name: 'Jet'})
7+
match a {
8+
Dog { assert true }
9+
Cat { assert false }
10+
else { assert false }
11+
}
12+
}

0 commit comments

Comments
 (0)