
Solved! By just using the following syntax, GHC compiles everything correctly: foreign import ccall "&duma_releaseFont" -- absolutely vital for FunPtr functions duma_releaseFont :: FunPtr (Ptr RawFont -> IO ()) which now gives (correctly): s36c_entry() { // SNIP call "ccall" suspendThread((BaseReg, NoHint))[(_c3be, NoHint)]; call "ccall" duma_releaseFont((_s365, PtrHint)); // SPLENDID WORK GHC !!!! :-)))) call "ccall" resumeThread((_c3be, NoHint)); So it seems there is something ***very*** special about the "&duma_releaseFont" syntax whereas I'd have thought that the meaning of: foreign import ccall duma_releaseFont :: FunPtr (Ptr RawFont -> IO ()) -- DANGEROUSLY BAD :-( should be absolutely identical. However it is not. I'm not sure whether or not to report this as a bug since it certainly tripped me up, and it was only by some lucky detective work that I discovered what was happening. Is there supposed to be a difference or is this just a bug? In any case - problem solved, Brian.