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) }