Skip to content

Commit 359cb9b

Browse files
authored
cgen: allow init shared field with default value (fix #25990) (#25991)
1 parent 3cf0c92 commit 359cb9b

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

vlib/v/gen/c/struct.v

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,15 @@ fn (mut g Gen) init_shared_field(field ast.StructField) {
450450
field_typ := field.typ.deref()
451451
shared_styp := g.styp(field_typ)
452452
g.write('(${shared_styp}*)__dup${shared_styp}(&(${shared_styp}){.mtx= {0}, .val=')
453-
g.write(g.type_default(field_typ.clear_flag(.shared_f)))
453+
if field.has_default_expr {
454+
// avoid generate shared assign inside expr
455+
old_is_shared := g.is_shared
456+
g.is_shared = false
457+
g.expr(field.default_expr)
458+
g.is_shared = old_is_shared
459+
} else {
460+
g.write(g.type_default(field_typ.clear_flag(.shared_f)))
461+
}
454462
g.write('}, sizeof(${shared_styp}))')
455463
}
456464

@@ -538,6 +546,9 @@ fn (mut g Gen) zero_struct_field(field ast.StructField) bool {
538546
g.fixed_array_var_init(tmp_var, false, final_sym.info.elem_type, final_sym.info.size)
539547
g.inside_memset = old_inside_memset
540548
return true
549+
} else if field.typ.has_flag(.shared_f) {
550+
g.init_shared_field(field)
551+
return true
541552
}
542553
g.expr(field.default_expr)
543554
} else if field.typ.has_flag(.option) {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module main
2+
3+
struct Foo {
4+
mut:
5+
a shared int = 200
6+
}
7+
8+
fn test_main() {
9+
x := Foo{}
10+
11+
rlock x.a {
12+
k := x.a
13+
assert k == 200
14+
}
15+
}

0 commit comments

Comments
 (0)