
#9729: GHCi accepts invalid programs when recompiling -------------------------------------+------------------------------------- Reporter: crockeea | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: GHCi | Version: 7.8.3 Resolution: | Keywords: Operating System: | Architecture: Unknown/Multiple Unknown/Multiple | Difficulty: Unknown Type of failure: GHC | Blocked By: accepts invalid program | Related Tickets: Test Case: | Blocking: | Differential Revisions: | -------------------------------------+------------------------------------- Comment (by simonpj): The problem is this. * When compiling A we load up the interface file for `Data.Syntactic.Sugar.BindingT`, since A imports it. It includes an orphan instance declaration for the type family `Internal`. * That populates the `eps_fam_inst_env`, globally across all packages, recording an instance for the type family `Internal`. * Then when recompiling B we see the instance. The solution, I think, is this: * During instance lookup, for type families or classes, if the matched instance is an orphan, then check that the host module for the instance is transitively below the module being compiled. We only need to do this check for orphan instance, because it's guaranteed true for non-orphans. GHC already keeps a list of all the orphan modules transitively below the one being compiled, in the `imp_orphs` field of `tcg_imports`. So the check should be easy to do. That said, a `ModuleSet` would be better than a list, for fast membership checks. Edward is already working on adding more info to the `imp_orphs` field: see Trac #9717. It might be better to combine the two. Edward would you like to comment? Simon -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9729#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler