content: import Foreign
  import Control.Monad
  
  -- check that all pointers returned by allocaBytes and mallocBytes are
  -- 16-byte aligned
  main = do
      sequence [ allocaBytes x $ return | x <- [1..500] ] >>= check 16
      (replicateM 500 (alloca $ return) :: IO [Ptr Align32])  >>= check 32
      (replicateM 500 (alloca $ return) :: IO [Ptr Align64])  >>= check 64
      (replicateM 500 (alloca $ return) :: IO [Ptr Align128]) >>= check 128
      (replicateM 500 (alloca $ return) :: IO [Ptr Align256]) >>= check 256
      -- mapM mallocBytes [1..500] >>= check 16
  
  check :: Int -> [Ptr a] -> IO ()
  check align xs = do
      let bad = [ p | p <- xs,  (p `minusPtr` nullPtr) .&. (align-1) /= 0 ]
      when (not $ null bad) $
        putStrLn ("FAIL: " ++ show align ++ " " ++ show bad)
  
  data Align32 = Align32
  
  instance Storable Align32 where
    sizeOf    _ = 32
    alignment _ = 32
  
  data Align64 = Align64
  
  instance Storable Align64 where
    sizeOf    _ = 64
    alignment _ = 64
  
  data Align128 = Align128
  
  instance Storable Align128 where
    sizeOf    _ = 128
    alignment _ = 128
  
  data Align256 = Align256
  
  instance Storable Align256 where
    sizeOf    _ = 256
    alignment _ = 256
  