From be53b02511bc82b6f0677f83dc28f236e6845276 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Mon, 18 Sep 2023 18:37:30 +0530 Subject: [PATCH] checker: require `else` branch in `[flag]` enum match (#19375) --- vlib/v/checker/match.v | 3 +++ .../tests/flag_enum_exhaustive_else_branch.out | 7 +++++++ .../tests/flag_enum_exhaustive_else_branch.vv | 16 ++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 vlib/v/checker/tests/flag_enum_exhaustive_else_branch.out create mode 100644 vlib/v/checker/tests/flag_enum_exhaustive_else_branch.vv diff --git a/vlib/v/checker/match.v b/vlib/v/checker/match.v index f02eef7f6a..1a6ab4d392 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 0000000000..190ec35543 --- /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 0000000000..bf45e8443f --- /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 +}