From 9ad14757cb6dd20e98c22a89c566467498947a95 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 25 Mar 2026 16:42:22 +0300 Subject: [PATCH] checker: fix enum values set with constants from $if/$else (fixes #23348) --- vlib/v/checker/checker.v | 15 +++++++++++++++ .../tests/enum_field_value_duplicate_f.out | 7 +++++++ .../checker/tests/enum_field_value_duplicate_f.vv | 7 +++++++ 3 files changed, 29 insertions(+) create mode 100644 vlib/v/checker/tests/enum_field_value_duplicate_f.out create mode 100644 vlib/v/checker/tests/enum_field_value_duplicate_f.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 697b25191..31ba71932 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3116,6 +3116,20 @@ 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 comptime_value := c.eval_comptime_const_expr(field.expr, + 0) + { + if comptime_lit := c.comptime_value_to_integer_literal(comptime_value, + field.expr.pos) + { + c.check_enum_field_integer_literal(comptime_lit, + signed, node.is_multi_allowed, senum_type, + field.expr.pos, mut useen, enum_umin, enum_umax, mut + iseen, enum_imin, enum_imax) + field.expr = comptime_lit + continue + } + } folded_expr := c.checker_transformer.expr(mut field.expr.obj.expr) if folded_expr is ast.IntegerLiteral { @@ -3123,6 +3137,7 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) { node.is_multi_allowed, senum_type, field.expr.pos, mut useen, enum_umin, enum_umax, mut iseen, enum_imin, enum_imax) + field.expr = folded_expr } } continue diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_f.out b/vlib/v/checker/tests/enum_field_value_duplicate_f.out new file mode 100644 index 000000000..9bac86838 --- /dev/null +++ b/vlib/v/checker/tests/enum_field_value_duplicate_f.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/enum_field_value_duplicate_f.vv:6:8: error: enum value `2` already exists + 4 | enum Foo { + 5 | foo = x + 6 | bar = y + | ^ + 7 | } +Details: use `@[_allow_multiple_values]` attribute to allow multiple enum values. Use only when it is needed diff --git a/vlib/v/checker/tests/enum_field_value_duplicate_f.vv b/vlib/v/checker/tests/enum_field_value_duplicate_f.vv new file mode 100644 index 000000000..64e9dcd8a --- /dev/null +++ b/vlib/v/checker/tests/enum_field_value_duplicate_f.vv @@ -0,0 +1,7 @@ +const x = $if duplicate_enum_value_check ? { 1 } $else { 2 } +const y = $if duplicate_enum_value_check ? { 3 } $else { 2 } + +enum Foo { + foo = x + bar = y +} -- 2.39.5