checker: check unsigned integer compared with negative value (#13670)
parent
36ec47cd20
commit
e6270b05dc
|
@ -819,6 +819,28 @@ pub fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type {
|
|||
} else if need_overload && !gen_sym.has_method('<') && node.op == .gt {
|
||||
c.error('cannot use `>` as `<=` operator method is not defined', left_right_pos)
|
||||
}
|
||||
} else if left_type in ast.integer_type_idxs && right_type in ast.integer_type_idxs {
|
||||
is_left_type_signed := left_type in ast.signed_integer_type_idxs
|
||||
|| left_type == ast.int_literal_type_idx
|
||||
is_right_type_signed := right_type in ast.signed_integer_type_idxs
|
||||
|| right_type == ast.int_literal_type_idx
|
||||
if is_left_type_signed != is_right_type_signed {
|
||||
if is_right_type_signed {
|
||||
if mut node.right is ast.IntegerLiteral {
|
||||
if node.right.val.int() < 0 {
|
||||
c.error('unsigned integer cannot be compared with negative value',
|
||||
node.right.pos)
|
||||
}
|
||||
}
|
||||
} else if is_left_type_signed {
|
||||
if mut node.left is ast.IntegerLiteral {
|
||||
if node.left.val.int() < 0 {
|
||||
c.error('unsigned integer cannot be compared with negative value',
|
||||
node.left.pos)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.left_shift {
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
vlib/v/checker/tests/infix_unsigned_and_signed_int_err.vv:2:14: error: unsigned integer cannot be compared with negative value
|
||||
1 | fn main() {
|
||||
2 | if u32(1) < -1 {
|
||||
| ~~
|
||||
3 | println('unexpected')
|
||||
4 | }
|
||||
vlib/v/checker/tests/infix_unsigned_and_signed_int_err.vv:6:5: error: unsigned integer cannot be compared with negative value
|
||||
4 | }
|
||||
5 |
|
||||
6 | if -1 > u32(1) {
|
||||
| ~~
|
||||
7 | println('unexpected')
|
||||
8 | }
|
|
@ -0,0 +1,9 @@
|
|||
fn main() {
|
||||
if u32(1) < -1 {
|
||||
println('unexpected')
|
||||
}
|
||||
|
||||
if -1 > u32(1) {
|
||||
println('unexpected')
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue