-setCtFlavorLoc (Wanted loc) thing = setWantedLoc loc thing
-setCtFlavorLoc (Derived loc) thing = setWantedLoc loc thing
-setCtFlavorLoc (Given loc) thing = setGivenLoc loc thing
-
-setWantedLoc :: WantedLoc -> TcM a -> TcM a
-setWantedLoc loc thing_inside
- = setCtLoc loc $
- add_origin (ctLocOrigin loc) $
- thing_inside
- where
- add_origin (TypeEqOrigin item) = addErrCtxtM (unifyCtxt item)
- add_origin orig = addErrCtxt (ptext (sLit "At") <+> ppr orig)
+setCtFlavorLoc (Wanted loc) thing = setCtLoc loc thing
+setCtFlavorLoc (Derived loc) thing = setCtLoc loc thing
+setCtFlavorLoc (Given loc) thing = setCtLoc loc thing
+
+getEqExtra :: CtFlavor -> TcType -> TcType -> TcM (TidyEnv, SDoc)
+getEqExtra (Wanted loc) ty1 ty2 = getWantedEqExtra (ctLocOrigin loc) ty1 ty2
+getEqExtra (Derived loc) ty1 ty2 = getWantedEqExtra (ctLocOrigin loc) ty1 ty2
+getEqExtra (Given _) _ _ = do { env0 <- tcInitTidyEnv
+ ; return (env0, empty) }
+ -- We could print more info, but it seems to be already coming out
+
+getWantedEqExtra :: CtOrigin -> TcType -> TcType -> TcM (TidyEnv, SDoc)
+getWantedEqExtra (TypeEqOrigin item) ty1 ty2
+ -- If the types in the error message are the same
+ -- as the types we are unifying (remember to zonk the latter)
+ -- don't add the extra expected/actual message
+ = do { act <- zonkTcType (uo_actual item)
+ ; exp <- zonkTcType (uo_expected item)
+ ; env0 <- tcInitTidyEnv
+ ; if (act `tcEqType` ty1 && exp `tcEqType` ty2)
+ || (exp `tcEqType` ty1 && act `tcEqType` ty2)
+ then
+ return (env0, empty)
+ else do
+ { let (env1, exp') = tidyOpenType env0 exp
+ (env2, act') = tidyOpenType env1 act
+ ; return (env2, mkExpectedActualMsg act' exp') } }