Skip to content

ghci doesn't always use compiled modules

Here is a small program:

module T where
foo :: Int -> Int
foo n = n+1
module U where
import T
main = print (foo 1)

Now I do this:

$ ghc -c T.hs
$ runhaskell -v U.hs
...
[1 of 2] Skipping  T                ( T.hs, T.o )
...  
$ touch T.hs
$ runhaskell -v U.hs
...
[1 of 2] Compiling T                ( T.hs, interpreted )
...
$ ghc -c T.hs -fforce-recomp
$ runhaskell -v U.hs
...
[1 of 2] Compiling T                ( T.hs, interpreted )
...

Note that runhaskell doesn't use T.o even though I recompiled T. As far as I understand, this is because compilation has regenerated T.o but hasn't updated T.hi because the interface hasn't changed. So T.hi is older than T.hs and ghci seems to ignore the compiled version in this case. I'm not sure why the .hi file's timestamped is checked here, it seems that checking the .o file should be sufficient.

Trac metadata
Trac field Value
Version 7.2.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information