Strange GHC bug

Sean Seefried sseefried at cse.unsw.edu.au
Wed Feb 11 03:35:56 EST 2004


Hi all,

I'm came across the *strangest* build problem.  (I was compiling the 8 
February 2004 GHC HEAD.)  It seems that if you compile libraries with 
the -Onot flag then data types are exported abstractly! I first became 
aware of this problem while trying to build 
base/Foreign/Marshall/Alloc.o. I received the following error:

-------------

../../ghc/compiler/ghc-inplace -H16m -O 
-I/home/sseefried/local-ppc7400/include
-L/home/sseefried/local-ppc7400/lib -framework-path 
/home/sseefried/Library/Fram
eworks -framework HaskellSupport -fglasgow-exts -cpp -Iinclude 
-#include HsBase.
h -funbox-strict-fields -package-name base -H32 -Onot -Rghc-timing     
-c Foreig
n/Marshal/Alloc.hs -o Foreign/Marshal/Alloc.o  -ohi 
Foreign/Marshal/Alloc.hi

Foreign/Marshal/Alloc.hs:155:0:
     Unacceptable argument type in foreign declaration: CSize
     When checking declaration:
         foreign import ccall unsafe "static stdlib.h &malloc" _malloc 
:: CSize
                                                                         
  -> IO (
Ptr a)

Foreign/Marshal/Alloc.hs:156:0:
     Unacceptable argument type in foreign declaration: CSize
     When checking declaration:
         foreign import ccall unsafe "static stdlib.h &realloc" _realloc 
:: Ptr a
                                                                         
    -> CS
ize -> IO (Ptr b)
<<ghc: 11741976 bytes, 27 GCs, 553492/1069000 avg/max bytes residency 
(2 samples
), 6M in use, 0.02 INIT (0.01 elapsed), 0.20 MUT (0.29 elapsed), 0.19 
GC (0.12 e
lapsed) :ghc>>
make[1]: *** [Foreign/Marshal/Alloc.o] Error 1

--------------

I tracked this problem down to an error that is defined in 
ghc/compiler/typecheck/TcForeign.lhs.
I quickly discovered that the argument type of a foreign import dynamic 
must be marshalable type or a newtype of such a type.  I looked into 
Foreign/C/Types.hs and found that CSize should indeed be a newtype of a 
marshalable type.  So what was the problem? I decided to look at the 
interface file Foreign/C/Types.hi using the --show-iface flag.

To my surprise I got the following!

6 newtype CSize
       Variances []
       RecFlag NonRecursive
       Generics: yes
       {- abstract -}

When I removed the -Onot flag what I got was this:

6 newtype CSize
       Variances []
       RecFlag NonRecursive
       Generics: yes
       = CSize GHC.Word.Word32{1} Stricts: _

This is obviously correct.

So is this known behaviour and if so, why does it happen?

Sean



More information about the Cvs-ghc mailing list