Skip to content

Commit c51f83e

Browse files
authored
checker: fix match expr type mismatch (#11220)
1 parent 1dee4f2 commit c51f83e

File tree

3 files changed

+36
-8
lines changed

3 files changed

+36
-8
lines changed

vlib/v/checker/checker.v

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6091,7 +6091,8 @@ pub fn (mut c Checker) match_expr(mut node ast.MatchExpr) ast.Type {
60916091
}
60926092
stmt.typ = expr_type
60936093
} else if node.is_expr && ret_type != expr_type {
6094-
if !c.check_types(ret_type, expr_type) {
6094+
if !c.check_types(ret_type, expr_type)
6095+
&& !c.check_types(expr_type, ret_type) {
60956096
ret_sym := c.table.get_type_symbol(ret_type)
60966097
if !(node.is_expr && ret_sym.kind == .sum_type) {
60976098
c.error('return type mismatch, it should be `$ret_sym.name`',

vlib/v/checker/tests/if_match_expr.out

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,3 @@ vlib/v/checker/tests/if_match_expr.vv:23:3: error: `match` expression branch has
4040
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4141
24 | _ = match true {true {1} else {-1}} // OK
4242
25 | match true {true {1} else {-1}} // result
43-
vlib/v/checker/tests/if_match_expr.vv:25:3: error: return type mismatch, it should be `int`
44-
23 | match true {true {} else {}} // statement not expression
45-
24 | _ = match true {true {1} else {-1}} // OK
46-
25 | match true {true {1} else {-1}} // result
47-
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48-
26 | }
49-
27 | }
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
struct Data {
2+
x f64
3+
y f64
4+
}
5+
6+
fn (d Data) test(n int) f64 {
7+
return match n {
8+
0 { d.x }
9+
1 { d.y }
10+
else { 0 }
11+
}
12+
}
13+
14+
fn test1(n int) f64 {
15+
return match n {
16+
0 { 1 }
17+
1 { 2 }
18+
else { 0 }
19+
}
20+
}
21+
22+
fn test_match_expr_with_promote_number() {
23+
d := Data{
24+
x: 1
25+
y: 2
26+
}
27+
ret1 := d.test(2)
28+
println(ret1)
29+
assert ret1 == 0
30+
31+
ret2 := test1(2)
32+
println(ret2)
33+
assert ret2 == 0
34+
}

0 commit comments

Comments
 (0)