checker, cgen: fix generic struct with non_generic interface (#11240)
parent
2cb0db633d
commit
a440b43630
|
@ -845,6 +845,10 @@ pub fn (mut c Checker) generic_insts_to_concrete() {
|
||||||
typ.is_public = true
|
typ.is_public = true
|
||||||
typ.kind = parent.kind
|
typ.kind = parent.kind
|
||||||
}
|
}
|
||||||
|
parent_sym := c.table.get_type_symbol(parent_info.parent_type)
|
||||||
|
for method in parent_sym.methods {
|
||||||
|
c.table.register_fn_concrete_types(method.name, info.concrete_types)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ast.Interface {
|
ast.Interface {
|
||||||
mut parent_info := parent.info as ast.Interface
|
mut parent_info := parent.info as ast.Interface
|
||||||
|
|
|
@ -6652,6 +6652,12 @@ static inline $interface_name I_${cctype}_to_Interface_${interface_name}($cctype
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// .speak = Cat_speak
|
// .speak = Cat_speak
|
||||||
|
if st_sym.info is ast.Struct {
|
||||||
|
if st_sym.info.parent_type.has_flag(.generic) {
|
||||||
|
name = g.generic_fn_name(st_sym.info.concrete_types, method.name,
|
||||||
|
false)
|
||||||
|
}
|
||||||
|
}
|
||||||
mut method_call := '${cctype}_$name'
|
mut method_call := '${cctype}_$name'
|
||||||
if !method.params[0].typ.is_ptr() {
|
if !method.params[0].typ.is_ptr() {
|
||||||
// inline void Cat_speak_Interface_Animal_method_wrapper(Cat c) { return Cat_speak(*c); }
|
// inline void Cat_speak_Interface_Animal_method_wrapper(Cat c) { return Cat_speak(*c); }
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
interface Box {
|
||||||
|
transform(input int) int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Test<T> {
|
||||||
|
data T
|
||||||
|
salt int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (t Test<T>) transform(input int) int {
|
||||||
|
return input + t.salt
|
||||||
|
}
|
||||||
|
|
||||||
|
fn box_transform(b Box) int {
|
||||||
|
return b.transform(100)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_generic_struct_with_non_generic_interface() {
|
||||||
|
ret := box_transform(Test<string>{
|
||||||
|
data: 'hello'
|
||||||
|
salt: 6
|
||||||
|
})
|
||||||
|
println(ret)
|
||||||
|
assert ret == 106
|
||||||
|
}
|
Loading…
Reference in New Issue