checker: require binary operands for &&, || (#6449)

pull/6464/head
Nick Treleaven 2020-09-23 19:48:25 +01:00 committed by GitHub
parent 99e607d3ac
commit 2886b1c67d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 0 deletions

View File

@ -771,6 +771,14 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
return table.void_type
}
else {
if infix_expr.op in [.and, .logical_or] {
if infix_expr.left_type != table.bool_type_idx {
c.error('left operand for `$infix_expr.op` is not a boolean', infix_expr.left.position())
}
if infix_expr.right_type != table.bool_type_idx {
c.error('right operand for `$infix_expr.op` is not a boolean', infix_expr.right.position())
}
}
// use `()` to make the boolean expression clear error
// for example: `(a && b) || c` instead of `a && b || c`
if infix_expr.op in [.logical_or, .and] {

View File

@ -32,8 +32,22 @@ vlib/v/checker/tests/infix_err.vv:13:9: error: `+` cannot be used with `?int`
13 | _ = g() + int(3)
| ^
14 | _ = g() + 3
15 |
vlib/v/checker/tests/infix_err.vv:14:9: error: `+` cannot be used with `?int`
12 | _ = int(0) + g() // FIXME not detected
13 | _ = g() + int(3)
14 | _ = g() + 3
| ^
15 |
16 | // binary operands
vlib/v/checker/tests/infix_err.vv:17:5: error: left operand for `&&` is not a boolean
15 |
16 | // binary operands
17 | _ = 1 && 2
| ^
18 | _ = true || 2
vlib/v/checker/tests/infix_err.vv:18:13: error: right operand for `||` is not a boolean
16 | // binary operands
17 | _ = 1 && 2
18 | _ = true || 2
| ^

View File

@ -12,3 +12,7 @@ _ = 4 + g()
_ = int(0) + g() // FIXME not detected
_ = g() + int(3)
_ = g() + 3
// binary operands
_ = 1 && 2
_ = true || 2