checker: fix error for array of anon fn call (#13858)

pull/13865/head
yuyi 2022-03-29 23:04:30 +08:00 committed by GitHub
parent 04cc037955
commit c71770d9c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View File

@ -531,6 +531,7 @@ pub fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool)
info := sym.info as ast.Array
elem_typ := c.table.sym(info.elem_type)
if elem_typ.info is ast.FnType {
node.return_type = elem_typ.info.func.return_type
return elem_typ.info.func.return_type
} else {
c.error('cannot call the element of the array, it is not a function',
@ -540,6 +541,7 @@ pub fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool)
info := sym.info as ast.Map
value_typ := c.table.sym(info.value_type)
if value_typ.info is ast.FnType {
node.return_type = value_typ.info.func.return_type
return value_typ.info.func.return_type
} else {
c.error('cannot call the value of the map, it is not a function', node.pos)
@ -548,13 +550,12 @@ pub fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool)
info := sym.info as ast.ArrayFixed
elem_typ := c.table.sym(info.elem_type)
if elem_typ.info is ast.FnType {
node.return_type = elem_typ.info.func.return_type
return elem_typ.info.func.return_type
} else {
c.error('cannot call the element of the array, it is not a function',
node.pos)
}
} else {
// TODO: assert? is this possible?
}
found = true
return ast.string_type

View File

@ -0,0 +1,8 @@
fn test_array_of_anon_fn_call() {
xs := [fn (s string) (string, u32) {
return s, 0
}]
r, n := xs[0]('e')
assert n == 0
assert r == 'e'
}