From dc431a3c47e3c5fcc5cfb319dc601f6e809f4081 Mon Sep 17 00:00:00 2001 From: Lukas Neubert Date: Sat, 5 Jun 2021 11:28:17 +0200 Subject: [PATCH] checker: prevent enum value duplication check bypass (#10287) --- vlib/v/checker/checker.v | 2 ++ ...e_duplicate_err.out => enum_field_value_duplicate_a.out} | 4 ++-- ...lue_duplicate_err.vv => enum_field_value_duplicate_a.vv} | 0 vlib/v/checker/tests/enum_field_value_duplicate_b.out | 6 ++++++ vlib/v/checker/tests/enum_field_value_duplicate_b.vv | 5 +++++ 5 files changed, 15 insertions(+), 2 deletions(-) rename vlib/v/checker/tests/{enum_field_value_duplicate_err.out => enum_field_value_duplicate_a.out} (53%) rename vlib/v/checker/tests/{enum_field_value_duplicate_err.vv => enum_field_value_duplicate_a.vv} (100%) create mode 100644 vlib/v/checker/tests/enum_field_value_duplicate_b.out create mode 100644 vlib/v/checker/tests/enum_field_value_duplicate_b.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 07d594c307..c778da7763 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3208,6 +3208,8 @@ pub fn (mut c Checker) enum_decl(decl ast.EnumDecl) { last := seen[seen.len - 1] if last == checker.int_max { c.error('enum value overflows', field.pos) + } else if !decl.is_multi_allowed && last + 1 in seen { + c.error('enum value `${last + 1}` already exists', field.pos) } seen << last + 1 } else { diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_err.out b/vlib/v/checker/tests/enum_field_value_duplicate_a.out similarity index 53% rename from vlib/v/checker/tests/enum_field_value_duplicate_err.out rename to vlib/v/checker/tests/enum_field_value_duplicate_a.out index a2926dc1a0..ce72e69867 100644 --- a/vlib/v/checker/tests/enum_field_value_duplicate_err.out +++ b/vlib/v/checker/tests/enum_field_value_duplicate_a.out @@ -1,11 +1,11 @@ -vlib/v/checker/tests/enum_field_value_duplicate_err.vv:3:10: error: enum value `0` already exists +vlib/v/checker/tests/enum_field_value_duplicate_a.vv:3:10: error: enum value `0` already exists 1 | enum Color { 2 | red 3 | green = 0 | ^ 4 | blue = 1 5 | alpha = 1 -vlib/v/checker/tests/enum_field_value_duplicate_err.vv:5:10: error: enum value `1` already exists +vlib/v/checker/tests/enum_field_value_duplicate_a.vv:5:10: error: enum value `1` already exists 3 | green = 0 4 | blue = 1 5 | alpha = 1 diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_err.vv b/vlib/v/checker/tests/enum_field_value_duplicate_a.vv similarity index 100% rename from vlib/v/checker/tests/enum_field_value_duplicate_err.vv rename to vlib/v/checker/tests/enum_field_value_duplicate_a.vv diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_b.out b/vlib/v/checker/tests/enum_field_value_duplicate_b.out new file mode 100644 index 0000000000..c1a9ae2ab8 --- /dev/null +++ b/vlib/v/checker/tests/enum_field_value_duplicate_b.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/enum_field_value_duplicate_b.vv:4:2: error: enum value `0` already exists + 2 | red // 0 + 3 | green = -1 + 4 | blue // -1 + 1 = 0 + | ~~~~ + 5 | } diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_b.vv b/vlib/v/checker/tests/enum_field_value_duplicate_b.vv new file mode 100644 index 0000000000..232a265991 --- /dev/null +++ b/vlib/v/checker/tests/enum_field_value_duplicate_b.vv @@ -0,0 +1,5 @@ +enum Color { + red // 0 + green = -1 + blue // -1 + 1 = 0 +}