Skip to content

Commit 7780f56

Browse files
authored
cgen: fix cast to generic interface (#14708)
1 parent 73b59c7 commit 7780f56

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

vlib/v/gen/c/cgen.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2126,8 +2126,8 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw ast.Type, expected_typ
21262126
g.expr(expr)
21272127
return
21282128
}
2129-
if exp_sym.info is ast.Interface && got_type.idx() != expected_type.idx()
2130-
&& !expected_type.has_flag(.optional) {
2129+
if got_sym.info !is ast.Interface && exp_sym.info is ast.Interface
2130+
&& got_type.idx() != expected_type.idx() && !expected_type.has_flag(.optional) {
21312131
if expr is ast.StructInit && !got_type.is_ptr() {
21322132
g.inside_cast_in_heap++
21332133
got_styp := g.cc_type(got_type.ref(), true)

vlib/v/tests/generics_interface_with_non_generic_method_test.v

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ enum NodeType {
1313

1414
struct EnumTypeFactory {}
1515

16-
fn (f EnumTypeFactory) get_type(type_name string) NodeType {
16+
fn (f &EnumTypeFactory) get_type(type_name string) NodeType {
1717
return match type_name {
1818
'expression' { NodeType.expression }
1919
'statement' { NodeType.statement }
@@ -22,24 +22,34 @@ fn (f EnumTypeFactory) get_type(type_name string) NodeType {
2222
}
2323
}
2424

25+
struct RawNode {
26+
type_name string
27+
}
28+
2529
struct Node<T> {
2630
factory TypeFactory<T>
2731
type_name NodeType
32+
raw_node RawNode
2833
}
2934

30-
fn new_node<T>(type_name string, factory TypeFactory<T>) Node<T> {
35+
fn new_node<T>(factory TypeFactory<T>, raw_node RawNode) ?Node<T> {
3136
return Node<T>{
3237
factory: factory
33-
type_name: factory.get_type(type_name)
38+
type_name: factory.get_type(raw_node.type_name)
39+
raw_node: raw_node
3440
}
3541
}
3642

37-
fn test_generic_interface_with_non_generic_method() {
38-
root1 := new_node<NodeType>('literal', EnumTypeFactory{})
43+
fn program<T>(factory TypeFactory<T>) ? {
44+
root1 := new_node<T>(factory, RawNode{'literal'})?
3945
println(root1)
4046
assert root1.type_name == .literal
4147

42-
root2 := new_node<NodeType>('expression', root1.factory)
48+
root2 := new_node<T>(root1.factory, RawNode{'expression'})?
4349
println(root2)
4450
assert root2.type_name == .expression
4551
}
52+
53+
fn test_generic_interface_with_non_generic_method() ? {
54+
program<NodeType>(&EnumTypeFactory{})?
55+
}

0 commit comments

Comments
 (0)