diff --git a/vlib/v/checker/match.v b/vlib/v/checker/match.v index f02eef7f6ac8b0..1a6ab4d3923688 100644 --- a/vlib/v/checker/match.v +++ b/vlib/v/checker/match.v @@ -396,6 +396,9 @@ fn (mut c Checker) match_exprs(mut node ast.MatchExpr, cond_type_sym ast.TypeSym unhandled << '`.${v}`' } } + if cond_type_sym.info.is_flag { + is_exhaustive = false + } } else { is_exhaustive = false diff --git a/vlib/v/checker/tests/flag_enum_exhaustive_else_branch.out b/vlib/v/checker/tests/flag_enum_exhaustive_else_branch.out new file mode 100644 index 00000000000000..190ec355432903 --- /dev/null +++ b/vlib/v/checker/tests/flag_enum_exhaustive_else_branch.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/flag_enum_exhaustive_else_branch.vv:11:1: error: match must be exhaustive (add `else {}` at the end) + 9 | dump(perm) + 10 | + 11 | match perm { + | ~~~~~~~~~~~~ + 12 | .read { println('r') } + 13 | .write { println('w') } diff --git a/vlib/v/checker/tests/flag_enum_exhaustive_else_branch.vv b/vlib/v/checker/tests/flag_enum_exhaustive_else_branch.vv new file mode 100644 index 00000000000000..bf45e8443f26e8 --- /dev/null +++ b/vlib/v/checker/tests/flag_enum_exhaustive_else_branch.vv @@ -0,0 +1,16 @@ +[flag] +enum Permission { + read + write + execute +} + +perm := Permission.read | Permission.write | Permission.execute +dump(perm) + +match perm { + .read { println('r') } + .write { println('w') } + .execute { println('x') } + // must require an `else` here +}