From d07fc55ef1e9ee0936afc1babb29ef2b36c2af38 Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 24 Jul 2024 15:02:18 +0800 Subject: [PATCH] checker: check enum field value duplicate --- vlib/v/checker/checker.v | 8 ++++++++ .../checker/tests/enum_field_value_duplicate_d.out | 7 +++++++ .../v/checker/tests/enum_field_value_duplicate_d.vv | 13 +++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 vlib/v/checker/tests/enum_field_value_duplicate_d.out create mode 100644 vlib/v/checker/tests/enum_field_value_duplicate_d.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 303d79a6491e3b..57c7b789f2019f 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1951,6 +1951,14 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) { } if field.expr.kind == .constant && field.expr.obj.typ.is_int() { // accepts int constants as enum value + if mut field.expr.obj is ast.ConstField { + if mut field.expr.obj.expr is ast.IntegerLiteral { + c.check_enum_field_integer_literal(field.expr.obj.expr, + signed, node.is_multi_allowed, senum_type, field.expr.pos, mut + useen, enum_umin, enum_umax, mut iseen, enum_imin, + enum_imax) + } + } continue } } diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_d.out b/vlib/v/checker/tests/enum_field_value_duplicate_d.out new file mode 100644 index 00000000000000..b4350c326e08a8 --- /dev/null +++ b/vlib/v/checker/tests/enum_field_value_duplicate_d.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/enum_field_value_duplicate_d.vv:6:6: error: enum value `1` already exists + 4 | a = one + 5 | b + 6 | c = one + | ~~~ + 7 | } + 8 | diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_d.vv b/vlib/v/checker/tests/enum_field_value_duplicate_d.vv new file mode 100644 index 00000000000000..249ba9aa7d4ca5 --- /dev/null +++ b/vlib/v/checker/tests/enum_field_value_duplicate_d.vv @@ -0,0 +1,13 @@ +const one = 1 + +enum MyEnum { + a = one + b + c = one +} + +fn main() { + $for val in MyEnum.values { + println('> name: ${val.name} | value: ${val.value}') + } +}