From 359cb9bb8c06131573dc6564af7e6914c7005a29 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Wed, 17 Dec 2025 23:37:34 +0800 Subject: [PATCH] cgen: allow init shared field with default value (fix #25990) (#25991) --- vlib/v/gen/c/struct.v | 13 ++++++++++++- vlib/v/tests/shared_int_default_val_test.v | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/shared_int_default_val_test.v diff --git a/vlib/v/gen/c/struct.v b/vlib/v/gen/c/struct.v index a4db3765b..d75747a66 100644 --- a/vlib/v/gen/c/struct.v +++ b/vlib/v/gen/c/struct.v @@ -450,7 +450,15 @@ fn (mut g Gen) init_shared_field(field ast.StructField) { field_typ := field.typ.deref() shared_styp := g.styp(field_typ) g.write('(${shared_styp}*)__dup${shared_styp}(&(${shared_styp}){.mtx= {0}, .val=') - g.write(g.type_default(field_typ.clear_flag(.shared_f))) + if field.has_default_expr { + // avoid generate shared assign inside expr + old_is_shared := g.is_shared + g.is_shared = false + g.expr(field.default_expr) + g.is_shared = old_is_shared + } else { + g.write(g.type_default(field_typ.clear_flag(.shared_f))) + } g.write('}, sizeof(${shared_styp}))') } @@ -538,6 +546,9 @@ fn (mut g Gen) zero_struct_field(field ast.StructField) bool { g.fixed_array_var_init(tmp_var, false, final_sym.info.elem_type, final_sym.info.size) g.inside_memset = old_inside_memset return true + } else if field.typ.has_flag(.shared_f) { + g.init_shared_field(field) + return true } g.expr(field.default_expr) } else if field.typ.has_flag(.option) { diff --git a/vlib/v/tests/shared_int_default_val_test.v b/vlib/v/tests/shared_int_default_val_test.v new file mode 100644 index 000000000..020877bd2 --- /dev/null +++ b/vlib/v/tests/shared_int_default_val_test.v @@ -0,0 +1,15 @@ +module main + +struct Foo { +mut: + a shared int = 200 +} + +fn test_main() { + x := Foo{} + + rlock x.a { + k := x.a + assert k == 200 + } +} -- 2.39.5