table: fix generic method with multi generic types (#12297)
parent
508f29c101
commit
f62b2dcfa7
|
@ -1690,8 +1690,10 @@ pub fn (mut t Table) generic_insts_to_concrete() {
|
||||||
|
|
||||||
parent_sym := t.get_type_symbol(parent_info.parent_type)
|
parent_sym := t.get_type_symbol(parent_info.parent_type)
|
||||||
for method in parent_sym.methods {
|
for method in parent_sym.methods {
|
||||||
|
if method.generic_names.len == info.concrete_types.len {
|
||||||
t.register_fn_concrete_types(method.name, info.concrete_types)
|
t.register_fn_concrete_types(method.name, info.concrete_types)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
util.verror('generic error', 'the number of generic types of struct `$parent.name` is inconsistent with the concrete types')
|
util.verror('generic error', 'the number of generic types of struct `$parent.name` is inconsistent with the concrete types')
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
interface Something {
|
||||||
|
i int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Some {
|
||||||
|
i int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct App<M> {
|
||||||
|
f M
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut self App<M>) next<M, T>(input T) f64 {
|
||||||
|
$if M is Something {
|
||||||
|
return 0
|
||||||
|
} $else {
|
||||||
|
panic('${typeof(M.typ).name} is not supported')
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_generic_method_with_multi_types() {
|
||||||
|
mut app := App<Some>{
|
||||||
|
f: Some{
|
||||||
|
i: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert app.next(1) == 0
|
||||||
|
}
|
Loading…
Reference in New Issue