Skip to content

Commit 13764b3

Browse files
authored
checker: disallow calls to a shared receiver method, on a non-shared var (fix #25577) (#25656)
1 parent 3833ea0 commit 13764b3

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

vlib/v/checker/fn.v

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2716,6 +2716,10 @@ fn (mut c Checker) method_call(mut node ast.CallExpr, mut continue_check &bool)
27162716
} else {
27172717
node.receiver_type = method.params[0].typ
27182718
}
2719+
if node.receiver_type.has_flag(.shared_f) && !node.left_type.has_flag(.shared_f) {
2720+
c.error('cannot use shared method `${node.name}` as `${node.left}` is not a shared var',
2721+
node.left.pos())
2722+
}
27192723
// if receiver_type is T, then `receiver_concrete_type` is concrete type, otherwise it is the same as `receiver_type`.
27202724
node.receiver_concrete_type = if is_method_from_embed {
27212725
node.from_embed_types.last().derive(method.params[0].typ)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
vlib/v/checker/tests/shared_bad_receiver.vv:16:2: error: cannot use shared method `inc` as `c` is not a shared var
2+
14 | fn main() {
3+
15 | mut c := Counter{1}
4+
16 | c.inc()
5+
| ^
6+
17 | }
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module main
2+
3+
struct Counter {
4+
mut:
5+
value int
6+
}
7+
8+
fn (shared c Counter) inc() {
9+
lock c {
10+
c.value += 1
11+
}
12+
}
13+
14+
fn main() {
15+
mut c := Counter{1}
16+
c.inc()
17+
}

0 commit comments

Comments
 (0)