checker: improve error message for match branch type mismatch (#6588)

pull/6593/head
Nick Treleaven 2020-10-09 15:11:11 +01:00 committed by GitHub
parent a6f7f0ac8a
commit f734f8167b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 55 additions and 30 deletions

View File

@ -3173,7 +3173,7 @@ fn (mut c Checker) match_exprs(mut node ast.MatchExpr, type_sym table.TypeSymbol
} else if !c.check_types(expr_type, c.expected_type) {
expr_str := c.table.type_to_str(expr_type)
expect_str := c.table.type_to_str(c.expected_type)
c.error('cannot use type `$expect_str` as type `$expr_str`', node.pos)
c.error('cannot match `$expr_str` with `$expect_str` condition', branch.pos)
}
branch_exprs[key] = val + 1
}

View File

@ -1,13 +1,14 @@
vlib/v/checker/tests/match_expr_and_expected_type_error.vv:2:1: error: cannot use type `rune` as type `string`
vlib/v/checker/tests/match_expr_and_expected_type_error.vv:3:3: error: cannot match `string` with `rune` condition
1 | ch := `a`
2 | match ch {
| ~~~~~~~~~~
3 | 'a' {}
| ~~~~~
4 | else {}
vlib/v/checker/tests/match_expr_and_expected_type_error.vv:8:1: error: cannot use type `int` as type `string`
6 |
7 | char := 123
8 | match char {
| ~~~~~~~~~~~~
5 | }
vlib/v/checker/tests/match_expr_and_expected_type_error.vv:9:3: error: cannot match `string` with `int` condition
7 | i := 123
8 | match i {
9 | 'a' {}
| ~~~~~
10 | else {}
11 | }

View File

@ -4,8 +4,8 @@ match ch {
else {}
}
char := 123
match char {
i := 123
match i {
'a' {}
else {}
}

View File

@ -0,0 +1,21 @@
vlib/v/checker/tests/match_invalid_type.vv:5:3: error: cannot match `byte` with `IoS` condition
3 | fn sum() {
4 | match IoS(1) {
5 | byte {
| ~~~~~~
6 | println('not cool')
7 | }
vlib/v/checker/tests/match_invalid_type.vv:4:2: error: match must be exhaustive (add match branches for: `int`, `string` or `else {}` at the end)
2 |
3 | fn sum() {
4 | match IoS(1) {
| ~~~~~~~~~~~~~~
5 | byte {
6 | println('not cool')
vlib/v/checker/tests/match_invalid_type.vv:24:3: error: `Cat` doesn't implement method `speak`
22 | a := Animal(Dog{})
23 | match a {
24 | Cat {
| ~~~~~
25 | println('not cool either')
26 | }

View File

@ -1,5 +1,13 @@
type IoS = int | string
fn sum() {
match IoS(1) {
byte {
println('not cool')
}
}
}
interface Animal {
speak()
}
@ -10,12 +18,7 @@ fn (d Dog) speak() {}
struct Cat {}
fn main() {
match IoS(1) {
byte {
println('not cool')
}
}
fn iface() {
a := Animal(Dog{})
match a {
Cat {

View File

@ -1,14 +0,0 @@
vlib/v/checker/tests/match_sumtype_type_invalid.vv:14:2: error: cannot use type `IoS` as type `byte`
12 |
13 | fn main() {
14 | match IoS(1) {
| ~~~~~~~~~~~~~~
15 | byte {
16 | println('not cool')
vlib/v/checker/tests/match_sumtype_type_invalid.vv:21:3: error: `Cat` doesn't implement method `speak`
19 | a := Animal(Dog{})
20 | match a {
21 | Cat {
| ~~~~~
22 | println('not cool either')
23 | }

View File

@ -5,3 +5,17 @@ vlib/v/checker/tests/match_undefined_cond.vv:4:15: error: undefined ident: `Asd`
| ~~~
5 | 1 { 'foo' }
6 | 2 { 'test' }
vlib/v/checker/tests/match_undefined_cond.vv:5:3: error: cannot match `any_int` with `void` condition
3 | fn main() {
4 | res := match Asd {
5 | 1 { 'foo' }
| ~~~
6 | 2 { 'test' }
7 | else { '' }
vlib/v/checker/tests/match_undefined_cond.vv:6:3: error: cannot match `any_int` with `void` condition
4 | res := match Asd {
5 | 1 { 'foo' }
6 | 2 { 'test' }
| ~~~
7 | else { '' }
8 | }