diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index 58002257dd943e..9c03160fa5d285 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -1819,7 +1819,7 @@ fn (mut c Checker) infer_fn_generic_types(func &ast.Fn, mut node ast.CallExpr) { } if param_sym.info.func.return_type.has_flag(.generic) && c.table.sym(param_sym.info.func.return_type).name == gt_name { - typ = arg_sym.info.func.return_type + typ = arg_sym.info.func.return_type.clear_option_and_result() if param_sym.info.func.return_type.nr_muls() > 0 && typ.nr_muls() > 0 { typ = typ.set_nr_muls(0) } diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index f030039f82826f..94a504944726f3 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -3890,7 +3890,7 @@ fn (mut g Gen) update_generic_call_concrete_types_from_fn_types(generic_names [] } if param_fn.func.return_type.has_flag(.generic) { gt_name := g.table.sym(param_fn.func.return_type).name - mut return_type := arg_fn.func.return_type + mut return_type := arg_fn.func.return_type.clear_option_and_result() if arg.expr is ast.LambdaExpr && return_type.has_flag(.generic) { return_type = g.type_resolver.unwrap_generic_expr(arg.expr.expr, return_type) if return_type.has_flag(.generic) { diff --git a/vlib/v/tests/generics/generic_fn_callback_result_return_test.v b/vlib/v/tests/generics/generic_fn_callback_result_return_test.v new file mode 100644 index 00000000000000..ec0b1d07ee6208 --- /dev/null +++ b/vlib/v/tests/generics/generic_fn_callback_result_return_test.v @@ -0,0 +1,13 @@ +fn run[T](cb fn () !T) !T { + mut r := T{} + r = cb()! + return r +} + +fn test_generic_fn_callback_result_return() { + cb := fn () !int { + return 42 + } + + assert run(cb)! == 42 +}