summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarter Tazio Schonwald <carter.schonwald@gmail.com>2020-01-03 14:19:07 -0500
committerCarter Tazio Schonwald <carter.schonwald@gmail.com>2020-01-03 14:19:07 -0500
commitbcc8f0a7cd07d575b35bdd750defe9e184c2b1f8 (patch)
tree97eb51239df645352497f621a301b8766780f621
parente93532cf4d7f404a8287ef356c1a8545e9b24e01 (diff)
downloadhaskell-bcc8f0a7cd07d575b35bdd750defe9e184c2b1f8.tar.gz
current state of play
-rw-r--r--compiler/simplCore/CoreEraseCoercionProofs.hs3
-rw-r--r--compiler/types/Coercion.hs8
-rw-r--r--compiler/types/TyCoRep.hs1
-rw-r--r--compiler/types/Type.hs3
4 files changed, 10 insertions, 5 deletions
diff --git a/compiler/simplCore/CoreEraseCoercionProofs.hs b/compiler/simplCore/CoreEraseCoercionProofs.hs
index 1b053ec6ff..68cf85797c 100644
--- a/compiler/simplCore/CoreEraseCoercionProofs.hs
+++ b/compiler/simplCore/CoreEraseCoercionProofs.hs
@@ -42,8 +42,7 @@ coreExprEraseProof (Cast e co ) = Cast (coreExprEraseProof e) (forcedEraseCo
coreExprEraseProof (Tick tick e)= Tick tick (coreExprEraseProof e)
coreExprEraseProof (Type t) = Type t
coreExprEraseProof (Coercion co )= Coercion $! forcedEraseCoercion co
- where
- (Pair lty rty,role) = coercionKindRole co
+
eraseAltPfs :: CoreAlt -> CoreAlt
eraseAltPfs (con, vars, body) = (con,vars,coreExprEraseProof body)
diff --git a/compiler/types/Coercion.hs b/compiler/types/Coercion.hs
index 7371036eec..0cd374641c 100644
--- a/compiler/types/Coercion.hs
+++ b/compiler/types/Coercion.hs
@@ -1292,11 +1292,13 @@ mkCoherenceRightCo r ty co co2
| otherwise = co2 `mkTransCo` GRefl r ty (MCo co)
-- | Given @co :: (a :: k) ~ (b :: k')@ produce @co' :: k ~ k'@.
-mkKindCo :: Coercion -> Coercion
+mkKindCo :: HasCallStack =>Coercion -> Coercion
mkKindCo co | Just (ty, _) <- isReflCo_maybe co = Refl (typeKind ty)
mkKindCo (GRefl _ _ (MCo co)) = co
mkKindCo (UnivCo (PhantomProv h) _ _ _) = h
mkKindCo (UnivCo (ProofIrrelProv h) _ _ _) = h
+mkKindCo (UnivCo ErasedProv _ t1 t2 )
+ = mkUnivCo ErasedProv Nominal (typeKind t1) (typeKind t2)
mkKindCo co
| Pair ty1 ty2 <- coercionKind co
-- generally, calling coercionKind during coercion creation is a bad idea,
@@ -1309,10 +1311,11 @@ mkKindCo co
| otherwise
= KindCo co
-mkSubCo :: Coercion -> Coercion
+mkSubCo :: HasCallStack =>Coercion -> Coercion
-- Input coercion is Nominal, result is Representational
-- see also Note [Role twiddling functions]
mkSubCo (Refl ty) = GRefl Representational ty MRefl
+mkSubCo (UnivCo ErasedProv Nominal t1 t2) =mkUnivCo ErasedProv Representational t1 t2
mkSubCo (GRefl Nominal ty co) = GRefl Representational ty co
mkSubCo (TyConAppCo Nominal tc cos)
= TyConAppCo Representational tc (applyRoles tc cos)
@@ -1519,6 +1522,7 @@ promoteCoercion co = case co of
UnivCo (PhantomProv kco) _ _ _ -> kco
UnivCo (ProofIrrelProv kco) _ _ _ -> kco
UnivCo (PluginProv _) _ _ _ -> mkKindCo co
+ UnivCo ErasedProv _r t1 t2 -> mkUnivCo ErasedProv Nominal (typeKind t1) (typeKind t2)
SymCo g
-> mkSymCo (promoteCoercion g)
diff --git a/compiler/types/TyCoRep.hs b/compiler/types/TyCoRep.hs
index d43a7e27e3..5d9ccae46f 100644
--- a/compiler/types/TyCoRep.hs
+++ b/compiler/types/TyCoRep.hs
@@ -1491,6 +1491,7 @@ instance Outputable UnivCoProvenance where
ppr (PhantomProv _) = text "(phantom)"
ppr (ProofIrrelProv _) = text "(proof irrel.)"
ppr (PluginProv str) = parens (text "plugin" <+> brackets (text str))
+ ppr (ErasedProv) = text "Erased proof"
-- | A coercion to be filled in by the type-checker. See Note [Coercion holes]
data CoercionHole
diff --git a/compiler/types/Type.hs b/compiler/types/Type.hs
index 2b9a3bcc53..bd6001f42f 100644
--- a/compiler/types/Type.hs
+++ b/compiler/types/Type.hs
@@ -651,7 +651,7 @@ mapCoercion :: Monad m
=> TyCoMapper env m -> env -> Coercion -> m Coercion
mapCoercion mapper@(TyCoMapper { tcm_covar = covar
, tcm_hole = cohole
- , tcm_tyvar = tyvar
+ -- , tcm_tyvar = tyvar
, tcm_tycobinder = tycobinder
, tcm_tycon = tycon })
env co
@@ -696,6 +696,7 @@ mapCoercion mapper@(TyCoMapper { tcm_covar = covar
go_prov (PhantomProv co) = PhantomProv <$> go co
go_prov (ProofIrrelProv co) = ProofIrrelProv <$> go co
go_prov p@(PluginProv _) = return p
+ go_prov ErasedProv = return ErasedProv
{-
************************************************************************