1module Main where 2 3import Control.Monad (liftM, when) 4import Foreign.C 5 6main = do 7 size 8 alignment 9 10size = do 11 let sz1 = {# sizeof S1 #} 12 sz1expect <- liftM fromIntegral {# call size_of_s1 #} 13 let sz2 = {# sizeof S2 #} 14 sz2expect <- liftM fromIntegral {# call size_of_s2 #} 15 -- small bitfield in struct gets wrong size, should be sizeof int, c2hs gets 1 16 -- http://hackage.haskell.org/trac/c2hs/ticket/10 17 let sz3 = {# sizeof S3 #} 18 sz3expect <- liftM fromIntegral {# call size_of_s3 #} 19 let sz4 = {# sizeof S4 #} 20 sz4expect <- liftM fromIntegral {# call size_of_s4 #} 21 22 putStrLn $ show sz1 ++ " & " 23 ++ show sz2 ++ " & " 24 ++ show sz3 ++ " & " 25 ++ show sz4 26 27 when (sz1 /= sz1expect) $ fail "Fatal: sizeof s1 != size_of_s1()" 28 when (sz2 /= sz2expect) $ fail "Fatal: sizeof s2 != size_of_s2()" 29 when (sz3 /= sz3expect) $ fail $ "Fatal: sizeof s3 != size_of_s3(): " ++ show sz3 ++ " but expected " ++ show sz3expect 30 when (sz4 /= sz4expect) $ fail $ "Fatal: sizeof s4 != size_of_s4(): " ++ show sz4 ++ " but expected " ++ show sz4expect 31 32alignment = do 33 let al1 = {# alignof S1 #} 34 al1expect <- liftM fromIntegral {# call align_of_s1 #} 35 let al2 = {# alignof S2 #} 36 al2expect <- liftM fromIntegral {# call align_of_s2 #} 37 let al3 = {# alignof S3 #} 38 al3expect <- liftM fromIntegral {# call align_of_s3 #} 39 let al4 = {# alignof S4 #} 40 al4expect <- liftM fromIntegral {# call align_of_s4 #} 41 42 putStrLn $ show al1 ++ " & " 43 ++ show al2 ++ " & " 44 ++ show al3 ++ " & " 45 ++ show al4 46 47 when (al1 /= al1expect) $ fail "Fatal: alignment s1 != align_of_s1()" 48 when (al2 /= al2expect) $ fail "Fatal: alignment s2 != align_of_s2()" 49 when (al3 /= al3expect) $ fail $ "Fatal: alignment s3 != align_of_s3(): " ++ show al3 ++ " but expected " ++ show al3expect 50 when (al4 /= al4expect) $ fail $ "Fatal: alignment s4 != align_of_s4(): " ++ show al4 ++ " but expected " ++ show al4expect 51