Commit c4bcd9ab authored by Ian Lynagh's avatar Ian Lynagh
Browse files

Add a test for quot/rem/div/mod overflow

parent 4d2ac2d4
......@@ -4,3 +4,4 @@ test('enumDouble', normal, compile_and_run, [''])
test('enumRatio', normal, compile_and_run, [''])
test('tempfiles', normal, compile_and_run, [''])
test('fixed', normal, compile_and_run, [''])
test('quotOverflow', normal, compile_and_run, [''])
import Control.Exception as E
import Data.Int
main :: IO ()
main = do putStrLn "Int8"
mapM_ p =<< (f :: IO [Either Int8 String])
putStrLn "Int16"
mapM_ p =<< (f :: IO [Either Int16 String])
putStrLn "Int32"
mapM_ p =<< (f :: IO [Either Int32 String])
putStrLn "Int64"
mapM_ p =<< (f :: IO [Either Int64 String])
putStrLn "Int"
mapM_ p =<< (f :: IO [Either Int String])
where p (Left x) = print x
p (Right e) = putStrLn e
f :: (Integral a, Bounded a) => IO [Either a String]
f = sequence [ g (minBound `div` (-1)),
g (minBound `mod` (-1)),
g (case minBound `divMod` (-1) of (x, _) -> x),
g (case minBound `divMod` (-1) of (_, x) -> x),
g (minBound `quot` (-1)),
g (minBound `rem` (-1)),
g (case minBound `quotRem` (-1) of (x, _) -> x),
g (case minBound `quotRem` (-1) of (_, x) -> x) ]
where g x = do x' <- evaluate x
return (Left x')
`E.catch`
\e -> return (Right (show (e :: SomeException)))
Int8
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
Int16
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
Int32
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
Int64
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
Int
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
arithmetic overflow
0
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment