Comment out debug traces
[ghc-hetmet.git] / compiler / iface / LoadIface.lhs
index fce5c1d..cfb8f12 100644 (file)
@@ -238,9 +238,12 @@ loadInterface doc_str mod from
        ; new_eps_fam_insts <- mapM tcIfaceFamInst (mi_fam_insts iface)
        ; new_eps_rules     <- tcIfaceRules ignore_prags (mi_rules iface)
 
-       ; let { final_iface = iface {   mi_decls = panic "No mi_decls in PIT",
-                                       mi_insts = panic "No mi_insts in PIT",
-                                       mi_rules = panic "No mi_rules in PIT" } }
+       ; let { final_iface = iface {   
+                               mi_decls     = panic "No mi_decls in PIT",
+                               mi_insts     = panic "No mi_insts in PIT",
+                               mi_fam_insts = panic "No mi_fam_insts in PIT",
+                               mi_rules     = panic "No mi_rules in PIT"
+                              } }
 
        ; updateEps_  $ \ eps -> 
            eps { 
@@ -252,6 +255,15 @@ loadInterface doc_str mod from
                                                   new_eps_insts,
              eps_fam_inst_env = extendFamInstEnvList (eps_fam_inst_env eps)
                                                      new_eps_fam_insts,
+              eps_mod_fam_inst_env
+                              = let
+                                  fam_inst_env = 
+                                    extendFamInstEnvList emptyFamInstEnv
+                                                         new_eps_fam_insts
+                                in
+                                extendModuleEnv (eps_mod_fam_inst_env eps)
+                                                mod
+                                                fam_inst_env,
              eps_stats        = addEpsInStats (eps_stats eps) 
                                               (length new_eps_decls)
              (length new_eps_insts) (length new_eps_rules) }
@@ -298,7 +310,7 @@ loadDecl ignore_prags mod (_version, decl)
   = do         {       -- Populate the name cache with final versions of all 
                -- the names associated with the decl
          main_name      <- mk_new_bndr mod (ifName decl)
-        ; traceIf (text "Loading decl for " <> ppr main_name)
+--        ; traceIf (text "Loading decl for " <> ppr main_name)
        ; implicit_names <- mapM (mk_new_bndr mod) (ifaceDeclSubBndrs decl)
 
        -- Typecheck the thing, lazily
@@ -311,7 +323,27 @@ loadDecl ignore_prags mod (_version, decl)
        ; thing <- forkM doc $ do { bumpDeclStats main_name
                                  ; tcIfaceDecl ignore_prags decl }
 
-       -- Populate the type environment with the implicitTyThings too
+       -- Populate the type environment with the implicitTyThings too.
+       -- 
+       -- Note [Tricky iface loop]
+       -- ~~~~~~~~~~~~~~~~~~~~~~~~
+       -- The delicate point here is that 'mini-env' should be
+       -- buildable from 'thing' without demanding any of the things 'forkM'd 
+       -- by tcIfaceDecl.  For example
+       --      class C a where { data T a; op :: T a -> Int }
+       -- We return the bindings
+       --      [("C", <cls>), ("T", lookup env "T"), ("op", lookup env "op")]
+       -- The call (lookup env "T") must return the tycon T without first demanding
+       -- op; because getting the latter will look up T, hence loop.
+       --
+       -- Of course, there is no reason in principle why (lookup env "T") should demand
+       -- anything do to with op, but take care: 
+       --      (a) implicitTyThings, and 
+       --      (b) getOccName of all the things returned by implicitThings, 
+       -- must not depend on any of the nested type-checks
+       -- 
+       -- All a bit too finely-balanced for my liking.
+
        ; let mini_env = mkOccEnv [(getOccName t, t) | t <- implicitTyThings thing]
              lookup n = case lookupOccEnv mini_env (getOccName n) of
                           Just thing -> thing
@@ -456,6 +488,8 @@ initExternalPackageState
       eps_fam_inst_env = emptyFamInstEnv,
       eps_rule_base    = mkRuleBase builtinRules,
        -- Initialise the EPS rule pool with the built-in rules
+      eps_mod_fam_inst_env
+                       = emptyModuleEnv,
       eps_stats = EpsStats { n_ifaces_in = 0, n_decls_in = 0, n_decls_out = 0
                           , n_insts_in = 0, n_insts_out = 0
                           , n_rules_in = length builtinRules, n_rules_out = 0 }
@@ -504,7 +538,7 @@ ifaceStats eps
         hsep [ int (n_rules_out stats), text "rule decls imported, out of",  
                int (n_rules_in stats), text "read"]
        ]
-\end{code}    
+\end{code}
 
 
 %************************************************************************
@@ -541,6 +575,7 @@ pprModIface iface
        , pprFixities (mi_fixities iface)
        , vcat (map pprIfaceDecl (mi_decls iface))
        , vcat (map ppr (mi_insts iface))
+       , vcat (map ppr (mi_fam_insts iface))
        , vcat (map ppr (mi_rules iface))
        , pprDeprecs (mi_deprecs iface)
        ]