Repository : ssh://darcs.haskell.org//srv/darcs/packages/base

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/dfcffb868d3e0a450db20c4943027117e55f2260

>---------------------------------------------------------------

commit dfcffb868d3e0a450db20c4943027117e55f2260
Author: Ian Lynagh <[email protected]>
Date:   Sun Jun 26 13:02:21 2011 +0100

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

>---------------------------------------------------------------

 tests/all.T               |    1 +
 tests/quotOverflow.hs     |   33 +++++++++++++++++++++++++++++++++
 tests/quotOverflow.stdout |   45 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 79 insertions(+), 0 deletions(-)

diff --git a/tests/all.T b/tests/all.T
index bc10ec0..0168ae6 100644
--- a/tests/all.T
+++ b/tests/all.T
@@ -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, [''])
diff --git a/tests/quotOverflow.hs b/tests/quotOverflow.hs
new file mode 100644
index 0000000..8d958f8
--- /dev/null
+++ b/tests/quotOverflow.hs
@@ -0,0 +1,33 @@
+
+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)))
+
diff --git a/tests/quotOverflow.stdout b/tests/quotOverflow.stdout
new file mode 100644
index 0000000..10e77ac
--- /dev/null
+++ b/tests/quotOverflow.stdout
@@ -0,0 +1,45 @@
+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



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to