From 28fd783693feef22bb48cf5b04deaefdd3c1d863 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 21 Apr 2026 15:12:57 +0300 Subject: [PATCH] checker: fix int values incorrectly promoted to f32 (fixes #7692) --- vlib/v/checker/assign.v | 13 +++++++++++++ vlib/v/checker/tests/assign_int_to_f32_err.out | 6 ++++++ vlib/v/checker/tests/assign_int_to_f32_err.vv | 6 ++++++ 3 files changed, 25 insertions(+) create mode 100644 vlib/v/checker/tests/assign_int_to_f32_err.out create mode 100644 vlib/v/checker/tests/assign_int_to_f32_err.vv diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index 786dbe75c..4f43da831 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -120,6 +120,14 @@ fn (mut c Checker) update_option_assignment_smartcast(mut expr ast.Expr, left_ty } } +@[inline] +fn (c &Checker) disallow_implicit_int_to_f32_assign(got ast.Type, expected ast.Type) bool { + got_type := c.table.unalias_num_type(got).clear_flags() + expected_type := c.table.unalias_num_type(expected).clear_flags() + return expected_type == ast.f32_type + && got_type in [ast.i32_type, ast.int_type, ast.i64_type, ast.isize_type, ast.u32_type, ast.u64_type, ast.usize_type] +} + // TODO: 980 line function fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { prev_inside_assign := c.inside_assign @@ -1132,6 +1140,11 @@ or use an explicit `unsafe{ a[..] }`, if you do not want a copy of the slice.', } else { right_type_unwrapped } + if original_op == .assign + && c.disallow_implicit_int_to_f32_assign(assign_right_type, left_type_unwrapped) { + c.error('cannot assign to `${left}`: ${c.expected_msg(assign_right_type, + left_type_unwrapped)}', right_pos) + } c.check_expected(assign_right_type, left_type_unwrapped) or { if left.is_auto_deref_arg() && left_type.is_ptr() { left_deref := left_type.deref() diff --git a/vlib/v/checker/tests/assign_int_to_f32_err.out b/vlib/v/checker/tests/assign_int_to_f32_err.out new file mode 100644 index 000000000..9c6ca7d7f --- /dev/null +++ b/vlib/v/checker/tests/assign_int_to_f32_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/assign_int_to_f32_err.vv:5:16: error: cannot assign to `my_float_32`: expected `f32`, not `int` + 3 | _ = my_float_32 + 4 | my_int := int(2147483583) + 5 | my_float_32 = my_int + | ~~~~~~ + 6 | } diff --git a/vlib/v/checker/tests/assign_int_to_f32_err.vv b/vlib/v/checker/tests/assign_int_to_f32_err.vv new file mode 100644 index 000000000..11262ccbf --- /dev/null +++ b/vlib/v/checker/tests/assign_int_to_f32_err.vv @@ -0,0 +1,6 @@ +fn main() { + mut my_float_32 := f32(3.2) + _ = my_float_32 + my_int := int(2147483583) + my_float_32 = my_int +} -- 2.39.5