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)