From 13764b3ce50e34098e4f5bae7d2c73db4df6f194 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Tue, 4 Nov 2025 18:34:47 +0800 Subject: [PATCH] checker: disallow calls to a shared receiver method, on a non-shared var (fix #25577) (#25656) --- vlib/v/checker/fn.v | 4 ++++ vlib/v/checker/tests/shared_bad_receiver.out | 6 ++++++ vlib/v/checker/tests/shared_bad_receiver.vv | 17 +++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 vlib/v/checker/tests/shared_bad_receiver.out create mode 100644 vlib/v/checker/tests/shared_bad_receiver.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 0fc49e79a..e9385ffa6 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -2716,6 +2716,10 @@ fn (mut c Checker) method_call(mut node ast.CallExpr, mut continue_check &bool) } else { node.receiver_type = method.params[0].typ } + if node.receiver_type.has_flag(.shared_f) && !node.left_type.has_flag(.shared_f) { + c.error('cannot use shared method `${node.name}` as `${node.left}` is not a shared var', + node.left.pos()) + } // if receiver_type is T, then `receiver_concrete_type` is concrete type, otherwise it is the same as `receiver_type`. node.receiver_concrete_type = if is_method_from_embed { node.from_embed_types.last().derive(method.params[0].typ) diff --git a/vlib/v/checker/tests/shared_bad_receiver.out b/vlib/v/checker/tests/shared_bad_receiver.out new file mode 100644 index 000000000..39270a219 --- /dev/null +++ b/vlib/v/checker/tests/shared_bad_receiver.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/shared_bad_receiver.vv:16:2: error: cannot use shared method `inc` as `c` is not a shared var + 14 | fn main() { + 15 | mut c := Counter{1} + 16 | c.inc() + | ^ + 17 | } diff --git a/vlib/v/checker/tests/shared_bad_receiver.vv b/vlib/v/checker/tests/shared_bad_receiver.vv new file mode 100644 index 000000000..bcca9fd02 --- /dev/null +++ b/vlib/v/checker/tests/shared_bad_receiver.vv @@ -0,0 +1,17 @@ +module main + +struct Counter { +mut: + value int +} + +fn (shared c Counter) inc() { + lock c { + c.value += 1 + } +} + +fn main() { + mut c := Counter{1} + c.inc() +} -- 2.39.5