checker: make `sym == typ` an error
parent
f336c2c5cc
commit
a6f1667bce
|
@ -642,6 +642,14 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
||||||
// TODO: Some of the checks are not single side. Should find a better way to organize them.
|
// TODO: Some of the checks are not single side. Should find a better way to organize them.
|
||||||
match infix_expr.op {
|
match infix_expr.op {
|
||||||
// .eq, .ne, .gt, .lt, .ge, .le, .and, .logical_or, .dot, .key_as, .right_shift {}
|
// .eq, .ne, .gt, .lt, .ge, .le, .and, .logical_or, .dot, .key_as, .right_shift {}
|
||||||
|
.eq, .ne {
|
||||||
|
is_alias_eq_struct := left.kind == .alias && right.kind == .struct_
|
||||||
|
is_struct_eq_alias := left.kind == .struct_ && right.kind == .alias
|
||||||
|
if is_alias_eq_struct || is_struct_eq_alias {
|
||||||
|
c.error('possible type mismatch of compared values of `$infix_expr.op` operation',
|
||||||
|
infix_expr.pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
.key_in, .not_in {
|
.key_in, .not_in {
|
||||||
match right.kind {
|
match right.kind {
|
||||||
.array {
|
.array {
|
||||||
|
@ -837,26 +845,22 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
||||||
}
|
}
|
||||||
return table.void_type
|
return table.void_type
|
||||||
}
|
}
|
||||||
else {
|
.and, .logical_or {
|
||||||
if infix_expr.op in [.and, .logical_or] {
|
|
||||||
if infix_expr.left_type != table.bool_type_idx {
|
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())
|
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 {
|
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())
|
c.error('right operand for `$infix_expr.op` is not a boolean', infix_expr.right.position())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// use `()` to make the boolean expression clear error
|
// use `()` to make the boolean expression clear error
|
||||||
// for example: `(a && b) || c` instead of `a && b || c`
|
// for example: `(a && b) || c` instead of `a && b || c`
|
||||||
if infix_expr.op in [.logical_or, .and] {
|
|
||||||
if mut infix_expr.left is ast.InfixExpr {
|
if mut infix_expr.left is ast.InfixExpr {
|
||||||
if infix_expr.left.op in [.logical_or, .and] &&
|
if infix_expr.left.op != infix_expr.op && infix_expr.left.op in [.logical_or, .and] {
|
||||||
infix_expr.left.op != infix_expr.op {
|
|
||||||
c.error('use `()` to make the boolean expression clear', infix_expr.pos)
|
c.error('use `()` to make the boolean expression clear', infix_expr.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
else {}
|
||||||
}
|
}
|
||||||
// TODO: Absorb this block into the above single side check block to accelerate.
|
// TODO: Absorb this block into the above single side check block to accelerate.
|
||||||
if left_type == table.bool_type && infix_expr.op !in [.eq, .ne, .logical_or, .and] {
|
if left_type == table.bool_type && infix_expr.op !in [.eq, .ne, .logical_or, .and] {
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
vlib/v/checker/comparing_typesymbol_to_a_type_should_not_compile.vv:12:12: error: possible type mismatch of compared values of `==` operation
|
||||||
|
10 | x := ityp == table.string_type
|
||||||
|
11 | // the next line should produce at least a warning, or even an error, without an explicit cast:
|
||||||
|
12 | z := isym == table.string_type
|
||||||
|
| ~~
|
||||||
|
13 | println(typeof(isym))
|
||||||
|
14 | println(typeof(table.string_type))
|
|
@ -1616,7 +1616,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
if left.left_type.is_ptr() {
|
if left.left_type.is_ptr() {
|
||||||
g.write('*')
|
g.write('*')
|
||||||
}
|
}
|
||||||
needs_clone := elem_typ == table.string_type && g.pref.autofree
|
needs_clone := info.elem_type == table.string_type && g.pref.autofree
|
||||||
if needs_clone {
|
if needs_clone {
|
||||||
g.write('/*1*/string_clone(')
|
g.write('/*1*/string_clone(')
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue