diff --git a/ghc/lib/std/Ix.lhs b/ghc/lib/std/Ix.lhs index db17b458e352ef37fb3ee3e069bfb62d8dbc012a..545c266f43bf72db729fa79fed1f0ba49a8627ae 100644 --- a/ghc/lib/std/Ix.lhs +++ b/ghc/lib/std/Ix.lhs @@ -56,17 +56,21 @@ class ({-Show a,-} Ord a) => Ix a where \begin{code} instance Ix Char where - range (c,c') = [c..c'] + range (c,c') + | c <= c' = [c..c'] + | otherwise = [] index b@(c,_) ci | inRange b ci = fromEnum ci - fromEnum c | otherwise = indexError ci b "Char" inRange (m,n) i = m <= i && i <= n instance Ix Int where - range (m,n) = [m..n] + range (m,n) + | m <= n = [m..n] + | otherwise = [] index b@(m,_) i - | inRange b i = i - m - | otherwise = indexError i b "Int" + | inRange b i = i - m + | otherwise = indexError i b "Int" inRange (m,n) i = m <= i && i <= n -- abstract these errors from the relevant index functions so that @@ -84,13 +88,17 @@ indexError i rng tp ---------------------------------------------------------------------- instance Ix Bool where -- as derived - range (l,u) = map toEnum [fromEnum l .. fromEnum u] + range (l,u) + | l <= u = map toEnum [fromEnum l .. fromEnum u] + | otherwise = [] index (l,_) i = fromEnum i - fromEnum l inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u ---------------------------------------------------------------------- instance Ix Ordering where -- as derived - range (l,u) = map toEnum [fromEnum l .. fromEnum u] + range (l,u) + | l <= u = map toEnum [fromEnum l .. fromEnum u] + | otherwise = [] index (l,_) i = fromEnum i - fromEnum l inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u @@ -183,7 +191,10 @@ in the range for an @Ix@ pair: {-# SPECIALISE rangeSize :: (Int,Int) -> Int #-} rangeSize :: (Ix a) => (a,a) -> Int rangeSize b@(l,h) - | l > h = 0 - | otherwise = index b h + 1 + | l > h || isnull (range b) = 0 + | otherwise = index b h + 1 + where + isnull [] = True + isnull _ = False \end{code} diff --git a/ghc/lib/std/PrelNum.lhs b/ghc/lib/std/PrelNum.lhs index 5a835ad11991384db32ce9fdec305b89f18690de..08081353f35de6af763c98c4b3e2c8280058f10e 100644 --- a/ghc/lib/std/PrelNum.lhs +++ b/ghc/lib/std/PrelNum.lhs @@ -288,7 +288,10 @@ instance Show Integer where instance Ix Integer where - range (m,n) = [m..n] + range (m,n) + | m <= n = [m..n] + | otherwise = [] + index b@(m,_) i | inRange b i = fromInteger (i - m) | otherwise = indexIntegerError i b