ghc api: `load LoadAllTargets` is not idempotent
While trying to adapt hint for ghc 8.4.1, I've encountered the following phenomenon where an extra load LoadAllTargets line causes errors.
-- warning: the code below creates files A.hs and B.hs in the current working directory
import System.Directory
import Control.Monad.IO.Class
import GHCi.RemoteTypes
import GHC.Paths -- cf. the ghc-paths package
import Unsafe.Coerce
main = do
writeFile "A.hs" "module Ahidden(a) where { a :: Int; a = 42 }"
let mod_nameA = mkModuleName "Ahidden"
mod_targetA = Target (TargetFile "A.hs" Nothing) False Nothing
runGhc (Just libdir) $ do
-- setup
df0 <- getSessionDynFlags
(df1, _, _) <- parseDynamicFlags df0 []
setSessionDynFlags df1{
ghcMode = CompManager,
hscTarget = HscInterpreted,
ghcLink = LinkInMemory,
verbosity = 0
}
-- context : *X
setTargets [mod_targetA]
load LoadAllTargets
load LoadAllTargets -- this line causes the next line to fail
setContext [IIModule mod_nameA]
-- error:
-- ...: Could not find module ‘Ahidden’
-- Use -v to see a list of the files searched for.
runIOExpr "print a :: IO ()"
runIOExpr e = do
HValue h <- compileExpr e
liftIO (unsafeCoerce h :: IO ())
This code works with ghc 8.2. The new behavior probably originates in 1893ba12, which adds flushing of the finder cache (main/Finder.hs) for every dependency analysis; my guess is that this is where the connection between the module name Ahidden and the file A.hs used be tracked.
http://lpaste.net/364298 is a less artificial example of the same behavior.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.4.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | GHC API |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |