From ef71aedef7c3d013fa0d7ddc7242ddc17f14cdec Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 25 Mar 2026 16:42:16 +0300 Subject: [PATCH] checker: fix cannot use $if/$else to set value of enum (fixes #23336) --- vlib/v/checker/checker.v | 7 ++++++- vlib/v/tests/enums/enum_with_comptime_if_expr_test.v | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/enums/enum_with_comptime_if_expr_test.v diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index bea7e1697..e194cbb9d 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2896,6 +2896,11 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) { // ensure that the minimum value is negative, even with msvc, which has a bug that makes -2147483648 positive ... enum_imin *= -1 } + saved_expected_type := c.expected_type + defer { + c.expected_type = saved_expected_type + } + c.expected_type = node.typ for i, mut field in node.fields { if !c.pref.experimental && util.contains_capital(field.name) { // TODO: C2V uses hundreds of enums with capitals, remove -experimental check once it's handled @@ -3022,7 +3027,7 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) { } } } - ast.CallExpr { + ast.CallExpr, ast.IfExpr { call_ret_type := c.expr(mut field.expr) call_expr := ast.Expr(field.expr) c.check_expr_option_or_result_call(call_expr, call_ret_type) diff --git a/vlib/v/tests/enums/enum_with_comptime_if_expr_test.v b/vlib/v/tests/enums/enum_with_comptime_if_expr_test.v new file mode 100644 index 000000000..210181be3 --- /dev/null +++ b/vlib/v/tests/enums/enum_with_comptime_if_expr_test.v @@ -0,0 +1,11 @@ +const expected_foo_value = $if macos { 1 } $else { 0 } + +enum Foo { + foo = $if macos { 1 } $else { 0 } + bar +} + +fn test_enum_values_from_comptime_if_expr() { + assert int(Foo.foo) == expected_foo_value + assert int(Foo.bar) == expected_foo_value + 1 +} -- 2.39.5