Skip to content

Commit

Permalink
checker: fix a bug checking generic closures (#18489)
Browse files Browse the repository at this point in the history
  • Loading branch information
yuyi98 committed Jun 19, 2023
1 parent 2bedb6f commit 7c1ace0
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 3 deletions.
4 changes: 2 additions & 2 deletions vlib/v/checker/fn.v
Expand Up @@ -459,12 +459,12 @@ fn (mut c Checker) anon_fn(mut node ast.AnonFn) ast.Type {
}
node.decl.scope.update_var_type(var.name, var.typ)
}
c.stmts(node.decl.stmts)
c.fn_decl(mut node.decl)
if has_generic && node.decl.generic_names.len == 0 {
c.error('generic closure fn must specify type parameter, e.g. fn [foo] [T]()',
node.decl.pos)
}
c.stmts(node.decl.stmts)
c.fn_decl(mut node.decl)
return node.typ
}

Expand Down
@@ -1,4 +1,4 @@
vlib/v/checker/tests/generic_closure_fn_decl_err.vv:5:2: error: generic closure fn must specify type parameter, e.g. fn [foo] [T]()
vlib/v/checker/tests/generic_closure_fn_decl_err_a.vv:5:2: error: generic closure fn must specify type parameter, e.g. fn [foo] [T]()
3 |
4 | pub fn (mut app App) register[T](service T) {
5 | fn [service] () {
Expand Down
7 changes: 7 additions & 0 deletions vlib/v/checker/tests/generic_closure_fn_decl_err_b.out
@@ -0,0 +1,7 @@
vlib/v/checker/tests/generic_closure_fn_decl_err_b.vv:13:2: error: generic closure fn must specify type parameter, e.g. fn [foo] [T]()
11 | println(typeof(my_plugin).name) // MyPlugin
12 |
13 | fn[my_plugin](){ my_plugin.on_update() }()
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
14 | }
15 |
18 changes: 18 additions & 0 deletions vlib/v/checker/tests/generic_closure_fn_decl_err_b.vv
@@ -0,0 +1,18 @@
struct MyPlugin {
}

fn (p MyPlugin) on_update() {
println('[MyPlugin.on_update]')
}

fn foo[T](my_plugin T) {
println('[foo]')
println(T.name) // MyPlugin
println(typeof(my_plugin).name) // MyPlugin

fn[my_plugin](){ my_plugin.on_update() }()
}

fn main() {
foo[MyPlugin](MyPlugin{})
}

0 comments on commit 7c1ace0

Please sign in to comment.