Skip to content

Commit 6ac1d08

Browse files
authored
checker: fix generec fn returning generic closure (#23047)
1 parent b383cce commit 6ac1d08

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

vlib/v/checker/return.v

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,11 @@ fn (mut c Checker) return_stmt(mut node ast.Return) {
267267
if c.inside_lambda && exp_type.has_flag(.generic) {
268268
continue
269269
}
270+
// ignore return closure
271+
if node.exprs[expr_idxs[i]] is ast.AnonFn
272+
&& node.exprs[expr_idxs[i]].inherited_vars.len > 0 {
273+
continue
274+
}
270275
c.error('cannot use `${got_type_name}` as ${c.error_type_name(exp_type)} in return argument',
271276
pos)
272277
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
fn vectorize[T](op fn (T) T) fn ([]T) []T {
2+
return fn [op] [T](values []T) []T {
3+
mut result := []T{len: values.len}
4+
for i in 0 .. values.len {
5+
result[i] = op(values[i])
6+
}
7+
return result
8+
}
9+
}
10+
11+
fn add_one(x f64) f64 {
12+
return x + 1
13+
}
14+
15+
fn test_return_generic_closure() {
16+
vadd := vectorize[f64](add_one)
17+
v := [1.0, 2, 3, 4]
18+
assert vadd(v) == [2.0, 3, 4, 5]
19+
}

0 commit comments

Comments
 (0)