Skip to content

Commit

Permalink
checker: fix external enum value resolution, i.e. `enum { enum_value …
Browse files Browse the repository at this point in the history
…= C.VALUE }` (#18401)
  • Loading branch information
felipensp committed Jun 11, 2023
1 parent 275b8a1 commit 2e9c469
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 4 deletions.
8 changes: 6 additions & 2 deletions vlib/v/ast/table.v
Expand Up @@ -372,8 +372,9 @@ pub fn (t &Table) find_method_with_embeds(sym &TypeSymbol, method_name string) !
}
}

// find_enum_field_val finds the int value from the enum name and enum field
pub fn (t &Table) find_enum_field_val(name string, field_ string) i64 {
// find_enum_field_val finds the possible int value from the enum name and enum field
// (returns `none` if the value cannot be resolved at compile time)
pub fn (t &Table) find_enum_field_val(name string, field_ string) ?i64 {
mut val := i64(0)
enum_decl := t.enum_decls[name]
mut enum_vals := []i64{}
Expand All @@ -384,6 +385,7 @@ pub fn (t &Table) find_enum_field_val(name string, field_ string) i64 {
val = field.expr.val.i64()
break
}
return none
} else {
if enum_vals.len > 0 {
val = enum_vals.last() + 1
Expand All @@ -396,6 +398,8 @@ pub fn (t &Table) find_enum_field_val(name string, field_ string) i64 {
if field.has_expr {
if field.expr is IntegerLiteral {
enum_vals << field.expr.val.i64()
} else {
return none
}
} else {
if enum_vals.len > 0 {
Expand Down
4 changes: 3 additions & 1 deletion vlib/v/checker/comptime.v
Expand Up @@ -270,7 +270,9 @@ fn (mut c Checker) eval_comptime_const_expr(expr ast.Expr, nlevel int) ?ast.Comp
return c.eval_comptime_const_expr(expr.expr, nlevel + 1)
}
ast.EnumVal {
return c.table.find_enum_field_val(expr.enum_name, expr.val)
if val := c.table.find_enum_field_val(expr.enum_name, expr.val) {
return val
}
}
ast.SizeOf {
s, _ := c.table.type_size(expr.typ)
Expand Down
5 changes: 4 additions & 1 deletion vlib/v/checker/containers.v
Expand Up @@ -250,8 +250,11 @@ fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type {
fixed_size = init_expr.expr.val.int()
}
ast.EnumVal {
fixed_size = c.table.find_enum_field_val(init_expr.expr.enum_name,
if val := c.table.find_enum_field_val(init_expr.expr.enum_name,
init_expr.expr.val)
{
fixed_size = val
}
}
else {}
}
Expand Down
10 changes: 10 additions & 0 deletions vlib/v/tests/const_resolution_test.v
@@ -0,0 +1,10 @@
import gx

const left = gx.align_left

fn test_main() {
align := left
assert dump(align.str()) == 'left'
assert dump(gx.align_left) == gx.align_left
assert gx.align_left.str() == 'left'
}

0 comments on commit 2e9c469

Please sign in to comment.