mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: fix external enum value resolution, i.e. enum { enum_value = C.VALUE }
(#18401)
This commit is contained in:
parent
275b8a1294
commit
2e9c469158
@ -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{}
|
||||
@ -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
|
||||
@ -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 {
|
||||
|
@ -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)
|
||||
|
@ -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 {}
|
||||
}
|
||||
|
10
vlib/v/tests/const_resolution_test.v
Normal file
10
vlib/v/tests/const_resolution_test.v
Normal file
@ -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'
|
||||
}
|
Loading…
Reference in New Issue
Block a user