checker/table: generic fixes
parent
7e55261c17
commit
87d8e70d6d
|
@ -888,13 +888,6 @@ pub fn (mut c Checker) call_fn(mut call_expr ast.CallExpr) table.Type {
|
||||||
c.error('unknown function: $fn_name', call_expr.pos)
|
c.error('unknown function: $fn_name', call_expr.pos)
|
||||||
return table.void_type
|
return table.void_type
|
||||||
}
|
}
|
||||||
if call_expr.generic_type != table.void_type && f.return_type != 0 { // table.t_type {
|
|
||||||
// Handle `foo<T>() T` => `foo<int>() int` => return int
|
|
||||||
sym := c.table.get_type_symbol(f.return_type)
|
|
||||||
if sym.name == 'T' {
|
|
||||||
return call_expr.generic_type
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !found_in_args && call_expr.mod in ['builtin', 'main'] {
|
if !found_in_args && call_expr.mod in ['builtin', 'main'] {
|
||||||
scope := c.file.scope.innermost(call_expr.pos.pos)
|
scope := c.file.scope.innermost(call_expr.pos.pos)
|
||||||
if _ := scope.find_var(fn_name) {
|
if _ := scope.find_var(fn_name) {
|
||||||
|
@ -988,6 +981,13 @@ pub fn (mut c Checker) call_fn(mut call_expr ast.CallExpr) table.Type {
|
||||||
call_expr.pos)
|
call_expr.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if call_expr.generic_type != table.void_type && f.return_type != 0 { // table.t_type {
|
||||||
|
// Handle `foo<T>() T` => `foo<int>() int` => return int
|
||||||
|
sym := c.table.get_type_symbol(f.return_type)
|
||||||
|
if sym.name == 'T' {
|
||||||
|
return call_expr.generic_type
|
||||||
|
}
|
||||||
|
}
|
||||||
return f.return_type
|
return f.return_type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -572,6 +572,9 @@ pub fn (table &Table) qualify_module(mod, file_path string) string {
|
||||||
|
|
||||||
pub fn (table &Table) register_fn_gen_type(fn_name string, typ Type) {
|
pub fn (table &Table) register_fn_gen_type(fn_name string, typ Type) {
|
||||||
mut a := table.fn_gen_types[fn_name]
|
mut a := table.fn_gen_types[fn_name]
|
||||||
|
if typ in a {
|
||||||
|
return
|
||||||
|
}
|
||||||
a << typ
|
a << typ
|
||||||
table.fn_gen_types[fn_name] = a
|
table.fn_gen_types[fn_name] = a
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,9 @@ fn simple<T>(p T) T {
|
||||||
|
|
||||||
fn test_generic_fn() {
|
fn test_generic_fn() {
|
||||||
assert simple<int>(1) == 1
|
assert simple<int>(1) == 1
|
||||||
|
assert simple<int>(1 + 0) == 1
|
||||||
assert simple<string>('g') == 'g'
|
assert simple<string>('g') == 'g'
|
||||||
|
assert simple<string>('g') + 'h' == 'gh'
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue