Skip to content
Snippets Groups Projects
Commit 6f07f828 authored by KevinBuhr's avatar KevinBuhr Committed by Marge Bot
Browse files

Add regression test case for old issue #493

parent 10f579ad
1 merge request!894Add regression test case for old issue #493
Pipeline #5693 failed
......@@ -694,6 +694,7 @@ mk/ghcconfig*_test___spaces_ghc*.exe.mk
/tests/ffi/should_run/Capi_Ctype_002
/tests/ffi/should_run/Capi_Ctype_A_001.hs
/tests/ffi/should_run/Capi_Ctype_A_002.hs
/tests/ffi/should_run/T493
/tests/ffi/should_run/T1288
/tests/ffi/should_run/T1679
/tests/ffi/should_run/T2276
......
import Foreign
import Foreign.C
-- These newtypes...
newtype MyFunPtr a = MyFunPtr { getFunPtr :: FunPtr a }
newtype MyPtr a = MyPtr (Ptr a)
newtype MyIO a = MyIO { runIO :: IO a }
-- should be supported by...
-- foreign import dynamics
foreign import ccall "dynamic"
mkFun1 :: MyFunPtr (CInt -> CInt) -> (CInt -> CInt)
foreign import ccall "dynamic"
mkFun2 :: MyPtr (Int32 -> Int32) -> (CInt -> CInt)
-- and foreign import wrappers.
foreign import ccall "wrapper"
mkWrap1 :: (CInt -> CInt) -> MyIO (MyFunPtr (CInt -> CInt))
foreign import ccall "wrapper"
mkWrap2 :: (CInt -> CInt) -> MyIO (MyPtr (Int32 -> Int32))
-- We'll need a dynamic function point to export
foreign import ccall "getDbl" getDbl :: IO (MyFunPtr (CInt -> CInt))
-- and a Haskell function to export
half :: CInt -> CInt
half = (`div` 2)
-- and a C function to pass it to.
foreign import ccall "apply" apply1 :: MyFunPtr (CInt -> CInt) -> Int -> Int
foreign import ccall "apply" apply2 :: MyPtr (Int32 -> Int32) -> Int -> Int
main :: IO ()
main = do
dbl <- getDbl
let dbl1 = mkFun1 dbl
dbl2 = mkFun2 $ MyPtr $ castFunPtrToPtr $ getFunPtr dbl
print (dbl1 21, dbl2 21)
half1 <- runIO $ mkWrap1 half
half2 <- runIO $ mkWrap2 half
print (apply1 half1 84, apply2 half2 84)
(42,42)
(42,42)
typedef int (*intfun_p)(int);
int dbl(int x)
{
return x*2;
}
intfun_p getDbl(void)
{
return dbl;
}
int apply(intfun_p f, int x)
{
return f(x);
}
......@@ -198,3 +198,5 @@ test('PrimFFIWord8', [omit_ways(['ghci'])], compile_and_run, ['PrimFFIWord8_c.c'
test('PrimFFIInt16', [omit_ways(['ghci'])], compile_and_run, ['PrimFFIInt16_c.c'])
test('PrimFFIWord16', [omit_ways(['ghci'])], compile_and_run, ['PrimFFIWord16_c.c'])
test('T493', [], compile_and_run, ['T493_c.c'])
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment