Refactor (again) the handling of default methods
[ghc-hetmet.git] / compiler / typecheck / TcRnDriver.lhs
index acaf05c..649807e 100644 (file)
@@ -59,7 +59,7 @@ import Id
 import VarEnv
 import Var
 import Module
-import LazyUniqFM
+import UniqFM
 import Name
 import NameEnv
 import NameSet
@@ -433,7 +433,7 @@ tc_rn_src_decls boot_details ds
        failWithTc (text "Can't do a top-level splice; need a bootstrapped compiler")
 #else
        -- If there's a splice, we must carry on
-          Just (SpliceDecl splice_expr, rest_ds) -> do {
+          Just (SpliceDecl splice_expr _, rest_ds) -> do {
 
        -- Rename the splice expression, and get its supporting decls
        (rn_splice_expr, splice_fvs) <- checkNoErrs (rnLExpr splice_expr) ;
@@ -477,8 +477,8 @@ tcRnHsBootDecls decls
 
                -- Check for illegal declarations
        ; case group_tail of
-            Just (SpliceDecl d, _) -> badBootDecl "splice" d
-            Nothing                -> return ()
+            Just (SpliceDecl d _, _) -> badBootDecl "splice" d
+            Nothing                  -> return ()
        ; mapM_ (badBootDecl "foreign") for_decls
        ; mapM_ (badBootDecl "default") def_decls
        ; mapM_ (badBootDecl "rule")    rule_decls
@@ -566,15 +566,19 @@ checkHiBootIface
 
                -- Check instance declarations
        ; mb_dfun_prs <- mapM check_inst boot_insts
-       ; let tcg_env' = tcg_env { tcg_binds    = binds `unionBags` dfun_binds,
-                                  tcg_type_env = extendTypeEnvWithIds local_type_env boot_dfuns }
-             dfun_prs   = catMaybes mb_dfun_prs
-             boot_dfuns = map fst dfun_prs
-             dfun_binds = listToBag [ mkVarBind boot_dfun (nlHsVar dfun)
-                                    | (boot_dfun, dfun) <- dfun_prs ]
+        ; let dfun_prs   = catMaybes mb_dfun_prs
+              boot_dfuns = map fst dfun_prs
+              dfun_binds = listToBag [ mkVarBind boot_dfun (nlHsVar dfun)
+                                     | (boot_dfun, dfun) <- dfun_prs ]
+              type_env'  = extendTypeEnvWithIds local_type_env boot_dfuns
+              tcg_env'   = tcg_env { tcg_binds = binds `unionBags` dfun_binds }
 
         ; failIfErrsM
-       ; return tcg_env' }
+       ; setGlobalTypeEnv tcg_env' type_env' }
+            -- Update the global type env *including* the knot-tied one
+             -- so that if the source module reads in an interface unfolding
+             -- mentioning one of the dfuns from the boot module, then it
+             -- can "see" that boot dfun.   See Trac #4003
   where
     check_export boot_avail    -- boot_avail is exported by the boot iface
       | name `elem` dfun_names = return ()