From 59ec186b32b41abba9bae5e73b6897465d79d3c2 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Thu, 12 Feb 2026 22:13:56 +0200 Subject: [PATCH] checker: add warning for `fn f(x u8) {} f(999)` (fix #26584) (fix #26585) (#26586) --- vlib/gg/color.v | 4 +- vlib/v/checker/check_types.v | 68 ++++ vlib/v/checker/struct.v | 2 + ...iteral_overflows_known_type_range_warn.out | 313 ++++++++++++++++++ ...literal_overflows_known_type_range_warn.vv | 98 ++++++ .../struct_field_unsign_type_check_err.out | 7 + vlib/v/gen/native/amd64.v | 12 +- vlib/v/gen/native/arm64.v | 10 +- vlib/v/gen/native/macho.v | 10 +- 9 files changed, 506 insertions(+), 18 deletions(-) create mode 100644 vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.out create mode 100644 vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv diff --git a/vlib/gg/color.v b/vlib/gg/color.v index 7712d575e..b2fbf7e0f 100644 --- a/vlib/gg/color.v +++ b/vlib/gg/color.v @@ -122,7 +122,7 @@ pub mut: } // hex takes in a 32 bit integer and splits it into 4 byte values -pub fn hex(color i32) Color { +pub fn hex(color u32) Color { return Color{ r: u8((color >> 16) & 0xFF) g: u8((color >> 8) & 0xFF) @@ -318,7 +318,7 @@ const string_colors = { pub fn color_from_string(s string) Color { if s.starts_with('#') { mut hex_str := '0x' + s[1..] - return hex(hex_str.i32()) + return hex(hex_str.u32()) } else { return string_colors[s] } diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index 20f822b7a..178ddfba2 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -302,6 +302,7 @@ fn (mut c Checker) check_expected_call_arg(got_ ast.Type, expected_ ast.Type, la expected_typ_str := c.table.type_to_str(expected.clear_flag(.variadic)) return error('cannot use literal signed integer as `${expected_typ_str}`') } + c.warn_if_integer_literal_overflow_for_known_type(expected, arg.expr, arg.pos) idx_got := got.idx() idx_expected := expected.idx() @@ -383,6 +384,73 @@ fn (mut c Checker) check_expected_call_arg(got_ ast.Type, expected_ ast.Type, la } } +fn (mut c Checker) warn_if_integer_literal_overflow_for_known_type(expected ast.Type, expr ast.Expr, pos token.Pos) { + if !expected.is_int() { + return + } + if expr !is ast.IntegerLiteral { + return + } + int_lit := expr as ast.IntegerLiteral + mut lit := int_lit.val.replace('_', '') + if lit.len == 0 { + return + } + is_negative := lit.starts_with('-') + if is_negative || lit.starts_with('+') { + lit = lit[1..] + } + if lit.len == 0 { + return + } + literal_value := lit.u64() + bits, _ := c.table.type_size(expected.idx_type()) + bit_size := bits * 8 + if bit_size == 0 { + return + } + mut outside_type_range := false + if expected.is_signed() { + max_signed_i64 := if bit_size >= 64 { + max_i64 + } else { + i64((u64(1) << (bit_size - 1)) - 1) + } + min_signed := if bit_size >= 64 { + min_i64 + } else { + -max_signed_i64 - 1 + } + max_signed := u64(max_signed_i64) + if is_negative { + min_negative_abs := if min_signed == min_i64 { + u64(1) << 63 + } else { + u64(-min_signed) + } + outside_type_range = literal_value > min_negative_abs + } else { + outside_type_range = literal_value > max_signed + } + } else { + if is_negative { + outside_type_range = true + } else { + max_unsigned := if bit_size >= 64 { + max_u64 + } else { + (u64(1) << bit_size) - 1 + } + outside_type_range = literal_value > max_unsigned + } + } + if outside_type_range { + expected_type_str := c.table.type_to_str(expected.clear_flag(.variadic)) + c.warn('value `${int_lit.val}` is outside the range of `${expected_type_str}` in argument, this will be considered hard error soon', + pos) + } +} + fn (c &Checker) get_string_names_of(got ast.Type, expected ast.Type) (string, string) { got_typ_str := c.table.type_to_str(got.clear_flag(.variadic)) expected_typ_str := c.table.type_to_str(expected.clear_flag(.variadic)) diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index 54cdc52cb..01ec407e5 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -782,6 +782,8 @@ fn (mut c Checker) struct_init(mut node ast.StructInit, is_field_zero_struct_ini if exp_type_is_option && got_type.is_ptr() && !exp_type.is_ptr() { c.error('cannot assign a pointer to option struct field', init_field.pos) } + c.warn_if_integer_literal_overflow_for_known_type(exp_type, init_field.expr, + init_field.pos) if exp_type_sym.kind == .voidptr { if got_type_sym.kind == .struct && !got_type.is_ptr() { c.error('allocate `${got_type_sym.name}` on the heap for use in other functions', diff --git a/vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.out b/vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.out new file mode 100644 index 000000000..5d3733853 --- /dev/null +++ b/vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.out @@ -0,0 +1,313 @@ +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:54:7: warning: value `256` is outside the range of `u8` in argument, this will be considered hard error soon + 52 | + 53 | fn main() { + 54 | f_u8(256) + | ~~~ + 55 | f_i8(128) + 56 | f_i8(-129) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:55:7: warning: value `128` is outside the range of `i8` in argument, this will be considered hard error soon + 53 | fn main() { + 54 | f_u8(256) + 55 | f_i8(128) + | ~~~ + 56 | f_i8(-129) + 57 | f_u16(65536) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:56:7: warning: value `-129` is outside the range of `i8` in argument, this will be considered hard error soon + 54 | f_u8(256) + 55 | f_i8(128) + 56 | f_i8(-129) + | ~~~~ + 57 | f_u16(65536) + 58 | f_i16(32768) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:57:8: warning: value `65536` is outside the range of `u16` in argument, this will be considered hard error soon + 55 | f_i8(128) + 56 | f_i8(-129) + 57 | f_u16(65536) + | ~~~~~ + 58 | f_i16(32768) + 59 | f_i16(-32769) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:58:8: warning: value `32768` is outside the range of `i16` in argument, this will be considered hard error soon + 56 | f_i8(-129) + 57 | f_u16(65536) + 58 | f_i16(32768) + | ~~~~~ + 59 | f_i16(-32769) + 60 | f_u32(4294967296) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:59:8: warning: value `-32769` is outside the range of `i16` in argument, this will be considered hard error soon + 57 | f_u16(65536) + 58 | f_i16(32768) + 59 | f_i16(-32769) + | ~~~~~~ + 60 | f_u32(4294967296) + 61 | f_i32(2147483648) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:60:8: warning: value `4294967296` is outside the range of `u32` in argument, this will be considered hard error soon + 58 | f_i16(32768) + 59 | f_i16(-32769) + 60 | f_u32(4294967296) + | ~~~~~~~~~~ + 61 | f_i32(2147483648) + 62 | f_i32(-2147483649) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:61:8: warning: value `2147483648` is outside the range of `i32` in argument, this will be considered hard error soon + 59 | f_i16(-32769) + 60 | f_u32(4294967296) + 61 | f_i32(2147483648) + | ~~~~~~~~~~ + 62 | f_i32(-2147483649) + 63 | f_i64(9223372036854775808) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:62:8: warning: value `-2147483649` is outside the range of `i32` in argument, this will be considered hard error soon + 60 | f_u32(4294967296) + 61 | f_i32(2147483648) + 62 | f_i32(-2147483649) + | ~~~~~~~~~~~ + 63 | f_i64(9223372036854775808) + 64 | f_i64(-9223372036854775809) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:63:8: warning: value `9223372036854775808` is outside the range of `i64` in argument, this will be considered hard error soon + 61 | f_i32(2147483648) + 62 | f_i32(-2147483649) + 63 | f_i64(9223372036854775808) + | ~~~~~~~~~~~~~~~~~~~ + 64 | f_i64(-9223372036854775809) + 65 | f_isize(9223372036854775808) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:64:8: warning: value `-9223372036854775809` is outside the range of `i64` in argument, this will be considered hard error soon + 62 | f_i32(-2147483649) + 63 | f_i64(9223372036854775808) + 64 | f_i64(-9223372036854775809) + | ~~~~~~~~~~~~~~~~~~~~ + 65 | f_isize(9223372036854775808) + 66 | f_isize(-9223372036854775809) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:65:10: warning: value `9223372036854775808` is outside the range of `isize` in argument, this will be considered hard error soon + 63 | f_i64(9223372036854775808) + 64 | f_i64(-9223372036854775809) + 65 | f_isize(9223372036854775808) + | ~~~~~~~~~~~~~~~~~~~ + 66 | f_isize(-9223372036854775809) + 67 | +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:66:10: warning: value `-9223372036854775809` is outside the range of `isize` in argument, this will be considered hard error soon + 64 | f_i64(-9223372036854775809) + 65 | f_isize(9223372036854775808) + 66 | f_isize(-9223372036854775809) + | ~~~~~~~~~~~~~~~~~~~~ + 67 | + 68 | _ := Sample{ +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:69:3: warning: value `32768` is outside the range of `i16` in argument, this will be considered hard error soon + 67 | + 68 | _ := Sample{ + 69 | i16_over_max: 32768 + | ~~~~~~~~~~~~~~~~~~~~~~ + 70 | i16_under_min: -32769 + 71 | i32_over_max: 2147483648 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:70:3: warning: value `-32769` is outside the range of `i16` in argument, this will be considered hard error soon + 68 | _ := Sample{ + 69 | i16_over_max: 32768 + 70 | i16_under_min: -32769 + | ~~~~~~~~~~~~~~~~~~~~~~~ + 71 | i32_over_max: 2147483648 + 72 | i32_under_min: -2147483649 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:71:3: warning: value `2147483648` is outside the range of `i32` in argument, this will be considered hard error soon + 69 | i16_over_max: 32768 + 70 | i16_under_min: -32769 + 71 | i32_over_max: 2147483648 + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 72 | i32_under_min: -2147483649 + 73 | i64_over_max: 9223372036854775808 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:72:3: warning: value `-2147483649` is outside the range of `i32` in argument, this will be considered hard error soon + 70 | i16_under_min: -32769 + 71 | i32_over_max: 2147483648 + 72 | i32_under_min: -2147483649 + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 73 | i64_over_max: 9223372036854775808 + 74 | i64_under_min: -9223372036854775809 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:73:3: warning: value `9223372036854775808` is outside the range of `i64` in argument, this will be considered hard error soon + 71 | i32_over_max: 2147483648 + 72 | i32_under_min: -2147483649 + 73 | i64_over_max: 9223372036854775808 + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 74 | i64_under_min: -9223372036854775809 + 75 | i8_over_max: 128 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:74:3: warning: value `-9223372036854775809` is outside the range of `i64` in argument, this will be considered hard error soon + 72 | i32_under_min: -2147483649 + 73 | i64_over_max: 9223372036854775808 + 74 | i64_under_min: -9223372036854775809 + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 75 | i8_over_max: 128 + 76 | i8_under_min: -129 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:75:3: warning: value `128` is outside the range of `i8` in argument, this will be considered hard error soon + 73 | i64_over_max: 9223372036854775808 + 74 | i64_under_min: -9223372036854775809 + 75 | i8_over_max: 128 + | ~~~~~~~~~~~~~~~~~~~~ + 76 | i8_under_min: -129 + 77 | isize_over_max: 9223372036854775808 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:76:3: warning: value `-129` is outside the range of `i8` in argument, this will be considered hard error soon + 74 | i64_under_min: -9223372036854775809 + 75 | i8_over_max: 128 + 76 | i8_under_min: -129 + | ~~~~~~~~~~~~~~~~~~~~~ + 77 | isize_over_max: 9223372036854775808 + 78 | isize_under_min: -9223372036854775809 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:77:3: warning: value `9223372036854775808` is outside the range of `isize` in argument, this will be considered hard error soon + 75 | i8_over_max: 128 + 76 | i8_under_min: -129 + 77 | isize_over_max: 9223372036854775808 + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 78 | isize_under_min: -9223372036854775809 + 79 | u16_over_max: 65536 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:78:3: warning: value `-9223372036854775809` is outside the range of `isize` in argument, this will be considered hard error soon + 76 | i8_under_min: -129 + 77 | isize_over_max: 9223372036854775808 + 78 | isize_under_min: -9223372036854775809 + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 79 | u16_over_max: 65536 + 80 | u32_over_max: 4294967296 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:79:3: warning: value `65536` is outside the range of `u16` in argument, this will be considered hard error soon + 77 | isize_over_max: 9223372036854775808 + 78 | isize_under_min: -9223372036854775809 + 79 | u16_over_max: 65536 + | ~~~~~~~~~~~~~~~~~~~~~~ + 80 | u32_over_max: 4294967296 + 81 | u8_over_max: 256 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:80:3: warning: value `4294967296` is outside the range of `u32` in argument, this will be considered hard error soon + 78 | isize_under_min: -9223372036854775809 + 79 | u16_over_max: 65536 + 80 | u32_over_max: 4294967296 + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 81 | u8_over_max: 256 + 82 | } +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:81:3: warning: value `256` is outside the range of `u8` in argument, this will be considered hard error soon + 79 | u16_over_max: 65536 + 80 | u32_over_max: 4294967296 + 81 | u8_over_max: 256 + | ~~~~~~~~~~~~~~~~~~~~ + 82 | } + 83 | +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:84:25: warning: value `256` is outside the range of `u8` in argument, this will be considered hard error soon + 82 | } + 83 | + 84 | _ := GenericSample[u8]{256} + | ~~~ + 85 | _ := GenericSample[u16]{65536} + 86 | _ := GenericSample[u32]{4294967296} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:85:26: warning: value `65536` is outside the range of `u16` in argument, this will be considered hard error soon + 83 | + 84 | _ := GenericSample[u8]{256} + 85 | _ := GenericSample[u16]{65536} + | ~~~~~ + 86 | _ := GenericSample[u32]{4294967296} + 87 | +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:86:26: warning: value `4294967296` is outside the range of `u32` in argument, this will be considered hard error soon + 84 | _ := GenericSample[u8]{256} + 85 | _ := GenericSample[u16]{65536} + 86 | _ := GenericSample[u32]{4294967296} + | ~~~~~~~~~~ + 87 | + 88 | _ := GenericSample[i8]{128} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:88:25: warning: value `128` is outside the range of `i8` in argument, this will be considered hard error soon + 86 | _ := GenericSample[u32]{4294967296} + 87 | + 88 | _ := GenericSample[i8]{128} + | ~~~ + 89 | _ := GenericSample[i8]{-129} + 90 | _ := GenericSample[i16]{32768} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:89:25: warning: value `-129` is outside the range of `i8` in argument, this will be considered hard error soon + 87 | + 88 | _ := GenericSample[i8]{128} + 89 | _ := GenericSample[i8]{-129} + | ~~~~ + 90 | _ := GenericSample[i16]{32768} + 91 | _ := GenericSample[i16]{-32769} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:90:26: warning: value `32768` is outside the range of `i16` in argument, this will be considered hard error soon + 88 | _ := GenericSample[i8]{128} + 89 | _ := GenericSample[i8]{-129} + 90 | _ := GenericSample[i16]{32768} + | ~~~~~ + 91 | _ := GenericSample[i16]{-32769} + 92 | _ := GenericSample[i32]{2147483648} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:91:26: warning: value `-32769` is outside the range of `i16` in argument, this will be considered hard error soon + 89 | _ := GenericSample[i8]{-129} + 90 | _ := GenericSample[i16]{32768} + 91 | _ := GenericSample[i16]{-32769} + | ~~~~~~ + 92 | _ := GenericSample[i32]{2147483648} + 93 | _ := GenericSample[i32]{-2147483649} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:92:26: warning: value `2147483648` is outside the range of `i32` in argument, this will be considered hard error soon + 90 | _ := GenericSample[i16]{32768} + 91 | _ := GenericSample[i16]{-32769} + 92 | _ := GenericSample[i32]{2147483648} + | ~~~~~~~~~~ + 93 | _ := GenericSample[i32]{-2147483649} + 94 | _ := GenericSample[i64]{9223372036854775808} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:93:26: warning: value `-2147483649` is outside the range of `i32` in argument, this will be considered hard error soon + 91 | _ := GenericSample[i16]{-32769} + 92 | _ := GenericSample[i32]{2147483648} + 93 | _ := GenericSample[i32]{-2147483649} + | ~~~~~~~~~~~ + 94 | _ := GenericSample[i64]{9223372036854775808} + 95 | _ := GenericSample[i64]{-9223372036854775809} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:94:26: warning: value `9223372036854775808` is outside the range of `i64` in argument, this will be considered hard error soon + 92 | _ := GenericSample[i32]{2147483648} + 93 | _ := GenericSample[i32]{-2147483649} + 94 | _ := GenericSample[i64]{9223372036854775808} + | ~~~~~~~~~~~~~~~~~~~ + 95 | _ := GenericSample[i64]{-9223372036854775809} + 96 | _ := GenericSample[isize]{9223372036854775808} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:95:26: warning: value `-9223372036854775809` is outside the range of `i64` in argument, this will be considered hard error soon + 93 | _ := GenericSample[i32]{-2147483649} + 94 | _ := GenericSample[i64]{9223372036854775808} + 95 | _ := GenericSample[i64]{-9223372036854775809} + | ~~~~~~~~~~~~~~~~~~~~ + 96 | _ := GenericSample[isize]{9223372036854775808} + 97 | _ := GenericSample[isize]{-9223372036854775809} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:96:28: warning: value `9223372036854775808` is outside the range of `isize` in argument, this will be considered hard error soon + 94 | _ := GenericSample[i64]{9223372036854775808} + 95 | _ := GenericSample[i64]{-9223372036854775809} + 96 | _ := GenericSample[isize]{9223372036854775808} + | ~~~~~~~~~~~~~~~~~~~ + 97 | _ := GenericSample[isize]{-9223372036854775809} + 98 | } +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:97:28: warning: value `-9223372036854775809` is outside the range of `isize` in argument, this will be considered hard error soon + 95 | _ := GenericSample[i64]{-9223372036854775809} + 96 | _ := GenericSample[isize]{9223372036854775808} + 97 | _ := GenericSample[isize]{-9223372036854775809} + | ~~~~~~~~~~~~~~~~~~~~ + 98 | } +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:64:8: error: integer literal -9223372036854775809 overflows int + 62 | f_i32(-2147483649) + 63 | f_i64(9223372036854775808) + 64 | f_i64(-9223372036854775809) + | ~~~~~~~~~~~~~~~~~~~~ + 65 | f_isize(9223372036854775808) + 66 | f_isize(-9223372036854775809) +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:66:10: error: integer literal -9223372036854775809 overflows int + 64 | f_i64(-9223372036854775809) + 65 | f_isize(9223372036854775808) + 66 | f_isize(-9223372036854775809) + | ~~~~~~~~~~~~~~~~~~~~ + 67 | + 68 | _ := Sample{ +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:74:20: error: integer literal -9223372036854775809 overflows int + 72 | i32_under_min: -2147483649 + 73 | i64_over_max: 9223372036854775808 + 74 | i64_under_min: -9223372036854775809 + | ~~~~~~~~~~~~~~~~~~~~ + 75 | i8_over_max: 128 + 76 | i8_under_min: -129 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:78:20: error: integer literal -9223372036854775809 overflows int + 76 | i8_under_min: -129 + 77 | isize_over_max: 9223372036854775808 + 78 | isize_under_min: -9223372036854775809 + | ~~~~~~~~~~~~~~~~~~~~ + 79 | u16_over_max: 65536 + 80 | u32_over_max: 4294967296 +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:95:26: error: integer literal -9223372036854775809 overflows int + 93 | _ := GenericSample[i32]{-2147483649} + 94 | _ := GenericSample[i64]{9223372036854775808} + 95 | _ := GenericSample[i64]{-9223372036854775809} + | ~~~~~~~~~~~~~~~~~~~~ + 96 | _ := GenericSample[isize]{9223372036854775808} + 97 | _ := GenericSample[isize]{-9223372036854775809} +vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv:97:28: error: integer literal -9223372036854775809 overflows int + 95 | _ := GenericSample[i64]{-9223372036854775809} + 96 | _ := GenericSample[isize]{9223372036854775808} + 97 | _ := GenericSample[isize]{-9223372036854775809} + | ~~~~~~~~~~~~~~~~~~~~ + 98 | } diff --git a/vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv b/vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv new file mode 100644 index 000000000..1b8e1b900 --- /dev/null +++ b/vlib/v/checker/tests/number_literal_overflows_known_type_range_warn.vv @@ -0,0 +1,98 @@ +fn f_u8(a u8) { + _ = a +} + +fn f_i8(a i8) { + _ = a +} + +fn f_u16(a u16) { + _ = a +} + +fn f_i16(a i16) { + _ = a +} + +fn f_u32(a u32) { + _ = a +} + +fn f_i32(a i32) { + _ = a +} + +fn f_i64(a i64) { + _ = a +} + +fn f_isize(a isize) { + _ = a +} + +struct Sample { + i16_over_max i16 + i16_under_min i16 + i32_over_max i32 + i32_under_min i32 + i64_over_max i64 + i64_under_min i64 + i8_over_max i8 + i8_under_min i8 + isize_over_max isize + isize_under_min isize + u16_over_max u16 + u32_over_max u32 + u8_over_max u8 +} + +struct GenericSample[T] { + field T +} + +fn main() { + f_u8(256) + f_i8(128) + f_i8(-129) + f_u16(65536) + f_i16(32768) + f_i16(-32769) + f_u32(4294967296) + f_i32(2147483648) + f_i32(-2147483649) + f_i64(9223372036854775808) + f_i64(-9223372036854775809) + f_isize(9223372036854775808) + f_isize(-9223372036854775809) + + _ := Sample{ + i16_over_max: 32768 + i16_under_min: -32769 + i32_over_max: 2147483648 + i32_under_min: -2147483649 + i64_over_max: 9223372036854775808 + i64_under_min: -9223372036854775809 + i8_over_max: 128 + i8_under_min: -129 + isize_over_max: 9223372036854775808 + isize_under_min: -9223372036854775809 + u16_over_max: 65536 + u32_over_max: 4294967296 + u8_over_max: 256 + } + + _ := GenericSample[u8]{256} + _ := GenericSample[u16]{65536} + _ := GenericSample[u32]{4294967296} + + _ := GenericSample[i8]{128} + _ := GenericSample[i8]{-129} + _ := GenericSample[i16]{32768} + _ := GenericSample[i16]{-32769} + _ := GenericSample[i32]{2147483648} + _ := GenericSample[i32]{-2147483649} + _ := GenericSample[i64]{9223372036854775808} + _ := GenericSample[i64]{-9223372036854775809} + _ := GenericSample[isize]{9223372036854775808} + _ := GenericSample[isize]{-9223372036854775809} +} diff --git a/vlib/v/checker/tests/struct_field_unsign_type_check_err.out b/vlib/v/checker/tests/struct_field_unsign_type_check_err.out index e38ae5c59..b97e44150 100644 --- a/vlib/v/checker/tests/struct_field_unsign_type_check_err.out +++ b/vlib/v/checker/tests/struct_field_unsign_type_check_err.out @@ -1,3 +1,10 @@ +vlib/v/checker/tests/struct_field_unsign_type_check_err.vv:8:3: warning: value `-1` is outside the range of `u32` in argument, this will be considered hard error soon + 6 | fn main() { + 7 | mut foo := Foo{ + 8 | n: -1 + | ~~~~~ + 9 | } + 10 | vlib/v/checker/tests/struct_field_unsign_type_check_err.vv:3:10: error: cannot assign negative value to unsigned integer type 1 | struct Foo { 2 | mut: diff --git a/vlib/v/gen/native/amd64.v b/vlib/v/gen/native/amd64.v index 7cd763709..24577893a 100644 --- a/vlib/v/gen/native/amd64.v +++ b/vlib/v/gen/native/amd64.v @@ -2191,7 +2191,7 @@ pub fn (mut c Amd64) cg_call_fn(node ast.CallExpr) { if is_floats[i] { if args_size[i] == 8 && node.expected_arg_types[int(i) + args_offset] == ast.f32_type_idx { - c.g.write32(0xc05a0ff2) + c.g.write32(i32(0xc05a0ff2)) c.g.println('cvtsd2ss xmm0, xmm0') } c.push_sse(.xmm0) @@ -3000,7 +3000,7 @@ fn (mut c Amd64) cg_return_stmt(node ast.Return) { typ := if node.types.len > 1 { c.g.return_type } else { node.types[0] } if typ == ast.float_literal_type_idx && c.g.return_type == ast.f32_type_idx { if c.g.pref.arch == .amd64 { - c.g.write32(0xc05a0ff2) + c.g.write32(i32(0xc05a0ff2)) c.g.println('cvtsd2ss xmm0, xmm0') } } @@ -3485,7 +3485,7 @@ fn (mut c Amd64) fp_infix_expr(node ast.InfixExpr, left_type ast.Type) { } match node.op { .eq, .ne { - c.g.write32(0xc1c20ff3) + c.g.write32(i32(0xc1c20ff3)) c.g.write8(if node.op == .eq { i32(0x00) } else { i32(0x04) }) inst := if node.op == .eq { 'cmpeqss' } else { 'cmpneqss' } c.g.println('${inst} xmm0, xmm1') @@ -3712,7 +3712,7 @@ fn (mut c Amd64) cg_infix_expr(node ast.InfixExpr) { c.sub_reg(.rax, .rdx) } .mul { - c.g.write32(0xc2af0f48) + c.g.write32(i32(0xc2af0f48)) c.g.println('imul .rax, .rdx') } .div { @@ -4871,11 +4871,11 @@ fn (mut c Amd64) cg_gen_cast_expr(expr ast.CastExpr) { from_size := c.g.get_type_size(expr.expr_type) to_size := c.g.get_type_size(expr.typ) if from_size == 4 && to_size == 8 { - c.g.write32(0xc05a0ff3) + c.g.write32(i32(0xc05a0ff3)) c.g.println('cvtss2sd xmm0, xmm0') } if from_size == 8 && to_size == 4 { - c.g.write32(0xc05a0ff2) + c.g.write32(i32(0xc05a0ff2)) c.g.println('cvtsd2ss xmm0, xmm0') } } else if expr.typ.is_pure_float() { diff --git a/vlib/v/gen/native/arm64.v b/vlib/v/gen/native/arm64.v index a2d7ea494..6579693e2 100644 --- a/vlib/v/gen/native/arm64.v +++ b/vlib/v/gen/native/arm64.v @@ -277,16 +277,16 @@ fn (mut c Arm64) adr(r Arm64Register, delta i32) { fn (mut c Arm64) bl() { // g.write32(0xa9400000) - c.g.write32(0x94000000) + c.g.write32(i32(0x94000000)) c.g.println('bl 0') } fn (mut c Arm64) svc() { if c.g.pref.os == .linux { - c.g.write32(0xd4001001) + c.g.write32(i32(0xd4001001)) c.g.println('svc 0x80') } else { - c.g.write32(0xd4000001) + c.g.write32(i32(0xd4000001)) c.g.println('svc 0') } } @@ -388,7 +388,7 @@ fn (mut c Arm64) cg_convert_rune_to_string(r Register, buffer i32, var Var, conf } fn (mut c Arm64) cg_trap() { - c.g.write32(0xcccccccc) + c.g.write32(i32(0xcccccccc)) c.g.println('trap') } @@ -397,7 +397,7 @@ fn (mut c Arm64) cg_leave() { } fn (mut c Arm64) cg_ret() { - c.g.write32(0xd65f03c0) + c.g.write32(i32(0xd65f03c0)) c.g.println('ret') } diff --git a/vlib/v/gen/native/macho.v b/vlib/v/gen/native/macho.v index 48a1ff2af..6a65f95e0 100644 --- a/vlib/v/gen/native/macho.v +++ b/vlib/v/gen/native/macho.v @@ -104,13 +104,13 @@ fn (mut g Gen) macho_segment64_linkedit() { } fn (mut g Gen) macho_header(ncmds i32, bintype i32) i32 { - g.write32(0xfeedfacf) // MH_MAGIC_64 + g.write32(i32(0xfeedfacf)) // MH_MAGIC_64 if g.pref.arch == .arm64 { g.write32(0x0100000c) // CPU_TYPE_ARM64 g.write32(0x00000000) // CPU_SUBTYPE_ARM64_ALL } else { g.write32(0x01000007) // CPU_TYPE_X64 - g.write32(0x80000003) // CPU_SUBTYPE_X64 + g.write32(i32(0x80000003)) // CPU_SUBTYPE_X64 } g.write32(mh_execute) // filetype g.write32(ncmds) // ncmds @@ -163,7 +163,7 @@ fn (mut g Gen) macho_segment64_text() []i32 { if g.pref.arch == .amd64 { g.write32(0) // flags } else { - g.write32(0x80000400) // flags + g.write32(i32(0x80000400)) // flags } g.write32(0) @@ -273,11 +273,11 @@ fn (mut g Gen) write_nulls(len i32) { pub fn (mut g Gen) generate_macho_object_header() { if g.pref.arch == .arm64 { - g.write32(0xfeedfacf) // MH_MAGIC_64 + g.write32(i32(0xfeedfacf)) // MH_MAGIC_64 g.write32(0x0100000c) // CPU_TYPE_ARM64 g.write32(0) // CPU_SUBTYPE_ARM64_ALL } else { - g.write32(0xfeedfacf) // MH_MAGIC_64 + g.write32(i32(0xfeedfacf)) // MH_MAGIC_64 g.write32(0x01000007) // CPU_TYPE_X64 g.write32(3) // CPU_SUBTYPE_X64 } -- 2.39.5