-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
+wrapEqErrTcS :: CtFlavor -> TcType -> TcType
+ -> (TidyEnv -> SDoc -> TcM a)
+ -> TcS a
+wrapEqErrTcS fl ty1 ty2 thing_inside
+ = do { ty_binds_var <- getTcSTyBinds
+ ; wrapErrTcS $ setCtFlavorLoc fl $
+ do { env0 <- tcInitTidyEnv
+ ; ty_binds_bag <- readTcRef ty_binds_var
+ ; let subst = mkOpenTvSubst (mkVarEnv (bagToList ty_binds_bag))
+ ; case fl of
+ Wanted loc -> getWantedEqExtra subst env0 (ctLocOrigin loc) ty1 ty2 thing_inside
+ Derived loc -> getWantedEqExtra subst env0 (ctLocOrigin loc) ty1 ty2 thing_inside
+ Given {} -> thing_inside env0 empty -- We could print more info, but it
+ -- seems to be coming out already
+ } }
+
+getWantedEqExtra :: TvSubst -> TidyEnv -> CtOrigin -> TcType -> TcType
+ -> (TidyEnv -> SDoc -> TcM a)
+ -> TcM a
+getWantedEqExtra subst env0 (TypeEqOrigin item) ty1 ty2 thing_inside