From b79aa0208f469326ea74ee46fc0d3a0b7bfed8cb Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 22 Sep 2024 18:34:24 -0300 Subject: [PATCH] cgen: fix option cast from fntype (fix #22283, #22284) (#22285) --- vlib/v/gen/c/assign.v | 2 +- .../tests/options/option_fntype_assign_test.v | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/options/option_fntype_assign_test.v diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index 60c872a8c8d864..3bcba1668eb3bd 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -589,7 +589,7 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { } fn_name := c_fn_name(g.get_ternary_name(ident.name)) - if val_type.has_flag(.option) && val is ast.SelectorExpr { + if val_type.has_flag(.option) { ret_styp := g.typ(g.unwrap_generic(val_type)) g.write('${ret_styp} ${fn_name}') } else { diff --git a/vlib/v/tests/options/option_fntype_assign_test.v b/vlib/v/tests/options/option_fntype_assign_test.v new file mode 100644 index 00000000000000..ad1c0167423a18 --- /dev/null +++ b/vlib/v/tests/options/option_fntype_assign_test.v @@ -0,0 +1,24 @@ +type DataFn = fn (name string) string + +fn which_lang(name string) string { + return name +} + +fn find_func(name string) ?DataFn { + a := ?DataFn(which_lang) + return a +} + +fn find_func2(name string) ?DataFn { + a := if name == 'vlang' { ?DataFn(which_lang) } else { none } + return a +} + +fn test_main() { + if a := find_func('foo') { + assert a('bar') == 'bar' + } + if b := find_func('foo') { + assert b('bar') == 'bar' + } +}