checker: match exhaustive as stmt and with enum
parent
c04c973f84
commit
75603beeea
|
@ -1332,15 +1332,23 @@ pub fn (c mut Checker) match_expr(node mut ast.MatchExpr) table.Type {
|
|||
if cond_type == 0 {
|
||||
c.error('match 0 cond type', node.pos)
|
||||
}
|
||||
// check for exhaustion when match is expr
|
||||
if node.is_sum_type && node.is_expr && !node.branches[node.branches.len - 1].is_else {
|
||||
type_sym := c.table.get_type_symbol(cond_type)
|
||||
info := type_sym.info as table.SumType
|
||||
mut used_sum_types_count := 0
|
||||
if !node.branches[node.branches.len - 1].is_else {
|
||||
mut used_values_count := 0
|
||||
for branch in node.branches {
|
||||
used_sum_types_count += branch.exprs.len
|
||||
used_values_count += branch.exprs.len
|
||||
}
|
||||
if used_sum_types_count < info.variants.len {
|
||||
type_sym := c.table.get_type_symbol(cond_type)
|
||||
mut err := false
|
||||
match type_sym.info {
|
||||
table.SumType {
|
||||
err = used_values_count < it.variants.len
|
||||
}
|
||||
table.Enum {
|
||||
err = used_values_count < it.vals.len
|
||||
}
|
||||
else { err = false }
|
||||
}
|
||||
if err {
|
||||
c.error('match must be exhaustive', node.pos)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue