Skip to content

Commit e92d210

Browse files
authored
checker: add missing check when assignment statement lvalue is ParExpr (fix #19819) (#19830)
1 parent c0eeb85 commit e92d210

8 files changed

Lines changed: 39 additions & 8 deletions

examples/path_tracing.v

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,9 @@ fn ray_trace(w int, h int, samps int, file_name string, scene_id int) Image {
556556
d.mult_s(140.0), d.norm()}, 0, scene_id).mult_s(samps1)
557557
}
558558
tmp_vec := Vec{clamp(r.x), clamp(r.y), clamp(r.z)}.mult_s(.25)
559-
(*ivec) = *ivec + tmp_vec
559+
unsafe {
560+
(*ivec) = *ivec + tmp_vec
561+
}
560562
}
561563
}
562564
}

vlib/v/checker/assign.v

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,9 @@ fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) {
266266
}
267267
}
268268
node.left_types << left_type
269+
for left is ast.ParExpr {
270+
left = (left as ast.ParExpr).expr
271+
}
269272
match mut left {
270273
ast.Ident {
271274
if (is_decl || left.kind == .blank_ident) && left_type.is_ptr()

vlib/v/checker/tests/invalid_literal_assign_err.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ vlib/v/checker/tests/invalid_literal_assign_err.vv:11:2: error: non-name literal
5454
| ~~~~~
5555
12 | (3 + 3.5) = 4 + 6.4
5656
13 | }
57-
vlib/v/checker/tests/invalid_literal_assign_err.vv:12:2: error: non-name literal value `(3 + 3.5)` on left side of `=`
57+
vlib/v/checker/tests/invalid_literal_assign_err.vv:12:3: error: non-name literal value `3 + 3.5` on left side of `=`
5858
10 | true = false
5959
11 | 3 + 5 = 3 & 4
6060
12 | (3 + 3.5) = 4 + 6.4
61-
| ~~~~~~~~~
61+
| ~~~~~~~
6262
13 | }

vlib/v/checker/tests/prefix_expr_decl_assign_err.out

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,15 @@ vlib/v/checker/tests/prefix_expr_decl_assign_err.vv:2:5: error: non-name on the
1010
| ^
1111
3 | (*d) := 14
1212
4 | }
13-
vlib/v/checker/tests/prefix_expr_decl_assign_err.vv:3:5: error: non-name `(*d)` on left side of `:=`
13+
vlib/v/checker/tests/prefix_expr_decl_assign_err.vv:3:10: error: modifying variables via dereferencing can only be done in `unsafe` blocks
1414
1 | fn main() {
1515
2 | &a := 12
1616
3 | (*d) := 14
17-
| ~~~~
17+
| ~~
18+
4 | }
19+
vlib/v/checker/tests/prefix_expr_decl_assign_err.vv:3:6: error: non-name on the left side of `:=`
20+
1 | fn main() {
21+
2 | &a := 12
22+
3 | (*d) := 14
23+
| ^
1824
4 | }
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
vlib/v/checker/tests/unsafe_deref_assign_err.vv:4:7: error: modifying variables via dereferencing can only be done in `unsafe` blocks
2+
2 | cref := &c
3+
3 |
4+
4 | *cref = 1
5+
| ^
6+
5 | (*cref) = 1
7+
vlib/v/checker/tests/unsafe_deref_assign_err.vv:5:9: error: modifying variables via dereferencing can only be done in `unsafe` blocks
8+
3 |
9+
4 | *cref = 1
10+
5 | (*cref) = 1
11+
| ^
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
c := 0
2+
cref := &c
3+
4+
*cref = 1
5+
(*cref) = 1

vlib/v/tests/assign_bitops_with_type_aliases_test.v

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ const (
77
type SteamId = u64
88

99
fn (mut s SteamId) set_id(i u32) {
10-
(*s) &= ~steamid_id_mask
11-
(*s) |= ((u64(i) << steamid_id_shift) & steamid_id_mask)
10+
unsafe {
11+
(*s) &= ~steamid_id_mask
12+
(*s) |= ((u64(i) << steamid_id_shift) & steamid_id_mask)
13+
}
1214
}
1315

1416
fn test_bitops_work_with_type_aliases() {

vlib/v/tests/mut_test.v

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ fn test_mut() {
2525
n := 1
2626
mut b := (&n)
2727
//
28-
(*b) = 10
28+
unsafe {
29+
(*b) = 10
30+
}
2931
// mut b := mut a
3032
// b = 10
3133
}

0 commit comments

Comments
 (0)