diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index b5d843bce342a6..af949222df715b 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1470,6 +1470,7 @@ fn (mut c Checker) selector_expr(mut node ast.SelectorExpr) ast.Type { } else if c.inside_comptime_for_field && typ == c.enum_data_type && node.field_name == 'value' { // for comp-time enum.values node.expr_type = c.comptime_fields_type[c.comptime_for_field_var] + node.typ = typ return node.expr_type } node.expr_type = typ diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 275cb37d792790..bf1e2421c0f3d9 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -3635,7 +3635,6 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) { if node.expr_type == 0 { g.checker_bug('unexpected SelectorExpr.expr_type = 0', node.pos) } - sym := g.table.sym(g.unwrap_generic(node.expr_type)) field_name := if sym.language == .v { c_name(node.field_name) } else { node.field_name } @@ -3702,6 +3701,11 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) { g.expr(node.expr) g.write(')') return + } else if g.enum_data_type == node.typ { + g.expr(node.expr) + g.write('.') + g.write(node.field_name) + return } mut sum_type_deref_field := '' mut sum_type_dot := '.' diff --git a/vlib/v/tests/comptime_enum_values_test.v b/vlib/v/tests/comptime_enum_values_test.v new file mode 100644 index 00000000000000..912fee9e738756 --- /dev/null +++ b/vlib/v/tests/comptime_enum_values_test.v @@ -0,0 +1,35 @@ +enum CharacterGroup { + chars + alphanumerics + numeric + special +} + +fn (self CharacterGroup) value() string { + return match self { + .chars { 'first' } + .alphanumerics { 'second' } + .numeric { 'third' } + .special { 'fourth' } + } +} + +fn CharacterGroup.values() []CharacterGroup { + mut res := []CharacterGroup{} + $for item in CharacterGroup.values { + res << CharacterGroup(item.value) + } + return res +} + +fn test_main() { + values := CharacterGroup.values() + println('Char group values: ${values}') + println('For loop over the values') + for entry in CharacterGroup.values() { + println('Value: ${entry} ${entry.value()}') + } + + assert values == [CharacterGroup.chars, CharacterGroup.alphanumerics, CharacterGroup.numeric, + CharacterGroup.special] +}