Handle synonym families in check_tau_type
[ghc-hetmet.git] / compiler / typecheck / Inst.lhs
index b0fe5f9..a11efe0 100644 (file)
@@ -161,12 +161,14 @@ ipNamesOfInst other                            = []
 tyVarsOfInst :: Inst -> TcTyVarSet
 tyVarsOfInst (LitInst {tci_ty = ty})  = tyVarsOfType  ty
 tyVarsOfInst (Dict {tci_pred = pred}) = tyVarsOfPred pred
-tyVarsOfInst (Method {tci_oid = id, tci_tys = tys}) = tyVarsOfTypes tys `unionVarSet` idFreeTyVars id
+tyVarsOfInst (Method {tci_oid = id, tci_tys = tys}) = tyVarsOfTypes tys `unionVarSet` varTypeTyVars id
                                 -- The id might have free type variables; in the case of
                                 -- locally-overloaded class methods, for example
 tyVarsOfInst (ImplicInst {tci_tyvars = tvs, tci_given = givens, tci_wanted = wanteds})
-  = (tyVarsOfInsts givens `unionVarSet` tyVarsOfInsts wanteds) `minusVarSet` mkVarSet tvs
-
+  = (tyVarsOfInsts givens `unionVarSet` tyVarsOfInsts wanteds) 
+    `minusVarSet` mkVarSet tvs
+    `unionVarSet` unionVarSets (map varTypeTyVars tvs)
+               -- Remember the free tyvars of a coercion
 
 tyVarsOfInsts insts = foldr (unionVarSet . tyVarsOfInst) emptyVarSet insts
 tyVarsOfLIE   lie   = tyVarsOfInsts (lieToList lie)
@@ -333,11 +335,10 @@ mkPredName uniq loc pred_ty
            IParam ip  _ -> getOccName (ipNameName ip)
            EqPred ty  _ -> mkEqPredCoOcc baseOcc
              where
-               -- we use the outermost tycon of the lhs, which must be a type
-               -- function, as the base name for an equality
+               -- we use the outermost tycon of the lhs, if there is one, to
+               -- improve readability of Core code
                baseOcc = case splitTyConApp_maybe ty of
-                           Nothing      -> 
-                             pprPanic "Inst.mkPredName:" (ppr ty)
+                           Nothing      -> mkOccName tcName "$"
                             Just (tc, _) -> getOccName tc
 \end{code}
 
@@ -752,7 +753,7 @@ lookupSimpleInst (Dict {tci_pred = pred, tci_loc = loc})
        (theta, _) = tcSplitPhiTy dfun_rho
        src_loc    = instLocSpan loc
        dfun       = HsVar dfun_id
-       tys        = map (substTyVar tenv') tyvars
+       tys        = substTyVars tenv' tyvars
     ; if null theta then
        returnM (GenInst [] (L src_loc $ HsWrap (mkWpTyApps tys) dfun))
       else do