Segfault and -dstg-lint errors using FFI and -XEmptyDataDecls
I encountered a segfault when working with some FFI code. I eventually discovered that this code also makes -dstg-lint complain.
With the below files, I can reproduce the segfault and -dstg-lint issues using ghc-6.12.1 and ghc-6.10.3 on OS X 10.6.2. The segfault goes away if I use -fvia-C, -O, or if I build on OS X 10.5.7.
The segfault also goes away if I use a unit type () instead of -XEmptyDataDecls.
$ ghc --make test-segfault.hs foreign.c -XForeignFunctionInterface \
-XEmptyDataDecls -fforce-recomp && ./test-segfault
[1 of 2] Compiling Types ( Types.hs, Types.o )
[2 of 2] Compiling Main ( test-segfault.hs, test-segfault.o )
Linking test-segfault ...
About to create...
Segmentation fault
foreign.c:
#include <stdio.h>
#include <stdlib.h>
void *
c_createFoo (int x) {
fprintf(stderr,"Creating foo...\n");
fflush(stderr);
int *p = malloc(sizeof(int));
*p = x;
return p;
}
Types.hs:
module Types where
import Foreign.Ptr
import Foreign.C.Types
-- Replacing this line with the following one prevents the segfault,
-- but not the -dstg-lint error.
data Foo_
-- type Foo_ = ()
foreign import ccall safe c_createFoo :: CInt -> IO (Ptr Foo_)
createFoo :: Int -> IO (Ptr Foo_)
createFoo dtype = c_createFoo (toEnum dtype)
test-segfault.hs:
module Main where
import Types
main = do
putStrLn "About to create..."
createFoo 1
putStrLn "Created."
The -dstg-lint error is somewhat long, but I can paste it if you're unable to reproduce it.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.12.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler (NCG) |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |