Skip to content

Commit bea73f7

Browse files
authored
checker: fix sizeof(T) usage in generic struct (fix #24806) (#24808)
1 parent f7b6a42 commit bea73f7

3 files changed

Lines changed: 31 additions & 1 deletion

File tree

‎vlib/v/checker/comptime.v‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ fn (mut c Checker) eval_comptime_const_expr(expr ast.Expr, nlevel int) ?ast.Comp
402402
}
403403
}
404404
ast.SizeOf {
405-
s, _ := c.table.type_size(expr.typ)
405+
s, _ := c.table.type_size(c.unwrap_generic(expr.typ))
406406
return i64(s)
407407
}
408408
ast.FloatLiteral {

‎vlib/v/checker/struct.v‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,16 @@ or use an explicit `unsafe{ a[..] }`, if you do not want a copy of the slice.',
939939
} else if struct_sym.info.generic_types.len == struct_sym.info.concrete_types.len {
940940
parent_type := struct_sym.info.parent_type
941941
parent_sym := c.table.sym(parent_type)
942+
if c.inside_generic_struct_init {
943+
mut st := unsafe { struct_sym.info }
944+
for mut field in st.fields {
945+
sym := c.table.sym(field.typ)
946+
if sym.info is ast.ArrayFixed && c.array_fixed_has_unresolved_size(sym.info) {
947+
mut size_expr := unsafe { sym.info.size_expr }
948+
field.typ = c.eval_array_fixed_sizes(mut size_expr, 0, sym.info.elem_type)
949+
}
950+
}
951+
}
942952
for method in parent_sym.methods {
943953
generic_names := struct_sym.info.generic_types.map(c.table.sym(it).name)
944954
for i, param in method.params {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const cache_line_size = 32
2+
3+
struct PaddedSlot[T] {
4+
mut:
5+
data T
6+
pad [cache_line_size - sizeof(T)]u8
7+
}
8+
9+
fn test_main() {
10+
x := PaddedSlot[int]{}
11+
assert '${x}' == 'PaddedSlot[int]{
12+
data: 0
13+
pad: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
14+
}'
15+
x2 := PaddedSlot[u8]{}
16+
assert '${x2}' == 'PaddedSlot[u8]{
17+
data: 0
18+
pad: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
19+
}'
20+
}

0 commit comments

Comments
 (0)