1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

checker: check if guard returning non-propagate option or result (fix #17742) (#17794)

This commit is contained in:
yuyi
2023-03-29 19:51:29 +08:00
committed by GitHub
parent 6756d28595
commit dd0b68ac90
4 changed files with 32 additions and 6 deletions

View File

@@ -71,6 +71,11 @@ fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
}
}
if mut branch.cond is ast.IfGuardExpr {
if branch.cond.expr_type.clear_flag(.option).clear_flag(.result) == ast.void_type
&& !(branch.cond.vars.len == 1 && branch.cond.vars[0].name == '_') {
c.error('if guard expects non-propagate option or result', branch.pos)
continue
}
sym := c.table.sym(branch.cond.expr_type)
if sym.kind == .multi_return {
mr_info := sym.info as ast.MultiReturn

View File

@@ -0,0 +1,7 @@
vlib/v/checker/tests/if_guard_expr_err.vv:6:7: error: if guard expects non-propagate option or result
4 |
5 | fn main() {
6 | a := if r := foo() {
| ~~~~~~~~~~~~~
7 | println(r)
8 | true

View File

@@ -0,0 +1,14 @@
fn foo() ! {
return error("error")
}
fn main() {
a := if r := foo() {
println(r)
true
} else {
false
}
println(a)
}