From 3f1ba3d64fc851b6ea206ee6ab56c7c8d4e8cfa0 Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 24 Jul 2024 23:40:42 +0800 Subject: [PATCH] checker: check enum field value duplicate 2 (#21924) --- vlib/v/checker/checker.v | 10 +++++++--- .../checker/tests/enum_field_value_duplicate_e.out | 7 +++++++ .../v/checker/tests/enum_field_value_duplicate_e.vv | 13 +++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 vlib/v/checker/tests/enum_field_value_duplicate_e.out create mode 100644 vlib/v/checker/tests/enum_field_value_duplicate_e.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 57c7b789f2..6840fe67bf 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1952,9 +1952,13 @@ 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 + mut t := transformer.new_transformer_with_table(c.table, + c.pref) + folded_expr := t.expr(mut field.expr.obj.expr) + + if folded_expr is ast.IntegerLiteral { + c.check_enum_field_integer_literal(folded_expr, signed, + node.is_multi_allowed, senum_type, field.expr.pos, mut useen, enum_umin, enum_umax, mut iseen, enum_imin, enum_imax) } diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_e.out b/vlib/v/checker/tests/enum_field_value_duplicate_e.out new file mode 100644 index 0000000000..93314f28d6 --- /dev/null +++ b/vlib/v/checker/tests/enum_field_value_duplicate_e.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/enum_field_value_duplicate_e.vv:4:6: error: enum value `2` already exists + 2 | a = one + 3 | b + 4 | c = one + | ~~~ + 5 | } + 6 | diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_e.vv b/vlib/v/checker/tests/enum_field_value_duplicate_e.vv new file mode 100644 index 0000000000..60e963ad0a --- /dev/null +++ b/vlib/v/checker/tests/enum_field_value_duplicate_e.vv @@ -0,0 +1,13 @@ +enum MyEnum { + a = one + b + c = one +} + +const one = 1 + 1 + +fn main() { + $for val in MyEnum.values { + println('> name: ${val.name} | value: ${val.value}') + } +}