... |
... |
@@ -1604,7 +1604,7 @@ canEqCanLHSHetero :: CtEvidence -- :: (xi1 :: ki1) ~ (xi2 :: ki2) |
1604
|
1604
|
-> TcType -> TcType -- xi2
|
1605
|
1605
|
-> TcKind -- ki2
|
1606
|
1606
|
-> TcS (StopOrContinue (Either IrredCt EqCt))
|
1607
|
|
-canEqCanLHSHetero ev eq_rel swapped lhs1 ps_xi1 ki1 xi2 _ps_xi2 ki2
|
|
1607
|
+canEqCanLHSHetero ev eq_rel swapped lhs1 ps_xi1 ki1 xi2 ps_xi2 ki2
|
1608
|
1608
|
-- See Note [Equalities with incompatible kinds]
|
1609
|
1609
|
-- See Note [Kind Equality Orientation]
|
1610
|
1610
|
|
... |
... |
@@ -1613,60 +1613,63 @@ canEqCanLHSHetero ev eq_rel swapped lhs1 ps_xi1 ki1 xi2 _ps_xi2 ki2 |
1613
|
1613
|
-- NotSwapped:
|
1614
|
1614
|
-- ev :: (lhs1:ki1) ~r# (xi2:ki2)
|
1615
|
1615
|
-- kind_co :: k11 ~# ki2 -- Same orientation as ev
|
1616
|
|
--- type_ev :: lhs1 ~r# (xi2 |> sym kind_co)
|
|
1616
|
+-- new_ev :: lhs1 ~r# (xi2 |> sym kind_co)
|
1617
|
1617
|
-- Swapped
|
1618
|
1618
|
-- ev :: (xi2:ki2) ~r# (lhs1:ki1)
|
1619
|
1619
|
-- kind_co :: ki2 ~# ki1 -- Same orientation as ev
|
1620
|
|
--- type_ev :: (xi2 |> kind_co) ~r# lhs1
|
|
1620
|
+-- new_ev :: (xi2 |> kind_co) ~r# lhs1
|
|
1621
|
+-- Note that we need the `sym` when we are /not/ swapped; hence `mk_sym_co`
|
1621
|
1622
|
|
1622
|
|
- = do { (kind_co, rewriters, unifs_happened) <- mk_kind_eq -- :: ki1 ~N ki2
|
1623
|
|
- ; if unifs_happened
|
1624
|
|
- -- Unifications happened, so start again to do the zonking
|
1625
|
|
- -- Otherwise we might put something in the inert set that isn't inert
|
1626
|
|
- then startAgainWith (mkNonCanonical ev)
|
1627
|
|
- else
|
1628
|
|
- assertPpr (not (isEmptyRewriterSet rewriters)) (ppr ev) $
|
1629
|
|
- -- The rewriter set won't be empty because the two kinds differ, and there
|
1630
|
|
- -- are no unifications, so we must have emitted one or more constraints
|
1631
|
|
- do { let lhs_redn = mkReflRedn role ps_xi1
|
1632
|
|
- rhs_redn = mkGReflRightRedn role xi2 mb_sym_kind_co
|
1633
|
|
- mb_sym_kind_co = case swapped of
|
1634
|
|
- NotSwapped -> mkSymCo kind_co
|
1635
|
|
- IsSwapped -> kind_co
|
1636
|
|
-
|
1637
|
|
- ; traceTcS "Hetero equality gives rise to kind equality"
|
1638
|
|
- (ppr swapped $$
|
1639
|
|
- ppr kind_co <+> dcolon <+> sep [ ppr ki1, text "~#", ppr ki2 ])
|
1640
|
|
- ; type_ev <- rewriteEqEvidence rewriters ev swapped lhs_redn rhs_redn
|
1641
|
|
-
|
1642
|
|
- -- The rewritten equality is non-canonical, so put it straight in the Irreds
|
1643
|
|
- ; finishCanWithIrred (NonCanonicalReason (cteProblem cteCoercionHole)) type_ev } }
|
1644
|
|
-
|
1645
|
|
--- ; let new_xi2 = mkCastTy ps_xi2 mb_sym_kind_co
|
1646
|
|
--- ; canEqCanLHSHomo type_ev eq_rel NotSwapped lhs1 ps_xi1 new_xi2 new_xi2 }}
|
1647
|
|
-
|
1648
|
|
- where
|
1649
|
|
- mk_kind_eq :: TcS (CoercionN, RewriterSet, Bool)
|
1650
|
|
- -- Returned kind_co has kind (k1 ~ k2) if NotSwapped, (k2 ~ k1) if Swapped
|
1651
|
|
- -- Returned Bool = True if unifications happened, so we should retry
|
1652
|
|
- mk_kind_eq = case ev of
|
|
1623
|
+ = case ev of
|
1653
|
1624
|
CtGiven (GivenCt { ctev_evar = evar, ctev_loc = loc })
|
1654
|
1625
|
-> do { let kind_co = mkKindCo (mkCoVarCo evar)
|
1655
|
1626
|
pred_ty = unSwap swapped mkNomEqPred ki1 ki2
|
1656
|
1627
|
kind_loc = mkKindEqLoc xi1 xi2 loc
|
1657
|
1628
|
; kind_ev <- newGivenEvVar kind_loc (pred_ty, evCoercion kind_co)
|
1658
|
1629
|
; emitWorkNC [CtGiven kind_ev]
|
1659
|
|
- ; return (givenCtEvCoercion kind_ev, emptyRewriterSet, False) }
|
|
1630
|
+ ; let kind_co = givenCtEvCoercion kind_ev
|
|
1631
|
+ new_xi2 = mkCastTy ps_xi2 (mk_sym_co kind_co)
|
|
1632
|
+ ; new_ev <- do_rewrite emptyRewriterSet kind_co
|
|
1633
|
+ -- In the Given case, `new_ev` is canonical, so carry on
|
|
1634
|
+ ; canEqCanLHSHomo new_ev eq_rel NotSwapped lhs1 ps_xi1 new_xi2 new_xi2 }
|
1660
|
1635
|
|
1661
|
1636
|
CtWanted {}
|
1662
|
|
- -> do { (kind_co, cts, unifs) <- wrapUnifierTcS ev Nominal $ \uenv ->
|
1663
|
|
- let uenv' = updUEnvLoc uenv (mkKindEqLoc xi1 xi2)
|
1664
|
|
- in unSwap swapped (uType uenv') ki1 ki2
|
1665
|
|
- ; return (kind_co, rewriterSetFromCts cts, not (null unifs)) }
|
1666
|
|
-
|
|
1637
|
+ -> do { (kind_co, cts, unifs) <- wrapUnifierTcS ev Nominal $ \uenv ->
|
|
1638
|
+ let uenv' = updUEnvLoc uenv (mkKindEqLoc xi1 xi2)
|
|
1639
|
+ in unSwap swapped (uType uenv') ki1 ki2
|
|
1640
|
+ ; if not (null unifs)
|
|
1641
|
+ then -- Unifications happened, so start again to do the zonking
|
|
1642
|
+ -- Otherwise we might put something in the inert set that isn't inert
|
|
1643
|
+ startAgainWith (mkNonCanonical ev)
|
|
1644
|
+ else
|
|
1645
|
+
|
|
1646
|
+ assertPpr (not (isEmptyCts cts)) (ppr ev $$ ppr ki1 $$ ppr ki2) $
|
|
1647
|
+ -- The constraints won't be empty because the two kinds differ, and there
|
|
1648
|
+ -- are no unifications, so we must have emitted one or more constraints
|
|
1649
|
+ do { new_ev <- do_rewrite (rewriterSetFromCts cts) kind_co
|
|
1650
|
+ -- The rewritten equality `new_ev` is non-canonical,
|
|
1651
|
+ -- so put it straight in the Irreds
|
|
1652
|
+ ; finishCanWithIrred (NonCanonicalReason (cteProblem cteCoercionHole)) new_ev } }
|
|
1653
|
+ where
|
1667
|
1654
|
xi1 = canEqLHSType lhs1
|
1668
|
1655
|
role = eqRelRole eq_rel
|
1669
|
1656
|
|
|
1657
|
+ -- Apply mkSymCo when /not/ swapped
|
|
1658
|
+ mk_sym_co co = case swapped of
|
|
1659
|
+ NotSwapped -> mkSymCo co
|
|
1660
|
+ IsSwapped -> co
|
|
1661
|
+
|
|
1662
|
+ do_rewrite rewriters kind_co
|
|
1663
|
+ = do { traceTcS "Hetero equality gives rise to kind equality"
|
|
1664
|
+ (ppr swapped $$
|
|
1665
|
+ ppr kind_co <+> dcolon <+> sep [ ppr ki1, text "~#", ppr ki2 ])
|
|
1666
|
+ ; rewriteEqEvidence rewriters ev swapped lhs_redn rhs_redn }
|
|
1667
|
+ where
|
|
1668
|
+ -- kind_co :: ki1 ~N ki2
|
|
1669
|
+ lhs_redn = mkReflRedn role ps_xi1
|
|
1670
|
+ rhs_redn = mkGReflRightRedn role xi2 (mk_sym_co kind_co)
|
|
1671
|
+
|
|
1672
|
+
|
1670
|
1673
|
canEqCanLHSHomo :: CtEvidence -- lhs ~ rhs
|
1671
|
1674
|
-- or, if swapped: rhs ~ lhs
|
1672
|
1675
|
-> EqRel -> SwapFlag
|