From b8a37a3faf4bc40fa682c0877f8e6f0e05f385d3 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 15 Apr 2026 05:15:05 +0300 Subject: [PATCH] jsgen: fix optional pointer properties cannot be mutated (fixes #24406) --- vlib/v/gen/js/js.v | 4 +++- vlib/v/gen/js/tests/unsafe.v | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/vlib/v/gen/js/js.v b/vlib/v/gen/js/js.v index fda63a852..238c58925 100644 --- a/vlib/v/gen/js/js.v +++ b/vlib/v/gen/js/js.v @@ -1445,7 +1445,9 @@ fn (mut g JsGen) gen_assign_stmt(stmt ast.AssignStmt, semicolon bool) { continue } - is_ptr := stmt.op == .assign && stmt.right_types[i].is_ptr() && !array_set + left_type := if stmt.left_types.len > i { stmt.left_types[i] } else { ast.no_type } + is_ptr := stmt.op == .assign && left_type.is_ptr() && !left_type.has_option_or_result() + && !array_set if is_ptr { g.write('.val') } diff --git a/vlib/v/gen/js/tests/unsafe.v b/vlib/v/gen/js/tests/unsafe.v index 2aa2035e4..c186afffd 100644 --- a/vlib/v/gen/js/tests/unsafe.v +++ b/vlib/v/gen/js/tests/unsafe.v @@ -44,6 +44,12 @@ fn main() { assert false } + // Test assigning a non-nil pointer to an optional pointer field after init + mut f2_non_nil := Foo2{} + boo := 'boo!' + f2_non_nil.name = &boo + assert f2_non_nil.name != none + // Test assigning nil to a struct pointer mut f3 := &Foo2{} unsafe { -- 2.39.5