diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 57fb3ac3ba..e6c574cfe6 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -4755,7 +4755,7 @@ fn (mut g Gen) return_stmt(node ast.Return) { styp := g.base_type(fn_ret_type) g.writeln('${ret_typ} ${tmpvar};') g.write('_option_ok(&(${styp}[]) { ') - if !fn_ret_type.is_ptr() && node.types[0].is_ptr() { + if !g.unwrap_generic(fn_ret_type).is_ptr() && node.types[0].is_ptr() { if !(node.exprs[0] is ast.Ident && !g.is_amp) { g.write('*') } diff --git a/vlib/v/tests/option_generic_ptr_return_test.v b/vlib/v/tests/option_generic_ptr_return_test.v new file mode 100644 index 0000000000..c3e5f0699f --- /dev/null +++ b/vlib/v/tests/option_generic_ptr_return_test.v @@ -0,0 +1,22 @@ +struct ObjectDesc { + typ u32 + ptr voidptr +} + +struct ABCD {} + +pub fn cast_object_desc[H](desc &ObjectDesc) ?H { + $if H is &ABCD { + if desc.typ == 12 { // desc == ABCD + return &ABCD(desc.ptr) + } + } + return none +} + +fn test_main() { + obj := ABCD{} + a := cast_object_desc[&ABCD](ObjectDesc{ typ: 12, ptr: voidptr(&obj) }) + dump(a) + assert *a? == obj +}