Skip to content

Commit adcd16b

Browse files
authored
cgen: fix generic return for option ptr (#17987)
1 parent 377c2e2 commit adcd16b

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

vlib/v/gen/c/cgen.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4755,7 +4755,7 @@ fn (mut g Gen) return_stmt(node ast.Return) {
47554755
styp := g.base_type(fn_ret_type)
47564756
g.writeln('${ret_typ} ${tmpvar};')
47574757
g.write('_option_ok(&(${styp}[]) { ')
4758-
if !fn_ret_type.is_ptr() && node.types[0].is_ptr() {
4758+
if !g.unwrap_generic(fn_ret_type).is_ptr() && node.types[0].is_ptr() {
47594759
if !(node.exprs[0] is ast.Ident && !g.is_amp) {
47604760
g.write('*')
47614761
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
struct ObjectDesc {
2+
typ u32
3+
ptr voidptr
4+
}
5+
6+
struct ABCD {}
7+
8+
pub fn cast_object_desc[H](desc &ObjectDesc) ?H {
9+
$if H is &ABCD {
10+
if desc.typ == 12 { // desc == ABCD
11+
return &ABCD(desc.ptr)
12+
}
13+
}
14+
return none
15+
}
16+
17+
fn test_main() {
18+
obj := ABCD{}
19+
a := cast_object_desc[&ABCD](ObjectDesc{ typ: 12, ptr: voidptr(&obj) })
20+
dump(a)
21+
assert *a? == obj
22+
}

0 commit comments

Comments
 (0)