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 +}