From 52f078580e47fdfc83ce0fe3c9cffb967b77cfba Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 14 Apr 2026 12:45:29 +0300 Subject: [PATCH] cgen: Can't spread rlock-ed shared variable (fixes #17273) --- vlib/v/gen/c/array.v | 6 +----- vlib/v/gen/c/struct.v | 6 +----- .../v/tests/structs/struct_init_with_update_test.v | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/vlib/v/gen/c/array.v b/vlib/v/gen/c/array.v index b588b63db..5f27fa2eb 100644 --- a/vlib/v/gen/c/array.v +++ b/vlib/v/gen/c/array.v @@ -2319,11 +2319,7 @@ fn (mut g Gen) fixed_array_update_expr_field(expr_str string, field_type ast.Typ } else { g.write(expr_str) if !expr_str.ends_with(']') { - if field_type.is_ptr() { - g.write('->') - } else { - g.write('.') - } + g.write(g.dot_or_ptr(field_type)) if is_update_embed { g.write(embed_field) } diff --git a/vlib/v/gen/c/struct.v b/vlib/v/gen/c/struct.v index 9deda9c53..06dacfc04 100644 --- a/vlib/v/gen/c/struct.v +++ b/vlib/v/gen/c/struct.v @@ -385,11 +385,7 @@ fn (mut g Gen) struct_init(node ast.StructInit) { } } if !is_arr_fixed { - if node.update_expr_type.is_ptr() { - g.write('->') - } else { - g.write('.') - } + g.write(g.dot_or_ptr(node.update_expr_type)) if node.is_update_embed { g.write(g.get_embed_field_name(node.update_expr_type, field.name)) } diff --git a/vlib/v/tests/structs/struct_init_with_update_test.v b/vlib/v/tests/structs/struct_init_with_update_test.v index a14c65fce..cdb23d26f 100644 --- a/vlib/v/tests/structs/struct_init_with_update_test.v +++ b/vlib/v/tests/structs/struct_init_with_update_test.v @@ -46,3 +46,17 @@ fn test_struct_init_with_update_expr2() { assert b.s == 'AA' assert b.n == 3 } + +struct SharedSpreadAbc { + a string +} + +fn test_struct_init_with_update_expr_from_rlock_shared_value() { + shared abc := SharedSpreadAbc{'a'} + abc_clone := rlock abc { + SharedSpreadAbc{ + ...abc + } + } + assert abc_clone == SharedSpreadAbc{'a'} +} -- 2.39.5