From: Mark Thom Date: Tue, 19 May 2020 16:45:54 +0000 (-0600) Subject: correct fixnum overflow on negation (#528) X-Git-Tag: v0.8.123~14 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=2eac902c33832c8888ffd52f36d3fccf04cc6c49;p=scryer-prolog.git correct fixnum overflow on negation (#528) --- diff --git a/src/prolog/arithmetic.rs b/src/prolog/arithmetic.rs index 87df3dbd..e889b019 100644 --- a/src/prolog/arithmetic.rs +++ b/src/prolog/arithmetic.rs @@ -474,7 +474,12 @@ impl Neg for Number { fn neg(self) -> Self::Output { match self { - Number::Fixnum(n) => Number::Fixnum(-n), + Number::Fixnum(n) => + if let Some(n) = n.checked_neg() { + Number::Fixnum(n) + } else { + Number::from(-Integer::from(n)) + } Number::Integer(n) => Number::Integer(Rc::new(-Integer::from(&*n))), Number::Float(OrderedFloat(f)) => Number::Float(OrderedFloat(-f)), Number::Rational(r) => Number::Rational(Rc::new(-Rational::from(&*r))),