From 37adf10d133fb627282fc865ce88711f042ac7b6 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 14 Apr 2026 12:45:24 +0300 Subject: [PATCH] checker: Error handling, compile error (fixes #20980) --- vlib/v/checker/fn.v | 13 ++++++++++++ .../tests/map_result_callback_fn_type_err.out | 20 +++++++++++++++++++ .../tests/map_result_callback_fn_type_err.vv | 14 +++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 vlib/v/checker/tests/map_result_callback_fn_type_err.out create mode 100644 vlib/v/checker/tests/map_result_callback_fn_type_err.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 8d5f1b647..7eba0985b 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -4342,6 +4342,19 @@ fn (mut c Checker) array_builtin_method_call(mut node ast.CallExpr, left_type as arg_type } } + normalized_ret_type := if c.table.sym(ret_type).kind == .alias { + unaliased_ret_type := c.table.unaliased_type(ret_type) + if unaliased_ret_type.has_option_or_result() { + unaliased_ret_type + } else { + ret_type + } + } else { + ret_type + } + if normalized_ret_type.has_flag(.result) { + c.error('cannot use Result type in `${node.name}`', arg0.expr.pos()) + } if c.pref.new_generic_solver { node.return_type = c.table.find_or_register_array(ret_type) } else { diff --git a/vlib/v/checker/tests/map_result_callback_fn_type_err.out b/vlib/v/checker/tests/map_result_callback_fn_type_err.out new file mode 100644 index 000000000..2b8d1858a --- /dev/null +++ b/vlib/v/checker/tests/map_result_callback_fn_type_err.out @@ -0,0 +1,20 @@ +vlib/v/checker/tests/map_result_callback_fn_type_err.vv:9:20: error: cannot use Result type in `map` + 7 | return n + 8 | } + 9 | _ = [1, 2, 3].map(fn (n int) !int { + | ~~~~~~~~~~~~~~~~~ + 10 | return n + 11 | }) +vlib/v/checker/tests/map_result_callback_fn_type_err.vv:12:20: error: cannot use Result type in `map` + 10 | return n + 11 | }) + 12 | _ = [1, 2, 3].map(named_result_cb) + | ~~~~~~~~~~~~~~~ + 13 | _ = [1, 2, 3].map(cb) + 14 | } +vlib/v/checker/tests/map_result_callback_fn_type_err.vv:13:20: error: cannot use Result type in `map` + 11 | }) + 12 | _ = [1, 2, 3].map(named_result_cb) + 13 | _ = [1, 2, 3].map(cb) + | ~~ + 14 | } diff --git a/vlib/v/checker/tests/map_result_callback_fn_type_err.vv b/vlib/v/checker/tests/map_result_callback_fn_type_err.vv new file mode 100644 index 000000000..f609c98ef --- /dev/null +++ b/vlib/v/checker/tests/map_result_callback_fn_type_err.vv @@ -0,0 +1,14 @@ +fn named_result_cb(n int) !int { + return n +} + +fn main() { + cb := fn (n int) !int { + return n + } + _ = [1, 2, 3].map(fn (n int) !int { + return n + }) + _ = [1, 2, 3].map(named_result_cb) + _ = [1, 2, 3].map(cb) +} -- 2.39.5