checker: improve error position of infix expr (#8828)
parent
ad162cd6fc
commit
6e262b5d84
|
@ -700,6 +700,7 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
left_final := c.table.get_final_type_symbol(left_type)
|
||||
left_pos := infix_expr.left.position()
|
||||
right_pos := infix_expr.right.position()
|
||||
left_right_pos := left_pos.extend(right_pos)
|
||||
if (left_type.is_ptr() || left.is_pointer()) && infix_expr.op in [.plus, .minus] {
|
||||
if !c.inside_unsafe && !infix_expr.left.is_mut_ident() && !infix_expr.right.is_mut_ident() {
|
||||
c.warn('pointer arithmetic is only allowed in `unsafe` blocks', left_pos)
|
||||
|
@ -730,7 +731,7 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
|| (right.kind == .alias && left.kind in [.struct_, .array])
|
||||
if is_mismatch {
|
||||
c.error('possible type mismatch of compared values of `$infix_expr.op` operation',
|
||||
infix_expr.pos)
|
||||
left_right_pos)
|
||||
}
|
||||
}
|
||||
.key_in, .not_in {
|
||||
|
@ -740,20 +741,20 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
// if left_default.kind != right_sym.kind {
|
||||
c.check_expected(left_type, elem_type) or {
|
||||
c.error('left operand to `$infix_expr.op` does not match the array element type: $err',
|
||||
infix_expr.pos)
|
||||
left_right_pos)
|
||||
}
|
||||
}
|
||||
.map {
|
||||
elem_type := right.map_info().key_type
|
||||
c.check_expected(left_type, elem_type) or {
|
||||
c.error('left operand to `$infix_expr.op` does not match the map key type: $err',
|
||||
infix_expr.pos)
|
||||
left_right_pos)
|
||||
}
|
||||
}
|
||||
.string {
|
||||
c.check_expected(left_type, right_type) or {
|
||||
c.error('left operand to `$infix_expr.op` does not match: $err',
|
||||
infix_expr.pos)
|
||||
left_right_pos)
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -784,9 +785,9 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
right_name := c.table.type_to_str(right_type)
|
||||
if left_name == right_name {
|
||||
c.error('undefined operation `$left_name` $infix_expr.op.str() `$right_name`',
|
||||
left_pos)
|
||||
left_right_pos)
|
||||
} else {
|
||||
c.error('mismatched types `$left_name` and `$right_name`', left_pos)
|
||||
c.error('mismatched types `$left_name` and `$right_name`', left_right_pos)
|
||||
}
|
||||
}
|
||||
} else if right.kind in [.array, .array_fixed, .map, .struct_] {
|
||||
|
@ -801,9 +802,9 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
right_name := c.table.type_to_str(right_type)
|
||||
if left_name == right_name {
|
||||
c.error('undefined operation `$left_name` $infix_expr.op.str() `$right_name`',
|
||||
right_pos)
|
||||
left_right_pos)
|
||||
} else {
|
||||
c.error('mismatched types `$left_name` and `$right_name`', right_pos)
|
||||
c.error('mismatched types `$left_name` and `$right_name`', left_right_pos)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -811,7 +812,7 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
if promoted_type.idx() == table.void_type_idx {
|
||||
left_name := c.table.type_to_str(left_type)
|
||||
right_name := c.table.type_to_str(right_type)
|
||||
c.error('mismatched types `$left_name` and `$right_name`', infix_expr.pos)
|
||||
c.error('mismatched types `$left_name` and `$right_name`', left_right_pos)
|
||||
} else if promoted_type.has_flag(.optional) {
|
||||
s := c.table.type_to_str(promoted_type)
|
||||
c.error('`$infix_expr.op` cannot be used with `$s`', infix_expr.pos)
|
||||
|
@ -844,18 +845,18 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
right_name := c.table.type_to_str(right_type)
|
||||
if left_name == right_name {
|
||||
c.error('undefined operation `$left_name` $infix_expr.op.str() `$right_name`',
|
||||
infix_expr.pos)
|
||||
left_right_pos)
|
||||
} else {
|
||||
c.error('mismatched types `$left_name` and `$right_name`', infix_expr.pos)
|
||||
c.error('mismatched types `$left_name` and `$right_name`', left_right_pos)
|
||||
}
|
||||
}
|
||||
}
|
||||
if left.kind == .struct_ && right.kind == .struct_ {
|
||||
if !left.has_method('<') && infix_expr.op in [.ge, .le] {
|
||||
c.error('cannot use `$infix_expr.op` as `<` operator method is not defined',
|
||||
infix_expr.pos)
|
||||
left_right_pos)
|
||||
} else if !left.has_method('<') && infix_expr.op == .gt {
|
||||
c.error('cannot use `>` as `<=` operator method is not defined', infix_expr.pos)
|
||||
c.error('cannot use `>` as `<=` operator method is not defined', left_right_pos)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -972,7 +973,7 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
left_is_optional := left_type.has_flag(.optional)
|
||||
right_is_optional := right_type.has_flag(.optional)
|
||||
if (left_is_optional && !right_is_optional) || (!left_is_optional && right_is_optional) {
|
||||
c.error('unwrapped optional cannot be used in an infix expression', infix_expr.pos)
|
||||
c.error('unwrapped optional cannot be used in an infix expression', left_right_pos)
|
||||
}
|
||||
// Dual sides check (compatibility check)
|
||||
if !c.symmetric_check(right_type, left_type) && !c.pref.translated {
|
||||
|
@ -981,7 +982,7 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
|||
return table.void_type
|
||||
}
|
||||
c.error('infix expr: cannot use `$right.name` (right expression) as `$left.name`',
|
||||
infix_expr.pos)
|
||||
left_right_pos)
|
||||
}
|
||||
/*
|
||||
if (infix_expr.left is ast.InfixExpr &&
|
||||
|
|
|
@ -2,40 +2,41 @@ vlib/v/checker/tests/add_op_wrong_type_err.vv:3:13: error: mismatched types `Aaa
|
|||
1 | struct Aaa{}
|
||||
2 | fn main() {
|
||||
3 | println(Aaa{} + 10)
|
||||
| ~~~~~
|
||||
| ~~~~~~~~~~
|
||||
4 | println(10 + Aaa{})
|
||||
5 | println([1,2,3] + 10)
|
||||
vlib/v/checker/tests/add_op_wrong_type_err.vv:4:18: error: mismatched types `int literal` and `Aaa`
|
||||
vlib/v/checker/tests/add_op_wrong_type_err.vv:4:13: error: mismatched types `int literal` and `Aaa`
|
||||
2 | fn main() {
|
||||
3 | println(Aaa{} + 10)
|
||||
4 | println(10 + Aaa{})
|
||||
| ~~~~~
|
||||
| ~~~~~~~~~~
|
||||
5 | println([1,2,3] + 10)
|
||||
6 | println(10 + [1,2,3])
|
||||
vlib/v/checker/tests/add_op_wrong_type_err.vv:5:13: error: mismatched types `[]int` and `int literal`
|
||||
3 | println(Aaa{} + 10)
|
||||
4 | println(10 + Aaa{})
|
||||
5 | println([1,2,3] + 10)
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~~
|
||||
6 | println(10 + [1,2,3])
|
||||
7 | a := map[string]int
|
||||
vlib/v/checker/tests/add_op_wrong_type_err.vv:6:18: error: mismatched types `int literal` and `[]int`
|
||||
vlib/v/checker/tests/add_op_wrong_type_err.vv:6:13: error: mismatched types `int literal` and `[]int`
|
||||
4 | println(10 + Aaa{})
|
||||
5 | println([1,2,3] + 10)
|
||||
6 | println(10 + [1,2,3])
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~~
|
||||
7 | a := map[string]int
|
||||
8 | println(a + 10)
|
||||
vlib/v/checker/tests/add_op_wrong_type_err.vv:8:13: error: mismatched types `map[string]int` and `int literal`
|
||||
6 | println(10 + [1,2,3])
|
||||
7 | a := map[string]int
|
||||
8 | println(a + 10)
|
||||
| ^
|
||||
| ~~~~~~
|
||||
9 | println(10 + a)
|
||||
10 | }
|
||||
vlib/v/checker/tests/add_op_wrong_type_err.vv:9:18: error: mismatched types `int literal` and `map[string]int`
|
||||
vlib/v/checker/tests/add_op_wrong_type_err.vv:9:13: error: mismatched types `int literal` and `map[string]int`
|
||||
7 | a := map[string]int
|
||||
8 | println(a + 10)
|
||||
9 | println(10 + a)
|
||||
| ^
|
||||
| ~~~~~~
|
||||
10 | }
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
vlib/v/checker/tests/comparing_typesymbol_to_a_type_should_not_compile.vv:12:12: error: possible type mismatch of compared values of `==` operation
|
||||
vlib/v/checker/tests/comparing_typesymbol_to_a_type_should_not_compile.vv:12:7: 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).name)
|
||||
14 | println(typeof(table.string_type).name)
|
||||
|
||||
|
|
|
@ -2,40 +2,41 @@ vlib/v/checker/tests/div_op_wrong_type_err.vv:3:13: error: mismatched types `Aaa
|
|||
1 | struct Aaa{}
|
||||
2 | fn main() {
|
||||
3 | println(Aaa{} / 10)
|
||||
| ~~~~~
|
||||
| ~~~~~~~~~~
|
||||
4 | println(10 / Aaa{})
|
||||
5 | println([1,2,3] / 10)
|
||||
vlib/v/checker/tests/div_op_wrong_type_err.vv:4:18: error: mismatched types `int literal` and `Aaa`
|
||||
vlib/v/checker/tests/div_op_wrong_type_err.vv:4:13: error: mismatched types `int literal` and `Aaa`
|
||||
2 | fn main() {
|
||||
3 | println(Aaa{} / 10)
|
||||
4 | println(10 / Aaa{})
|
||||
| ~~~~~
|
||||
| ~~~~~~~~~~
|
||||
5 | println([1,2,3] / 10)
|
||||
6 | println(10 / [1,2,3])
|
||||
vlib/v/checker/tests/div_op_wrong_type_err.vv:5:13: error: mismatched types `[]int` and `int literal`
|
||||
3 | println(Aaa{} / 10)
|
||||
4 | println(10 / Aaa{})
|
||||
5 | println([1,2,3] / 10)
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~~
|
||||
6 | println(10 / [1,2,3])
|
||||
7 | a := map[string]int
|
||||
vlib/v/checker/tests/div_op_wrong_type_err.vv:6:18: error: mismatched types `int literal` and `[]int`
|
||||
vlib/v/checker/tests/div_op_wrong_type_err.vv:6:13: error: mismatched types `int literal` and `[]int`
|
||||
4 | println(10 / Aaa{})
|
||||
5 | println([1,2,3] / 10)
|
||||
6 | println(10 / [1,2,3])
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~~
|
||||
7 | a := map[string]int
|
||||
8 | println(a / 10)
|
||||
vlib/v/checker/tests/div_op_wrong_type_err.vv:8:13: error: mismatched types `map[string]int` and `int literal`
|
||||
6 | println(10 / [1,2,3])
|
||||
7 | a := map[string]int
|
||||
8 | println(a / 10)
|
||||
| ^
|
||||
| ~~~~~~
|
||||
9 | println(10 / a)
|
||||
10 | }
|
||||
vlib/v/checker/tests/div_op_wrong_type_err.vv:9:18: error: mismatched types `int literal` and `map[string]int`
|
||||
vlib/v/checker/tests/div_op_wrong_type_err.vv:9:13: error: mismatched types `int literal` and `map[string]int`
|
||||
7 | a := map[string]int
|
||||
8 | println(a / 10)
|
||||
9 | println(10 / a)
|
||||
| ^
|
||||
| ~~~~~~
|
||||
10 | }
|
||||
|
||||
|
|
|
@ -1,83 +1,84 @@
|
|||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:10:16: error: infix expr: cannot use `int literal` (right expression) as `Aaa`
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:10:10: error: infix expr: cannot use `int literal` (right expression) as `Aaa`
|
||||
8 |
|
||||
9 | fn main() {
|
||||
10 | println(Aaa{} == 10)
|
||||
| ~~
|
||||
| ~~~~~~~~~~~
|
||||
11 | println(10 == Aaa{})
|
||||
12 | println(Aaa{} != 10)
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:11:13: error: infix expr: cannot use `Aaa` (right expression) as `int literal`
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:11:10: error: infix expr: cannot use `Aaa` (right expression) as `int literal`
|
||||
9 | fn main() {
|
||||
10 | println(Aaa{} == 10)
|
||||
11 | println(10 == Aaa{})
|
||||
| ~~
|
||||
| ~~~~~~~~~~~
|
||||
12 | println(Aaa{} != 10)
|
||||
13 | println(10 != Aaa{})
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:12:16: error: infix expr: cannot use `int literal` (right expression) as `Aaa`
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:12:10: error: infix expr: cannot use `int literal` (right expression) as `Aaa`
|
||||
10 | println(Aaa{} == 10)
|
||||
11 | println(10 == Aaa{})
|
||||
12 | println(Aaa{} != 10)
|
||||
| ~~
|
||||
| ~~~~~~~~~~~
|
||||
13 | println(10 != Aaa{})
|
||||
14 |
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:13:13: error: infix expr: cannot use `Aaa` (right expression) as `int literal`
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:13:10: error: infix expr: cannot use `Aaa` (right expression) as `int literal`
|
||||
11 | println(10 == Aaa{})
|
||||
12 | println(Aaa{} != 10)
|
||||
13 | println(10 != Aaa{})
|
||||
| ~~
|
||||
| ~~~~~~~~~~~
|
||||
14 |
|
||||
15 | println(Aaa{0} == AAaa{0})
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:15:17: error: possible type mismatch of compared values of `==` operation
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:15:10: error: possible type mismatch of compared values of `==` operation
|
||||
13 | println(10 != Aaa{})
|
||||
14 |
|
||||
15 | println(Aaa{0} == AAaa{0})
|
||||
| ~~
|
||||
| ~~~~~~~~~~~~~~~~~
|
||||
16 | println(AAaa{0} == Aaa{0})
|
||||
17 | println(AAaa{1} != Aaa{1})
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:16:18: error: possible type mismatch of compared values of `==` operation
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:16:10: error: possible type mismatch of compared values of `==` operation
|
||||
14 |
|
||||
15 | println(Aaa{0} == AAaa{0})
|
||||
16 | println(AAaa{0} == Aaa{0})
|
||||
| ~~
|
||||
| ~~~~~~~~~~~~~~~~~
|
||||
17 | println(AAaa{1} != Aaa{1})
|
||||
18 | println(Aaa{1} != AAaa{1})
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:17:18: error: possible type mismatch of compared values of `!=` operation
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:17:10: error: possible type mismatch of compared values of `!=` operation
|
||||
15 | println(Aaa{0} == AAaa{0})
|
||||
16 | println(AAaa{0} == Aaa{0})
|
||||
17 | println(AAaa{1} != Aaa{1})
|
||||
| ~~
|
||||
| ~~~~~~~~~~~~~~~~~
|
||||
18 | println(Aaa{1} != AAaa{1})
|
||||
19 |
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:18:17: error: possible type mismatch of compared values of `!=` operation
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:18:10: error: possible type mismatch of compared values of `!=` operation
|
||||
16 | println(AAaa{0} == Aaa{0})
|
||||
17 | println(AAaa{1} != Aaa{1})
|
||||
18 | println(Aaa{1} != AAaa{1})
|
||||
| ~~
|
||||
| ~~~~~~~~~~~~~~~~~
|
||||
19 |
|
||||
20 | arr := Arr([0])
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:21:14: error: possible type mismatch of compared values of `==` operation
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:21:10: error: possible type mismatch of compared values of `==` operation
|
||||
19 |
|
||||
20 | arr := Arr([0])
|
||||
21 | println(arr == [0])
|
||||
| ~~
|
||||
| ~~~~~~~~~~
|
||||
22 | println([1] == arr)
|
||||
23 | println(arr != [0])
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:22:14: error: possible type mismatch of compared values of `==` operation
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:22:10: error: possible type mismatch of compared values of `==` operation
|
||||
20 | arr := Arr([0])
|
||||
21 | println(arr == [0])
|
||||
22 | println([1] == arr)
|
||||
| ~~
|
||||
| ~~~~~~~~~~
|
||||
23 | println(arr != [0])
|
||||
24 | println([1] != arr)
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:23:14: error: possible type mismatch of compared values of `!=` operation
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:23:10: error: possible type mismatch of compared values of `!=` operation
|
||||
21 | println(arr == [0])
|
||||
22 | println([1] == arr)
|
||||
23 | println(arr != [0])
|
||||
| ~~
|
||||
| ~~~~~~~~~~
|
||||
24 | println([1] != arr)
|
||||
25 | }
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:24:14: error: possible type mismatch of compared values of `!=` operation
|
||||
vlib/v/checker/tests/eq_ne_op_wrong_type_err.vv:24:10: error: possible type mismatch of compared values of `!=` operation
|
||||
22 | println([1] == arr)
|
||||
23 | println(arr != [0])
|
||||
24 | println([1] != arr)
|
||||
| ~~
|
||||
| ~~~~~~~~~~
|
||||
25 | }
|
||||
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
vlib/v/checker/tests/in_mismatch_type.vv:10:7: error: left operand to `in` does not match the array element type: expected `string`, not `int literal`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:10:5: error: left operand to `in` does not match the array element type: expected `string`, not `int literal`
|
||||
8 | }
|
||||
9 | s := 'abcd'
|
||||
10 | if 1 in a_s {
|
||||
| ~~
|
||||
| ~~~~~~~~
|
||||
11 | println('ok')
|
||||
12 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:13:7: error: left operand to `in` does not match the map key type: expected `string`, not `int literal`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:13:5: error: left operand to `in` does not match the map key type: expected `string`, not `int literal`
|
||||
11 | println('ok')
|
||||
12 | }
|
||||
13 | if 2 in m {
|
||||
| ~~
|
||||
| ~~~~~~
|
||||
14 | println('yeah')
|
||||
15 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:16:7: error: left operand to `in` does not match: expected `string`, not `int literal`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:16:5: error: left operand to `in` does not match: expected `string`, not `int literal`
|
||||
14 | println('yeah')
|
||||
15 | }
|
||||
16 | if 3 in s {
|
||||
| ~~
|
||||
| ~~~~~~
|
||||
17 | println('dope')
|
||||
18 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:19:9: error: left operand to `in` does not match: expected `string`, not `rune`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:19:5: error: left operand to `in` does not match: expected `string`, not `rune`
|
||||
17 | println('dope')
|
||||
18 | }
|
||||
19 | if `a` in s {
|
||||
| ~~
|
||||
| ~~~~~~~~
|
||||
20 | println("oh no :'(")
|
||||
21 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:22:7: error: `in` can only be used with an array/map/string
|
||||
|
@ -33,45 +33,45 @@ vlib/v/checker/tests/in_mismatch_type.vv:22:7: error: `in` can only be used with
|
|||
| ~~
|
||||
23 | println('right')
|
||||
24 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:25:12: error: left operand to `in` does not match the map key type: expected `string`, not `Int`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:25:5: error: left operand to `in` does not match the map key type: expected `string`, not `Int`
|
||||
23 | println('right')
|
||||
24 | }
|
||||
25 | if Int(2) in m {
|
||||
| ~~
|
||||
| ~~~~~~~~~~~
|
||||
26 | println('yeah')
|
||||
27 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:28:9: error: left operand to `in` does not match the array element type: expected `int`, not `string`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:28:5: error: left operand to `in` does not match the array element type: expected `int`, not `string`
|
||||
26 | println('yeah')
|
||||
27 | }
|
||||
28 | if '3' in a_i {
|
||||
| ~~
|
||||
| ~~~~~~~~~~
|
||||
29 | println('sure')
|
||||
30 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:31:9: error: left operand to `in` does not match the array element type: expected `int`, not `string`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:31:5: error: left operand to `in` does not match the array element type: expected `int`, not `string`
|
||||
29 | println('sure')
|
||||
30 | }
|
||||
31 | if '2' in a_i {
|
||||
| ~~
|
||||
| ~~~~~~~~~~
|
||||
32 | println('all right')
|
||||
33 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:34:7: error: left operand to `!in` does not match the array element type: expected `string`, not `int literal`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:34:5: error: left operand to `!in` does not match the array element type: expected `string`, not `int literal`
|
||||
32 | println('all right')
|
||||
33 | }
|
||||
34 | if 1 !in a_s {
|
||||
| ~~~
|
||||
| ~~~~~~~~~
|
||||
35 | println('ok')
|
||||
36 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:37:9: error: left operand to `!in` does not match the array element type: expected `int`, not `string`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:37:5: error: left operand to `!in` does not match the array element type: expected `int`, not `string`
|
||||
35 | println('ok')
|
||||
36 | }
|
||||
37 | if '1' !in a_i {
|
||||
| ~~~
|
||||
| ~~~~~~~~~~~
|
||||
38 | println('good')
|
||||
39 | }
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:41:7: error: left operand to `!in` does not match the map key type: expected `string`, not `int literal`
|
||||
vlib/v/checker/tests/in_mismatch_type.vv:41:5: error: left operand to `!in` does not match the map key type: expected `string`, not `int literal`
|
||||
39 | }
|
||||
40 |
|
||||
41 | if 5 !in m {
|
||||
| ~~~
|
||||
| ~~~~~~~
|
||||
42 | println('yay')
|
||||
43 | }
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
vlib/v/checker/tests/infix_err.vv:7:8: error: mismatched types `string` and `?string`
|
||||
vlib/v/checker/tests/infix_err.vv:7:5: error: mismatched types `string` and `?string`
|
||||
5 | return none
|
||||
6 | }
|
||||
7 | _ = '' + f()
|
||||
| ^
|
||||
| ~~~~~~~~
|
||||
8 | _ = f() + ''
|
||||
9 | _ = f() + f()
|
||||
vlib/v/checker/tests/infix_err.vv:8:9: error: mismatched types `?string` and `string`
|
||||
vlib/v/checker/tests/infix_err.vv:8:5: error: mismatched types `?string` and `string`
|
||||
6 | }
|
||||
7 | _ = '' + f()
|
||||
8 | _ = f() + ''
|
||||
| ^
|
||||
| ~~~~~~~~
|
||||
9 | _ = f() + f()
|
||||
10 |
|
||||
vlib/v/checker/tests/infix_err.vv:9:9: error: `+` cannot be used with `?string`
|
||||
|
@ -17,20 +17,20 @@ vlib/v/checker/tests/infix_err.vv:9:9: error: `+` cannot be used with `?string`
|
|||
8 | _ = f() + ''
|
||||
9 | _ = f() + f()
|
||||
| ^
|
||||
10 |
|
||||
10 |
|
||||
11 | _ = 4 + g()
|
||||
vlib/v/checker/tests/infix_err.vv:11:7: error: `+` cannot be used with `?int`
|
||||
9 | _ = f() + f()
|
||||
10 |
|
||||
10 |
|
||||
11 | _ = 4 + g()
|
||||
| ^
|
||||
12 | _ = int(0) + g() // FIXME not detected
|
||||
13 | _ = g() + int(3)
|
||||
vlib/v/checker/tests/infix_err.vv:12:12: error: unwrapped optional cannot be used in an infix expression
|
||||
10 |
|
||||
vlib/v/checker/tests/infix_err.vv:12:5: error: unwrapped optional cannot be used in an infix expression
|
||||
10 |
|
||||
11 | _ = 4 + g()
|
||||
12 | _ = int(0) + g() // FIXME not detected
|
||||
| ^
|
||||
| ~~~~~~~~~~~~
|
||||
13 | _ = g() + int(3)
|
||||
14 | _ = g() + 3
|
||||
vlib/v/checker/tests/infix_err.vv:13:9: error: `+` cannot be used with `?int`
|
||||
|
@ -45,10 +45,10 @@ vlib/v/checker/tests/infix_err.vv:14:9: error: `+` cannot be used with `?int`
|
|||
13 | _ = g() + int(3)
|
||||
14 | _ = g() + 3
|
||||
| ^
|
||||
15 |
|
||||
15 |
|
||||
16 | // binary operands
|
||||
vlib/v/checker/tests/infix_err.vv:17:5: error: left operand for `&&` is not a boolean
|
||||
15 |
|
||||
15 |
|
||||
16 | // binary operands
|
||||
17 | _ = 1 && 2
|
||||
| ^
|
||||
|
@ -59,10 +59,10 @@ vlib/v/checker/tests/infix_err.vv:18:13: error: right operand for `||` is not a
|
|||
17 | _ = 1 && 2
|
||||
18 | _ = true || 2
|
||||
| ^
|
||||
19 |
|
||||
19 |
|
||||
20 | // boolean expressions
|
||||
vlib/v/checker/tests/infix_err.vv:21:22: error: use `()` to make the boolean expression clear
|
||||
19 |
|
||||
19 |
|
||||
20 | // boolean expressions
|
||||
21 | _ = 1 == 1 && 2 == 2 || 3 == 3
|
||||
| ~~
|
||||
|
@ -79,3 +79,4 @@ vlib/v/checker/tests/infix_err.vv:24:2: error: use `()` to make the boolean expr
|
|||
23 | && 2 == 2 || 3 == 3
|
||||
24 | && 4 == 4
|
||||
| ~~
|
||||
|
||||
|
|
|
@ -5,11 +5,11 @@ vlib/v/checker/tests/method_op_alias_err.vv:4:18: error: expected `Foo` not `Foo
|
|||
| ~~~~
|
||||
5 | return Foo2(f + f1)
|
||||
6 | }
|
||||
vlib/v/checker/tests/method_op_alias_err.vv:5:19: error: infix expr: cannot use `string` (right expression) as `string`
|
||||
vlib/v/checker/tests/method_op_alias_err.vv:5:17: error: infix expr: cannot use `string` (right expression) as `string`
|
||||
3 |
|
||||
4 | fn (f Foo) + (f1 Foo2) Foo2 {
|
||||
5 | return Foo2(f + f1)
|
||||
| ^
|
||||
| ~~~~~~
|
||||
6 | }
|
||||
7 |
|
||||
vlib/v/checker/tests/method_op_alias_err.vv:8:1: error: cannot define operator methods on type alias for `string`
|
||||
|
@ -40,3 +40,4 @@ vlib/v/checker/tests/method_op_alias_err.vv:16:6: error: cannot use operator met
|
|||
| ~~
|
||||
17 | println(f)
|
||||
18 | }
|
||||
|
||||
|
|
|
@ -26,25 +26,25 @@ vlib/v/checker/tests/method_op_err.vv:22:1: error: argument cannot be `mut` for
|
|||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
23 | return User{}
|
||||
24 | }
|
||||
vlib/v/checker/tests/method_op_err.vv:32:24: error: infix expr: cannot use `Foo` (right expression) as `User`
|
||||
vlib/v/checker/tests/method_op_err.vv:32:13: error: infix expr: cannot use `Foo` (right expression) as `User`
|
||||
30 | fn main() {
|
||||
31 | println(User{3, 4})
|
||||
32 | println(User{3, 4} - Foo{3, 3})
|
||||
| ^
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~
|
||||
33 | println(User{3, 2} < User{2, 4})
|
||||
34 | println(User{3, 4} < Foo{3, 4})
|
||||
vlib/v/checker/tests/method_op_err.vv:33:24: error: undefined operation `User` < `User`
|
||||
vlib/v/checker/tests/method_op_err.vv:33:13: error: undefined operation `User` < `User`
|
||||
31 | println(User{3, 4})
|
||||
32 | println(User{3, 4} - Foo{3, 3})
|
||||
33 | println(User{3, 2} < User{2, 4})
|
||||
| ^
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~
|
||||
34 | println(User{3, 4} < Foo{3, 4})
|
||||
35 | mut u := User{3, 4}
|
||||
vlib/v/checker/tests/method_op_err.vv:34:24: error: mismatched types `User` and `Foo`
|
||||
vlib/v/checker/tests/method_op_err.vv:34:13: error: mismatched types `User` and `Foo`
|
||||
32 | println(User{3, 4} - Foo{3, 3})
|
||||
33 | println(User{3, 2} < User{2, 4})
|
||||
34 | println(User{3, 4} < Foo{3, 4})
|
||||
| ^
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~
|
||||
35 | mut u := User{3, 4}
|
||||
36 | u += 12
|
||||
vlib/v/checker/tests/method_op_err.vv:36:10: error: cannot assign to `u`: expected `User`, not `int literal`
|
||||
|
@ -67,3 +67,4 @@ vlib/v/checker/tests/method_op_err.vv:38:7: error: operator `+` must return `Use
|
|||
38 | u += User{2, 3}
|
||||
| ~~
|
||||
39 | }
|
||||
|
||||
|
|
|
@ -2,40 +2,41 @@ vlib/v/checker/tests/minus_op_wrong_type_err.vv:3:13: error: mismatched types `A
|
|||
1 | struct Aaa{}
|
||||
2 | fn main() {
|
||||
3 | println(Aaa{} - 10)
|
||||
| ~~~~~
|
||||
| ~~~~~~~~~~
|
||||
4 | println(10 - Aaa{})
|
||||
5 | println([1,2,3] - 10)
|
||||
vlib/v/checker/tests/minus_op_wrong_type_err.vv:4:18: error: mismatched types `int literal` and `Aaa`
|
||||
vlib/v/checker/tests/minus_op_wrong_type_err.vv:4:13: error: mismatched types `int literal` and `Aaa`
|
||||
2 | fn main() {
|
||||
3 | println(Aaa{} - 10)
|
||||
4 | println(10 - Aaa{})
|
||||
| ~~~~~
|
||||
| ~~~~~~~~~~
|
||||
5 | println([1,2,3] - 10)
|
||||
6 | println(10 - [1,2,3])
|
||||
vlib/v/checker/tests/minus_op_wrong_type_err.vv:5:13: error: mismatched types `[]int` and `int literal`
|
||||
3 | println(Aaa{} - 10)
|
||||
4 | println(10 - Aaa{})
|
||||
5 | println([1,2,3] - 10)
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~~
|
||||
6 | println(10 - [1,2,3])
|
||||
7 | a := map[string]int
|
||||
vlib/v/checker/tests/minus_op_wrong_type_err.vv:6:18: error: mismatched types `int literal` and `[]int`
|
||||
vlib/v/checker/tests/minus_op_wrong_type_err.vv:6:13: error: mismatched types `int literal` and `[]int`
|
||||
4 | println(10 - Aaa{})
|
||||
5 | println([1,2,3] - 10)
|
||||
6 | println(10 - [1,2,3])
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~~
|
||||
7 | a := map[string]int
|
||||
8 | println(a - 10)
|
||||
vlib/v/checker/tests/minus_op_wrong_type_err.vv:8:13: error: mismatched types `map[string]int` and `int literal`
|
||||
6 | println(10 - [1,2,3])
|
||||
7 | a := map[string]int
|
||||
8 | println(a - 10)
|
||||
| ^
|
||||
| ~~~~~~
|
||||
9 | println(10 - a)
|
||||
10 | }
|
||||
vlib/v/checker/tests/minus_op_wrong_type_err.vv:9:18: error: mismatched types `int literal` and `map[string]int`
|
||||
vlib/v/checker/tests/minus_op_wrong_type_err.vv:9:13: error: mismatched types `int literal` and `map[string]int`
|
||||
7 | a := map[string]int
|
||||
8 | println(a - 10)
|
||||
9 | println(10 - a)
|
||||
| ^
|
||||
| ~~~~~~
|
||||
10 | }
|
||||
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
vlib/v/checker/tests/mismatched_ptr_op_ptr.vv:5:18: error: mismatched types `&string` and `string`
|
||||
3 | unsafe {
|
||||
4 | b := &a
|
||||
5 | println(b+*b)
|
||||
| ^
|
||||
6 | println(b+b)
|
||||
7 | }
|
||||
vlib/v/checker/tests/mismatched_ptr_op_ptr.vv:6:18: error: mismatched types `&string` and `&string`
|
||||
4 | b := &a
|
||||
5 | println(b+*b)
|
||||
6 | println(b+b)
|
||||
| ^
|
||||
7 | }
|
||||
8 | }
|
||||
vlib/v/checker/tests/mismatched_ptr_op_ptr.vv:5:17: error: mismatched types `&string` and `string`
|
||||
3 | unsafe {
|
||||
4 | b := &a
|
||||
5 | println(b+*b)
|
||||
| ~~~
|
||||
6 | println(b+b)
|
||||
7 | }
|
||||
vlib/v/checker/tests/mismatched_ptr_op_ptr.vv:6:17: error: mismatched types `&string` and `&string`
|
||||
4 | b := &a
|
||||
5 | println(b+*b)
|
||||
6 | println(b+b)
|
||||
| ~~~
|
||||
7 | }
|
||||
8 | }
|
||||
|
||||
|
|
|
@ -16,40 +16,41 @@ vlib/v/checker/tests/mod_op_wrong_type_err.vv:5:10: error: mismatched types `[]i
|
|||
3 | println(0.5 % 1)
|
||||
4 | println(1 % 0.5)
|
||||
5 | println([1,2,3] % 1)
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~
|
||||
6 | println(1 % [1,2,3])
|
||||
7 | a := Aaa{}
|
||||
vlib/v/checker/tests/mod_op_wrong_type_err.vv:6:14: error: mismatched types `int literal` and `[]int`
|
||||
vlib/v/checker/tests/mod_op_wrong_type_err.vv:6:10: error: mismatched types `int literal` and `[]int`
|
||||
4 | println(1 % 0.5)
|
||||
5 | println([1,2,3] % 1)
|
||||
6 | println(1 % [1,2,3])
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~
|
||||
7 | a := Aaa{}
|
||||
8 | println(a % 1)
|
||||
vlib/v/checker/tests/mod_op_wrong_type_err.vv:8:10: error: mismatched types `Aaa` and `int literal`
|
||||
6 | println(1 % [1,2,3])
|
||||
7 | a := Aaa{}
|
||||
8 | println(a % 1)
|
||||
| ^
|
||||
| ~~~~~
|
||||
9 | println(1 % a)
|
||||
10 | b := map[string]int
|
||||
vlib/v/checker/tests/mod_op_wrong_type_err.vv:9:14: error: mismatched types `int literal` and `Aaa`
|
||||
vlib/v/checker/tests/mod_op_wrong_type_err.vv:9:10: error: mismatched types `int literal` and `Aaa`
|
||||
7 | a := Aaa{}
|
||||
8 | println(a % 1)
|
||||
9 | println(1 % a)
|
||||
| ^
|
||||
| ~~~~~
|
||||
10 | b := map[string]int
|
||||
11 | println(b % 1)
|
||||
vlib/v/checker/tests/mod_op_wrong_type_err.vv:11:10: error: mismatched types `map[string]int` and `int literal`
|
||||
9 | println(1 % a)
|
||||
10 | b := map[string]int
|
||||
11 | println(b % 1)
|
||||
| ^
|
||||
| ~~~~~
|
||||
12 | println(1 % b)
|
||||
13 | }
|
||||
vlib/v/checker/tests/mod_op_wrong_type_err.vv:12:14: error: mismatched types `int literal` and `map[string]int`
|
||||
vlib/v/checker/tests/mod_op_wrong_type_err.vv:12:10: error: mismatched types `int literal` and `map[string]int`
|
||||
10 | b := map[string]int
|
||||
11 | println(b % 1)
|
||||
12 | println(1 % b)
|
||||
| ^
|
||||
| ~~~~~
|
||||
13 | }
|
||||
|
||||
|
|
|
@ -2,55 +2,56 @@ vlib/v/checker/tests/mul_op_wrong_type_err.vv:5:13: error: mismatched types `Aaa
|
|||
3 | struct Aaa{}
|
||||
4 | fn main() {
|
||||
5 | println(Aaa{} * 10)
|
||||
| ~~~~~
|
||||
| ~~~~~~~~~~
|
||||
6 | println(10 * Aaa{})
|
||||
7 | println([1,2,3] * 10)
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:6:18: error: mismatched types `int literal` and `Aaa`
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:6:13: error: mismatched types `int literal` and `Aaa`
|
||||
4 | fn main() {
|
||||
5 | println(Aaa{} * 10)
|
||||
6 | println(10 * Aaa{})
|
||||
| ~~~~~
|
||||
| ~~~~~~~~~~
|
||||
7 | println([1,2,3] * 10)
|
||||
8 | println(10 * [1,2,3])
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:7:13: error: mismatched types `[]int` and `int literal`
|
||||
5 | println(Aaa{} * 10)
|
||||
6 | println(10 * Aaa{})
|
||||
7 | println([1,2,3] * 10)
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~~
|
||||
8 | println(10 * [1,2,3])
|
||||
9 | a := map[string]int
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:8:18: error: mismatched types `int literal` and `[]int`
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:8:13: error: mismatched types `int literal` and `[]int`
|
||||
6 | println(10 * Aaa{})
|
||||
7 | println([1,2,3] * 10)
|
||||
8 | println(10 * [1,2,3])
|
||||
| ~~~~~~~
|
||||
| ~~~~~~~~~~~~
|
||||
9 | a := map[string]int
|
||||
10 | println(a * 10)
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:10:13: error: mismatched types `map[string]int` and `int literal`
|
||||
8 | println(10 * [1,2,3])
|
||||
9 | a := map[string]int
|
||||
10 | println(a * 10)
|
||||
| ^
|
||||
| ~~~~~~
|
||||
11 | println(10 * a)
|
||||
12 | c1 := cmplx.complex(1,-2)
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:11:18: error: mismatched types `int literal` and `map[string]int`
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:11:13: error: mismatched types `int literal` and `map[string]int`
|
||||
9 | a := map[string]int
|
||||
10 | println(a * 10)
|
||||
11 | println(10 * a)
|
||||
| ^
|
||||
| ~~~~~~
|
||||
12 | c1 := cmplx.complex(1,-2)
|
||||
13 | c2 := c1 * 2.0
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:13:11: error: infix expr: cannot use `float literal` (right expression) as `math.complex.Complex`
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:13:8: error: infix expr: cannot use `float literal` (right expression) as `math.complex.Complex`
|
||||
11 | println(10 * a)
|
||||
12 | c1 := cmplx.complex(1,-2)
|
||||
13 | c2 := c1 * 2.0
|
||||
| ^
|
||||
| ~~~~~~~~
|
||||
14 | println(c2)
|
||||
15 | c3 := 2.0 * c1
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:15:12: error: infix expr: cannot use `math.complex.Complex` (right expression) as `float literal`
|
||||
vlib/v/checker/tests/mul_op_wrong_type_err.vv:15:8: error: infix expr: cannot use `math.complex.Complex` (right expression) as `float literal`
|
||||
13 | c2 := c1 * 2.0
|
||||
14 | println(c2)
|
||||
15 | c3 := 2.0 * c1
|
||||
| ^
|
||||
| ~~~~~~~~
|
||||
16 | println(c3)
|
||||
17 | }
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
vlib/v/checker/tests/unwrapped_optional_infix.vv:5:16: error: unwrapped optional cannot be used in an infix expression
|
||||
vlib/v/checker/tests/unwrapped_optional_infix.vv:5:9: error: unwrapped optional cannot be used in an infix expression
|
||||
3 | }
|
||||
4 |
|
||||
5 | println(test() == "")
|
||||
| ~~
|
||||
| ~~~~~~~~~~~~
|
||||
|
||||
|
|
Loading…
Reference in New Issue