From a4a1ff2b6db96bb3ea496cd85b1ceb5b3653e8dd Mon Sep 17 00:00:00 2001 From: krishvishal Date: Wed, 29 Jan 2025 15:13:57 +0530 Subject: [PATCH] Handle special case -9223372036854775808 and prevent conversion to Real --- core/translate/expr.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/core/translate/expr.rs b/core/translate/expr.rs index 9fdf5f9c2..553fe9e03 100644 --- a/core/translate/expr.rs +++ b/core/translate/expr.rs @@ -1768,22 +1768,33 @@ pub fn translate_expr( UnaryOperator::Negative | UnaryOperator::Positive, ast::Expr::Literal(ast::Literal::Numeric(numeric_value)), ) => { - let maybe_int = numeric_value.parse::(); let multiplier = if let UnaryOperator::Negative = op { -1 } else { 1 }; - if let Ok(value) = maybe_int { + + // Special case: if we're negating "9223372036854775808", this is exactly MIN_INT64 + // If we don't do this -1 * 9223372036854775808 will overflow and parse will fail and trigger conversion to Real. + if multiplier == -1 && numeric_value == "9223372036854775808" { program.emit_insn(Insn::Integer { - value: value * multiplier, + value: i64::MIN, dest: target_register, }); } else { - program.emit_insn(Insn::Real { - value: multiplier as f64 * numeric_value.parse::()?, - dest: target_register, - }); + let maybe_int = numeric_value.parse::(); + if let Ok(value) = maybe_int { + program.emit_insn(Insn::Integer { + value: value * multiplier, + dest: target_register, + }); + } else { + let value = numeric_value.parse::()?; + program.emit_insn(Insn::Real { + value: value * multiplier as f64, + dest: target_register, + }); + } } Ok(target_register) }