cgen: fix infix generics bug (#14048)
parent
e65f602a4f
commit
72a7c19f83
|
@ -515,9 +515,15 @@ fn (mut g Gen) infix_expr_is_op(node ast.InfixExpr) {
|
||||||
g.write('_typ $cmp_op ')
|
g.write('_typ $cmp_op ')
|
||||||
// `_Animal_Dog_index`
|
// `_Animal_Dog_index`
|
||||||
sub_type := match node.right {
|
sub_type := match node.right {
|
||||||
ast.TypeNode { node.right.typ }
|
ast.TypeNode {
|
||||||
ast.None { g.table.type_idxs['None__'] }
|
g.unwrap_generic(node.right.typ)
|
||||||
else { ast.Type(0) }
|
}
|
||||||
|
ast.None {
|
||||||
|
g.table.type_idxs['None__']
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ast.Type(0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sub_sym := g.table.sym(sub_type)
|
sub_sym := g.table.sym(sub_type)
|
||||||
g.write('_${sym.cname}_${sub_sym.cname}_index')
|
g.write('_${sym.cname}_${sub_sym.cname}_index')
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
interface Any {}
|
||||||
|
|
||||||
|
struct Concrete {
|
||||||
|
a int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Container {
|
||||||
|
concrete Any
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (container &Container) get_first_struct<T>() ?&T {
|
||||||
|
concrete := container.concrete
|
||||||
|
if concrete is T {
|
||||||
|
println(concrete.a)
|
||||||
|
return concrete
|
||||||
|
}
|
||||||
|
return error("can't cast")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_generic_empty_interface_to_struct() {
|
||||||
|
concrete := Concrete{12345}
|
||||||
|
container := Container{concrete}
|
||||||
|
cast_concrete := container.get_first_struct<Concrete>() or { &Concrete{} }
|
||||||
|
assert 12345 == cast_concrete.a
|
||||||
|
}
|
Loading…
Reference in New Issue