From 416b37bcb3d208d05f79a2a97bb0532be5a13a3e Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Thu, 23 May 2024 17:40:02 +0300 Subject: [PATCH] checker: fix `v -W vlib/v/tests/enum_bitfield_64bit_test.v` too --- vlib/v/checker/checker.v | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 8921ed711a..bc82b9469d 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3416,9 +3416,14 @@ fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type { if enum_decl := c.table.enum_decls[to_sym.name] { mut in_range := false if enum_decl.is_flag { - // if a flag enum has 4 variants, the maximum possible value would have all 4 flags set (0b1111) - max_val := (u64(1) << enum_decl.fields.len) - 1 - in_range = node_val >= 0 && u64(node_val) <= max_val + if enum_decl.fields.len == 64 { + // for 64 fields, just use max_u64 and avoid UB: + in_range = node_val >= 0 && u64(node_val) <= max_u64 + } else { + // if a flag enum has 4 variants, the maximum possible value would have all 4 flags set (0b1111) + max_val := (u64(1) << enum_decl.fields.len) - 1 + in_range = node_val >= 0 && u64(node_val) <= max_val + } } else { mut enum_val := i64(0)