Skip to content

Commit ddcc22f

Browse files
authored
checker: fix parenexpr checking on assignment (#17593)
1 parent dc24df9 commit ddcc22f

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

vlib/v/checker/assign.v

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,18 @@ fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) {
8080
c.error('assignment mismatch: ${node.left.len} variable(s) but `${right_first.name}()` returns ${right_len} value(s)',
8181
node.pos)
8282
} else if right_first is ast.ParExpr {
83-
if right_first.expr is ast.CallExpr {
84-
if right_first.expr.return_type == ast.void_type {
85-
c.error('assignment mismatch: expected ${node.left.len} value(s) but `${right_first.expr.name}()` returns ${right_len} value(s)',
86-
node.pos)
83+
mut right_next := right_first
84+
for {
85+
if right_next.expr is ast.CallExpr {
86+
if (right_next.expr as ast.CallExpr).return_type == ast.void_type {
87+
c.error('assignment mismatch: expected ${node.left.len} value(s) but `${(right_next.expr as ast.CallExpr).name}()` returns ${right_len} value(s)',
88+
node.pos)
89+
}
90+
break
91+
} else if right_next.expr is ast.ParExpr {
92+
right_next = right_next.expr as ast.ParExpr
93+
} else {
94+
break
8795
}
8896
}
8997
} else {
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
vlib/v/checker/tests/par_expr_assign_void_right_type_err.vv:1:6: warning: redundant parentheses are used
2+
1 | _ := ((((print(10)))))
3+
| ~~~~~~~~~~~~~~~~~
4+
vlib/v/checker/tests/par_expr_assign_void_right_type_err.vv:1:7: warning: redundant parentheses are used
5+
1 | _ := ((((print(10)))))
6+
| ~~~~~~~~~~~~~~~
7+
vlib/v/checker/tests/par_expr_assign_void_right_type_err.vv:1:8: warning: redundant parentheses are used
8+
1 | _ := ((((print(10)))))
9+
| ~~~~~~~~~~~~~
110
vlib/v/checker/tests/par_expr_assign_void_right_type_err.vv:1:3: error: assignment mismatch: expected 1 value(s) but `print()` returns 0 value(s)
2-
1 | _ := (print(10))
11+
1 | _ := ((((print(10)))))
312
| ~~
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
_ := (print(10))
1+
_ := ((((print(10)))))

0 commit comments

Comments
 (0)