From 6e262b5d84a751bcde80e6081b90e9dc00bea3bb Mon Sep 17 00:00:00 2001 From: zakuro Date: Fri, 19 Feb 2021 19:38:41 +0900 Subject: [PATCH] checker: improve error position of infix expr (#8828) --- vlib/v/checker/checker.v | 31 ++++++------ .../v/checker/tests/add_op_wrong_type_err.out | 19 +++---- ...ypesymbol_to_a_type_should_not_compile.out | 5 +- .../v/checker/tests/div_op_wrong_type_err.out | 19 +++---- .../checker/tests/eq_ne_op_wrong_type_err.out | 49 ++++++++++--------- vlib/v/checker/tests/in_mismatch_type.out | 40 +++++++-------- vlib/v/checker/tests/infix_err.out | 27 +++++----- vlib/v/checker/tests/method_op_alias_err.out | 5 +- vlib/v/checker/tests/method_op_err.out | 13 ++--- .../checker/tests/minus_op_wrong_type_err.out | 19 +++---- .../v/checker/tests/mismatched_ptr_op_ptr.out | 29 +++++------ .../v/checker/tests/mod_op_wrong_type_err.out | 19 +++---- .../v/checker/tests/mul_op_wrong_type_err.out | 27 +++++----- .../tests/unwrapped_optional_infix.out | 5 +- 14 files changed, 160 insertions(+), 147 deletions(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index a6bd20ab9a..6cb1e87ac2 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -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 && diff --git a/vlib/v/checker/tests/add_op_wrong_type_err.out b/vlib/v/checker/tests/add_op_wrong_type_err.out index b87de4dd62..c1c8699172 100644 --- a/vlib/v/checker/tests/add_op_wrong_type_err.out +++ b/vlib/v/checker/tests/add_op_wrong_type_err.out @@ -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 | } + diff --git a/vlib/v/checker/tests/comparing_typesymbol_to_a_type_should_not_compile.out b/vlib/v/checker/tests/comparing_typesymbol_to_a_type_should_not_compile.out index 100aac079e..c17d271954 100644 --- a/vlib/v/checker/tests/comparing_typesymbol_to_a_type_should_not_compile.out +++ b/vlib/v/checker/tests/comparing_typesymbol_to_a_type_should_not_compile.out @@ -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) + diff --git a/vlib/v/checker/tests/div_op_wrong_type_err.out b/vlib/v/checker/tests/div_op_wrong_type_err.out index 328114a939..f79c286a71 100644 --- a/vlib/v/checker/tests/div_op_wrong_type_err.out +++ b/vlib/v/checker/tests/div_op_wrong_type_err.out @@ -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 | } + diff --git a/vlib/v/checker/tests/eq_ne_op_wrong_type_err.out b/vlib/v/checker/tests/eq_ne_op_wrong_type_err.out index 08a0cefd34..ad5375f0e6 100644 --- a/vlib/v/checker/tests/eq_ne_op_wrong_type_err.out +++ b/vlib/v/checker/tests/eq_ne_op_wrong_type_err.out @@ -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 | } + diff --git a/vlib/v/checker/tests/in_mismatch_type.out b/vlib/v/checker/tests/in_mismatch_type.out index b174c0f574..70a3d94d33 100644 --- a/vlib/v/checker/tests/in_mismatch_type.out +++ b/vlib/v/checker/tests/in_mismatch_type.out @@ -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 | } diff --git a/vlib/v/checker/tests/infix_err.out b/vlib/v/checker/tests/infix_err.out index 9eddbfe8c2..abff773328 100644 --- a/vlib/v/checker/tests/infix_err.out +++ b/vlib/v/checker/tests/infix_err.out @@ -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 | ~~ + diff --git a/vlib/v/checker/tests/method_op_alias_err.out b/vlib/v/checker/tests/method_op_alias_err.out index d6872025e3..27d4c4a4b5 100644 --- a/vlib/v/checker/tests/method_op_alias_err.out +++ b/vlib/v/checker/tests/method_op_alias_err.out @@ -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 | } + diff --git a/vlib/v/checker/tests/method_op_err.out b/vlib/v/checker/tests/method_op_err.out index c24f8e5863..07ced3bcb5 100644 --- a/vlib/v/checker/tests/method_op_err.out +++ b/vlib/v/checker/tests/method_op_err.out @@ -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 | } + diff --git a/vlib/v/checker/tests/minus_op_wrong_type_err.out b/vlib/v/checker/tests/minus_op_wrong_type_err.out index b51dfbd6c6..77433eb35d 100644 --- a/vlib/v/checker/tests/minus_op_wrong_type_err.out +++ b/vlib/v/checker/tests/minus_op_wrong_type_err.out @@ -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 | } + diff --git a/vlib/v/checker/tests/mismatched_ptr_op_ptr.out b/vlib/v/checker/tests/mismatched_ptr_op_ptr.out index d9f324afa6..0173927f7b 100644 --- a/vlib/v/checker/tests/mismatched_ptr_op_ptr.out +++ b/vlib/v/checker/tests/mismatched_ptr_op_ptr.out @@ -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 | } + diff --git a/vlib/v/checker/tests/mod_op_wrong_type_err.out b/vlib/v/checker/tests/mod_op_wrong_type_err.out index 04285320cc..6ae53be6bd 100644 --- a/vlib/v/checker/tests/mod_op_wrong_type_err.out +++ b/vlib/v/checker/tests/mod_op_wrong_type_err.out @@ -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 | } + diff --git a/vlib/v/checker/tests/mul_op_wrong_type_err.out b/vlib/v/checker/tests/mul_op_wrong_type_err.out index 6d6c714a55..6bd5ff9ab7 100644 --- a/vlib/v/checker/tests/mul_op_wrong_type_err.out +++ b/vlib/v/checker/tests/mul_op_wrong_type_err.out @@ -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 | } + diff --git a/vlib/v/checker/tests/unwrapped_optional_infix.out b/vlib/v/checker/tests/unwrapped_optional_infix.out index 95497dd4d9..146e7e68cc 100644 --- a/vlib/v/checker/tests/unwrapped_optional_infix.out +++ b/vlib/v/checker/tests/unwrapped_optional_infix.out @@ -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() == "") - | ~~ + | ~~~~~~~~~~~~ +