From 84152cc709fe2b293a885cd5a4cebde7f599d1fd Mon Sep 17 00:00:00 2001 From: CreeperFace <165158232+dy-tea@users.noreply.github.com> Date: Wed, 22 Oct 2025 12:36:41 +0100 Subject: [PATCH] checker: prevent array.insert for array of references when non-reference is passed (fix #25511) (#25557) --- vlib/v/checker/fn.v | 11 +++++++++-- .../tests/array_of_refs_insert_non_ref.out | 13 +++++++++++++ .../tests/array_of_refs_insert_non_ref.vv | 18 ++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 vlib/v/checker/tests/array_of_refs_insert_non_ref.out create mode 100644 vlib/v/checker/tests/array_of_refs_insert_non_ref.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 75a06a83b..d6aafa788 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -3321,8 +3321,15 @@ fn (mut c Checker) array_builtin_method_call(mut node ast.CallExpr, left_type as node.args[i].typ = c.expr(mut arg.expr) if i == val_arg_n { arg_sym := c.table.sym(node.args[i].typ) - if !c.check_types(node.args[i].typ, info.elem_type) - && !c.check_types(left_type, node.args[i].typ) { + base_arg_type := c.unwrap_generic(node.args[i].typ) + if c.check_types(base_arg_type, info.elem_type) { + if !base_arg_type.is_ptr() && info.elem_type.is_ptr() + && info.elem_type.share() == .mut_t { + c.error('cannot ${method_name} `${arg_sym.name}` to `${left_sym.name}`', + arg.expr.pos()) + continue + } + } else if !c.check_types(base_arg_type, c.unwrap_generic(left_type)) { c.error('cannot ${method_name} `${arg_sym.name}` to `${left_sym.name}`', arg.expr.pos()) continue diff --git a/vlib/v/checker/tests/array_of_refs_insert_non_ref.out b/vlib/v/checker/tests/array_of_refs_insert_non_ref.out new file mode 100644 index 000000000..bb18dbfdc --- /dev/null +++ b/vlib/v/checker/tests/array_of_refs_insert_non_ref.out @@ -0,0 +1,13 @@ +vlib/v/checker/tests/array_of_refs_insert_non_ref.vv:16:12: error: cannot append `Dummy` to `[]&Dummy` + 14 | v: 1 + 15 | } + 16 | c.vals << d + | ^ + 17 | c.vals.insert(0, d) + 18 | } +vlib/v/checker/tests/array_of_refs_insert_non_ref.vv:17:19: error: cannot insert `Dummy` to `[]&Dummy` + 15 | } + 16 | c.vals << d + 17 | c.vals.insert(0, d) + | ^ + 18 | } diff --git a/vlib/v/checker/tests/array_of_refs_insert_non_ref.vv b/vlib/v/checker/tests/array_of_refs_insert_non_ref.vv new file mode 100644 index 000000000..04db93008 --- /dev/null +++ b/vlib/v/checker/tests/array_of_refs_insert_non_ref.vv @@ -0,0 +1,18 @@ +struct Dummy { + v int +} + +@[heap] +struct Container { +mut: + vals []&Dummy +} + +fn main() { + mut c := &Container{} + d := Dummy{ + v: 1 + } + c.vals << d + c.vals.insert(0, d) +} -- 2.39.5