{-# LANGUAGE MagicHash, UnboxedTuples #-} -- Test allocation of statically sized byte arrays. There's an -- optimization that targets these and we want to make sure that the -- code generated in the optimized case is correct. -- -- The tests proceeds by allocating a bunch of byte arrays of -- different sizes, to try to provoke GC crashes, which would be a -- symptom of the optimization not generating correct code. module Main where import GHC.Exts import GHC.IO main :: IO () main = do loop 1000 putStrLn "success" where loop :: Int -> IO () loop 0 = return () loop i = do -- Sizes have been picked to match the triggering of the -- optimization and to match boundary conditions. Sizes are -- given explicitly as to not rely on other optimizations to -- make the static size known to the compiler. newByteArray 0 newByteArray 1 newByteArray 2 newByteArray 3 newByteArray 4 newByteArray 5 newByteArray 6 newByteArray 7 newByteArray 8 newByteArray 9 newByteArray 10 newByteArray 11 newByteArray 12 newByteArray 13 newByteArray 14 newByteArray 15 newByteArray 16 newByteArray 64 newByteArray 128 newByteArray 129 loop (i-1) newByteArray :: Int -> IO () newByteArray (I# sz#) = IO $ \s -> case newByteArray# sz# s of (# s', _ #) -> (# s', () #) {-# INLINE newByteArray #-} -- to make sure optimization triggers