Skip to content

Commit 21d1f86

Browse files
authored
checker: fix generics that return reference generics struct (fix #6218) (#9869)
1 parent 7ddf569 commit 21d1f86

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

vlib/v/checker/checker.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,7 +1457,7 @@ fn (mut c Checker) check_return_generics_struct(return_type ast.Type, mut call_e
14571457
idx := c.table.type_idxs[nrt]
14581458
if idx != 0 {
14591459
c.ensure_type_exists(idx, call_expr.pos) or {}
1460-
call_expr.return_type = ast.new_type(idx).derive(return_type)
1460+
call_expr.return_type = ast.new_type(idx).derive(return_type).clear_flag(.generic)
14611461
} else {
14621462
mut fields := rts.info.fields.clone()
14631463
if rts.info.generic_types.len == concrete_types.len {
@@ -1481,7 +1481,7 @@ fn (mut c Checker) check_return_generics_struct(return_type ast.Type, mut call_e
14811481
mod: c.mod
14821482
info: info
14831483
})
1484-
call_expr.return_type = ast.new_type(stru_idx)
1484+
call_expr.return_type = ast.new_type(stru_idx).derive(return_type).clear_flag(.generic)
14851485
}
14861486
}
14871487
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
struct Foo<T> {
2+
data []T
3+
}
4+
5+
fn new_foo<T>(len int) &Foo<T> {
6+
return &Foo{
7+
data: []T{len: len}
8+
}
9+
}
10+
11+
fn test_generics_return_reference_generics_struct() {
12+
f := new_foo<int>(4)
13+
println(f)
14+
assert f.data == [0, 0, 0, 0]
15+
}

0 commit comments

Comments
 (0)