From 44b23802911814737773f4ed21dabddca515afa5 Mon Sep 17 00:00:00 2001 From: panne Date: Mon, 5 Jun 2000 20:57:58 +0000 Subject: [PATCH] [project @ 2000-06-05 20:57:58 by panne] The n-th attempt to get GCD right, this time negative Int arguments in combination with zero. Another bug in this area and I'll leap out of the window immediately... :-P --- ghc/lib/std/PrelBase.lhs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ghc/lib/std/PrelBase.lhs b/ghc/lib/std/PrelBase.lhs index e87bfb9..7f2a8a9 100644 --- a/ghc/lib/std/PrelBase.lhs +++ b/ghc/lib/std/PrelBase.lhs @@ -575,11 +575,16 @@ timesInt(I# x) (I# y) = I# (x *# y) quotInt (I# x) (I# y) = I# (quotInt# x y) remInt (I# x) (I# y) = I# (remInt# x y) -gcdInt (I# 0#) (I# 0#) = error "PrelBase.gcdInt: gcd 0 0 is undefined" -gcdInt a (I# 0#) = a -gcdInt (I# 0#) b = b -gcdInt (I# a) (I# b) = I# (gcdInt# (absInt a) (absInt b)) - where absInt x = if x <# 0# then negateInt# x else x +gcdInt (I# a) (I# b) = g a b + where g 0# 0# = error "PrelBase.gcdInt: gcd 0 0 is undefined" + g 0# _ = I# absB + g _ 0# = I# absA + g _ _ = I# (gcdInt# absA absB) + + absInt x = if x <# 0# then negateInt# x else x + + absA = absInt a + absB = absInt b negateInt :: Int -> Int negateInt (I# x) = I# (negateInt# x) -- 1.7.10.4