import Data.Int
import Data.Word
import Control.Exception

f x = do
  catch (print x) (\e -> print (e :: ArithException))

main = do
  f ((- (-2147483647 - 1)) :: Int32)
  f ((2000000000 + 2000000000) :: Int32)
  f (((-2147483647) - 2147483647) :: Int32)
  f ((46341 * 46341) :: Int32)
  f ((((-2147483647) - 1) `div` (-1)) :: Int32)
  f ((- ((-9223372036854775807) - 1)) :: Int64)
  f ((5000000000000000000 + 5000000000000000000) :: Int64)
  f (((-9223372036854775807) - 9223372036854775807) :: Int64)
  f ((3037000500 * 3037000500) :: Int64)
  f ((((-9223372036854775807) - 1) `div` (-1)) :: Int64)
  f ((-4294967295) :: Word32)
  f ((3000000000 + 3000000000) :: Word32)
  f ((2147483647 - 4294967295) :: Word32)
  f ((65537 * 65537) :: Word32)
  f ((-18446744073709551615) :: Word64)
  f ((10000000000000000000 + 10000000000000000000) :: Word64)
  f ((9223372036854775807 - 18446744073709551615) :: Word64)
  f ((4294967296 * 4294967296) :: Word64)