Extra comments, as per SPJ in #12035.
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Mon, 22 Aug 2016 20:34:43 +0000 (13:34 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Mon, 22 Aug 2016 20:34:43 +0000 (13:34 -0700)
Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
compiler/iface/TcIface.hs
compiler/main/GhcMake.hs

index fa8e26a..5b31b7a 100644 (file)
@@ -1421,6 +1421,10 @@ ifKnotErr name env_doc type_env = vcat
 --      * Note [Knot-tying typecheckIface]
 --      * Note [DFun knot-tying]
 --      * Note [hsc_type_env_var hack]
+--
+-- There is also a wiki page on the subject, see:
+--
+--      https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/TyingTheKnot
 
 tcIfaceTyConByName :: IfExtName -> IfL TyCon
 tcIfaceTyConByName name
index d67a120..bb1c8e3 100644 (file)
@@ -1049,6 +1049,8 @@ parUpsweep_one mod home_mod_map comp_graph_loops lcl_dflags cleanup par_sem
                 let lcl_hsc_env = localize_hsc_env hsc_env
 
                 -- Re-typecheck the loop
+                -- This is necessary to make sure the knot is tied when
+                -- we close a recursive module loop, see bug #12035.
                 type_env_var <- liftIO $ newIORef emptyNameEnv
                 let lcl_hsc_env' = lcl_hsc_env { hsc_type_env_var =
                                     Just (ms_mod lcl_mod, type_env_var) }
@@ -1158,7 +1160,8 @@ upsweep old_hpt stable_mods cleanup sccs = do
         -- Lazily reload the HPT modules participating in the loop.
         -- See Note [Tying the knot]--if we don't throw out the old HPT
         -- and reinitalize the knot-tying process, anything that was forced
-        -- while we were previously typechecking won't get updated.
+        -- while we were previously typechecking won't get updated, this
+        -- was bug #12035.
         hsc_env2 <- liftIO $ reTypecheckLoop hsc_env1 mod done
         setSession hsc_env2