summaryrefslogtreecommitdiff
path: root/compiler/GHC/Tc/Utils/Zonk.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Tc/Utils/Zonk.hs')
-rw-r--r--compiler/GHC/Tc/Utils/Zonk.hs45
1 files changed, 32 insertions, 13 deletions
diff --git a/compiler/GHC/Tc/Utils/Zonk.hs b/compiler/GHC/Tc/Utils/Zonk.hs
index b798593c1d..ba29d0e3c8 100644
--- a/compiler/GHC/Tc/Utils/Zonk.hs
+++ b/compiler/GHC/Tc/Utils/Zonk.hs
@@ -29,7 +29,7 @@ module GHC.Tc.Utils.Zonk (
zonkTopDecls, zonkTopExpr, zonkTopLExpr,
zonkTopBndrs,
ZonkEnv, ZonkFlexi(..), emptyZonkEnv, mkEmptyZonkEnv, initZonkEnv,
- zonkTyVarBindersX, zonkTyVarBinderX,
+ zonkTyVarBindersX, zonkTyVarBinderX, zonkTyCoBinderX, zonkTyCoBindersX,
zonkTyBndrs, zonkTyBndrsX,
zonkTcTypeToType, zonkTcTypeToTypeX,
zonkTcTypesToTypesX, zonkScaledTcTypesToTypesX,
@@ -63,6 +63,7 @@ import GHC.Core.Type
import GHC.Core.Coercion
import GHC.Core.ConLike
import GHC.Core.DataCon
+import GHC.Core.TyCo.Rep ( TyCoBinder(..) )
import GHC.Utils.Outputable
import GHC.Utils.Misc
@@ -460,6 +461,17 @@ zonkTyVarBinderX env (Bndr tv vis)
= do { (env', tv') <- zonkTyBndrX env tv
; return (env', Bndr tv' vis) }
+zonkTyCoBinderX :: ZonkEnv -> TyCoBinder -> TcM TyCoBinder
+zonkTyCoBinderX env (Anon flag ty) =
+ do { ty' <- zonkScaledTcTypeToTypeX env ty
+ ; return $ Anon flag ty' }
+zonkTyCoBinderX env (Named tv) =
+ do { (_, tv') <- zonkTyVarBinderX env tv
+ ; return $ Named tv' }
+
+zonkTyCoBindersX :: ZonkEnv -> [TyCoBinder] -> TcM [TyCoBinder]
+zonkTyCoBindersX env bndrs = mapM (zonkTyCoBinderX env) bndrs
+
zonkTopExpr :: HsExpr GhcTc -> TcM (HsExpr GhcTc)
zonkTopExpr e = initZonkEnv $ \ ze -> zonkExpr ze e
@@ -677,7 +689,7 @@ zonkMatchGroup env zBody (MG { mg_alts = L l ms
, mg_ext = MatchGroupTc arg_tys res_ty origin
})
= do { ms' <- mapM (zonkMatch env zBody) ms
- ; arg_tys' <- zonkScaledTcTypesToTypesX env arg_tys
+ ; arg_tys' <- zonkTyCoBindersX env arg_tys
; res_ty' <- zonkTcTypeToTypeX env res_ty
; return (MG { mg_alts = L l ms'
, mg_ext = MatchGroupTc arg_tys' res_ty' origin
@@ -690,7 +702,7 @@ zonkMatch :: Anno (GRHS GhcTc (LocatedA (body GhcTc))) ~ SrcAnn NoEpAnns
-> TcM (LMatch GhcTc (LocatedA (body GhcTc)))
zonkMatch env zBody (L loc match@(Match { m_pats = pats
, m_grhss = grhss }))
- = do { (env1, new_pats) <- zonkMatchPats env pats
+ = do { (env1, new_pats) <- zonkLMatchPats env pats
; new_grhss <- zonkGRHSs env1 zBody grhss
; return (L loc (match { m_pats = new_pats, m_grhss = new_grhss })) }
@@ -1296,6 +1308,18 @@ zonkPat :: ZonkEnv -> LPat GhcTc -> TcM (ZonkEnv, LPat GhcTc)
-- to the right)
zonkPat env pat = wrapLocSndMA (zonk_pat env) pat
+zonkLMatchPat :: ZonkEnv -> LMatchPat GhcTc -> TcM (ZonkEnv, LMatchPat GhcTc)
+zonkLMatchPat env (L l (VisPat x pat))
+ = do { (env', p') <- zonkPat env pat
+ ; return (env', L l (VisPat x p'))
+ }
+zonkLMatchPat env (L l (InvisTyVarPat t (L l' (UserTyVar x () (L l'' idp)))))
+ = do { (env', (L _ idp')) <- wrapLocSndM (zonkTyBndrX env) (L noSrcSpan idp)
+ ; let zonkedNewTyVar = L l' (UserTyVar x () (L l'' idp'))
+ ; return (env', L l (InvisTyVarPat t zonkedNewTyVar))
+ }
+zonkLMatchPat env p = return (env, p)
+
zonk_pat :: ZonkEnv -> Pat GhcTc -> TcM (ZonkEnv, Pat GhcTc)
zonk_pat env (ParPat x lpar p rpar)
= do { (env', p') <- zonkPat env p
@@ -1442,16 +1466,11 @@ zonkPats env (pat:pats) = do { (env1, pat') <- zonkPat env pat
; (env', pats') <- zonkPats env1 pats
; return (env', pat':pats') }
-zonkMatchPats :: ZonkEnv -> [LMatchPat GhcTc] -> TcM (ZonkEnv, [LMatchPat GhcTc])
-zonkMatchPats env [] = return (env, [])
-zonkMatchPats env (pat:pats) =
- case pat of
- L l (VisPat x lpat) -> do { (env1, pat') <- zonkPat env lpat
- ; (env', pats') <- zonkMatchPats env1 pats
- ; return (env', L l (VisPat x pat') : pats')
- }
- L _ (InvisTyVarPat x _) -> dataConCantHappen x
- L _ (InvisWildTyPat x) -> dataConCantHappen x
+zonkLMatchPats :: ZonkEnv -> [LMatchPat GhcTc] -> TcM (ZonkEnv, [LMatchPat GhcTc])
+zonkLMatchPats env [] = return (env, [])
+zonkLMatchPats env (pat:pats) = do { (env1, pat') <- zonkLMatchPat env pat
+ ; (env', pats') <- zonkLMatchPats env1 pats
+ ; return (env', pat' : pats') }
{-
************************************************************************