mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: fix enum max value validation (#18446)
This commit is contained in:
parent
05f2798c88
commit
84cf448f2f
@ -1674,6 +1674,7 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) {
|
|||||||
mut overflows := false
|
mut overflows := false
|
||||||
mut uval := u64(0)
|
mut uval := u64(0)
|
||||||
mut ival := i64(0)
|
mut ival := i64(0)
|
||||||
|
|
||||||
if signed {
|
if signed {
|
||||||
val := field.expr.val.i64()
|
val := field.expr.val.i64()
|
||||||
ival = val
|
ival = val
|
||||||
@ -1686,9 +1687,22 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) {
|
|||||||
val := field.expr.val.u64()
|
val := field.expr.val.u64()
|
||||||
uval = val
|
uval = val
|
||||||
if val >= enum_umax {
|
if val >= enum_umax {
|
||||||
|
overflows = true
|
||||||
|
if val == enum_umax {
|
||||||
|
is_bin := field.expr.val.starts_with('0b')
|
||||||
|
is_oct := field.expr.val.starts_with('0o')
|
||||||
|
is_hex := field.expr.val.starts_with('0x')
|
||||||
|
|
||||||
|
if is_hex {
|
||||||
|
overflows = val.hex() != enum_umax.hex()
|
||||||
|
} else if !is_bin && !is_oct && !is_hex {
|
||||||
|
overflows = field.expr.val.str() != enum_umax.str()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if overflows {
|
||||||
c.error('enum value `${field.expr.val}` overflows the enum type `${senum_type}`, values of which have to be in [${enum_umin}, ${enum_umax}]',
|
c.error('enum value `${field.expr.val}` overflows the enum type `${senum_type}`, values of which have to be in [${enum_umin}, ${enum_umax}]',
|
||||||
field.expr.pos)
|
field.expr.pos)
|
||||||
overflows = true
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !overflows && !c.pref.translated && !c.file.is_translated
|
if !overflows && !c.pref.translated && !c.file.is_translated
|
||||||
|
27
vlib/v/tests/enum_max_test.v
Normal file
27
vlib/v/tests/enum_max_test.v
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
enum Nums as u8 {
|
||||||
|
one
|
||||||
|
two
|
||||||
|
three = 0xff
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Nums2 as u32 {
|
||||||
|
one
|
||||||
|
two
|
||||||
|
three = 0xFFFFFFFF
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Nums3 as u64 {
|
||||||
|
one
|
||||||
|
two
|
||||||
|
three = 0xFFFFFFFFFFFFFFFF
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_main() {
|
||||||
|
mut a := Nums.one
|
||||||
|
assert a == Nums.one
|
||||||
|
assert int(Nums.three) == 0xff
|
||||||
|
assert Nums.three == unsafe { Nums(255) }
|
||||||
|
|
||||||
|
assert u64(Nums2.three) == 0xFFFFFFFF
|
||||||
|
assert u64(Nums3.three) == 0xFFFFFFFFFFFFFFFF
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user