Can't use IntPtr or WordPtr in a foreign import
Despite the docs claiming that you can use IntPtr
and WordPtr
to convert to and from intptr_t
and uintptr_t
, you can't actually do so in a foreign import
as of GHC 7.6. Here's a minimal example:
-- Example.hs
{-# LANGUAGE ForeignFunctionInterface #-}
module Example where
{-# INCLUDE example.h #-}
import Foreign.Ptr
foreign import ccall "intptr_example"
intPtrExample :: IntPtr -> IO ()
foreign import ccall "uintptr_example"
wordPtrExample :: WordPtr -> IO ()
// example.h
#ifndef EXAMPLE_H
#define EXAMPLE_H
#include <stdint.h>
void intptr_example(intptr_t);
void uintptr_example(uintptr_t);
#endif // EXAMPLE_H
// example.c
#include <stdint.h>
#include "example.h"
void intptr_example(intptr_t i) {}
void uintptr_example(uintptr_t u) {}
This appears to be a consequence of #3008 (closed), which prevents newtype
s from being used as FFI types unless their constructors are exported. #5529 (closed) fixed this problem for the datatypes in Foreign.C.Types
and System.Posix.Types
by simply exporting their constructors, so I think all that's needed to fix this particular example is to export the constructors for IntPtr
and WordPtr
.
Trac metadata
Trac field | Value |
---|---|
Version | 8.0.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler (FFI) |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |