From 7b22bae12ea108ee51a457a9dd99935ad0c88dc1 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Sat, 10 Jan 2026 02:01:09 +0800 Subject: [PATCH] cgen: fix generic function error propagation type mismatch (fix #26263) (#26295) --- vlib/v/gen/c/cgen.v | 15 ++++++++++++--- .../generic_function_error_propagation_test.v | 12 ++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 vlib/v/tests/generics/generic_function_error_propagation_test.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index b61a173e6..def0c3f12 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -7500,13 +7500,22 @@ fn (mut g Gen) or_block(var_name string, or_block ast.OrExpr, return_type ast.Ty if g.fn_decl == unsafe { nil } || g.fn_decl.return_type == ast.void_type { g.writeln('\treturn;') } else { - styp := g.styp(g.fn_decl.return_type) + mut fn_return_type := g.fn_decl.return_type + if g.cur_fn != unsafe { nil } && g.cur_fn.generic_names.len > 0 + && g.cur_concrete_types.len > 0 { + if converted_type := g.table.convert_generic_type(g.fn_decl.return_type, + g.cur_fn.generic_names, g.cur_concrete_types) + { + fn_return_type = converted_type + } + } + styp := g.styp(fn_return_type) err_obj := g.new_tmp_var() g.writeln('\t${styp} ${err_obj} = {0};') - if g.fn_decl.return_type.has_flag(.result) { + if fn_return_type.has_flag(.result) { g.writeln('\t${err_obj}.is_error = true;') g.writeln('\t${err_obj}.err = ${cvar_name}${tmp_op}err;') - } else if g.fn_decl.return_type.has_flag(.option) { + } else if fn_return_type.has_flag(.option) { g.writeln('\t${err_obj}.state = 2;') } g.writeln('\treturn ${err_obj};') diff --git a/vlib/v/tests/generics/generic_function_error_propagation_test.v b/vlib/v/tests/generics/generic_function_error_propagation_test.v new file mode 100644 index 000000000..a2748ee37 --- /dev/null +++ b/vlib/v/tests/generics/generic_function_error_propagation_test.v @@ -0,0 +1,12 @@ +import rand + +type Condition = fn () bool + +fn test_generic_function_error_propagation() { + mut list := []Condition{} + list = [fn () bool { + return true + }] + println(rand.element[Condition](list) or { panic('Err') }) + println(list) +} -- 2.39.5