summaryrefslogtreecommitdiff
path: root/compiler/GHC/Tc/Solver.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Tc/Solver.hs')
-rw-r--r--compiler/GHC/Tc/Solver.hs50
1 files changed, 36 insertions, 14 deletions
diff --git a/compiler/GHC/Tc/Solver.hs b/compiler/GHC/Tc/Solver.hs
index 7f4bcdf871..1bf42d99b2 100644
--- a/compiler/GHC/Tc/Solver.hs
+++ b/compiler/GHC/Tc/Solver.hs
@@ -18,7 +18,7 @@ module GHC.Tc.Solver(
simplifyTopWanteds,
- promoteTyVarSet, emitFlatConstraints,
+ promoteTyVarSet, simplifyAndEmitFlatConstraints,
-- For Rules we need these
solveWanteds, solveWantedsAndDrop,
@@ -200,24 +200,29 @@ solveEqualities :: String -> TcM a -> TcM a
solveEqualities callsite thing_inside
= do { traceTc "solveEqualities {" (text "Called from" <+> text callsite)
; (res, wanted) <- captureConstraints thing_inside
- ; residual_wanted <- runTcSEqualities (solveWantedsAndDrop wanted)
- ; emitFlatConstraints residual_wanted
- -- emitFlatConstraints fails outright unless the only unsolved
- -- constraints are soluble-looking equalities that can float out
- ; traceTc "solveEqualities }" (text "Residual: " <+> ppr residual_wanted)
+ ; simplifyAndEmitFlatConstraints wanted
+ -- simplifyAndEmitFlatConstraints fails outright unless
+ -- the only unsolved constraints are soluble-looking
+ -- equalities that can float out
+ ; traceTc "solveEqualities }" empty
; return res }
-emitFlatConstraints :: WantedConstraints -> TcM ()
+simplifyAndEmitFlatConstraints :: WantedConstraints -> TcM ()
-- See Note [Failure in local type signatures]
-emitFlatConstraints wanted
- = do { wanted <- TcM.zonkWC wanted
+simplifyAndEmitFlatConstraints wanted
+ = do { -- Solve and zonk to esablish the
+ -- preconditions for floatKindEqualities
+ wanted <- runTcSEqualities (solveWanteds wanted)
+ ; wanted <- TcM.zonkWC wanted
+
+ ; traceTc "emitFlatConstraints {" (ppr wanted)
; case floatKindEqualities wanted of
- Nothing -> do { traceTc "emitFlatConstraints: failing" (ppr wanted)
+ Nothing -> do { traceTc "emitFlatConstraints } failing" (ppr wanted)
; emitConstraints wanted -- So they get reported!
; failM }
Just (simples, holes)
- -> do { _ <- TcM.promoteTyVarSet (tyCoVarsOfCts simples)
- ; traceTc "emitFlatConstraints:" $
+ -> do { _ <- promoteTyVarSet (tyCoVarsOfCts simples)
+ ; traceTc "emitFlatConstraints }" $
vcat [ text "simples:" <+> ppr simples
, text "holes: " <+> ppr holes ]
; emitHoles holes -- Holes don't need promotion
@@ -228,6 +233,12 @@ floatKindEqualities :: WantedConstraints -> Maybe (Bag Ct, Bag Hole)
-- Return Nothing if any constraints can't be floated (captured
-- by skolems), or if there is an insoluble constraint, or
-- IC_Telescope telescope error
+-- Precondition 1: we have tried to solve the 'wanteds', both so that
+-- the ic_status field is set, and because solving can make constraints
+-- more floatable.
+-- Precondition 2: the 'wanteds' are zonked, since floatKindEqualities
+-- is not monadic
+-- See Note [floatKindEqualities vs approximateWC]
floatKindEqualities wc = float_wc emptyVarSet wc
where
float_wc :: TcTyCoVarSet -> WantedConstraints -> Maybe (Bag Ct, Bag Hole)
@@ -328,7 +339,7 @@ So here's the plan (see tcHsSigType):
* buildTvImplication: build an implication for the residual, unsolved
constraint
-* emitFlatConstraints: try to float out every unsolved equalities
+* simplifyAndEmitFlatConstraints: try to float out every unsolved equality
inside that implication, in the hope that it constrains only global
type variables, not the locally-quantified ones.
@@ -364,6 +375,16 @@ All this is done:
reporting errors, we avoid that happening.
See also #18062, #11506
+
+Note [floatKindEqualities vs approximateWC]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+floatKindEqualities and approximateWC are strikingly similar to each
+other, but
+
+* floatKindEqualites tries to float /all/ equalities, and fails if
+ it can't, or if any implication is insoluble.
+* approximateWC just floats out any constraints
+ (not just equalities) that can float; it never fails.
-}
@@ -1929,7 +1950,7 @@ checkBadTelescope :: Implication -> TcS Bool
-- See Note [Checking telescopes] in GHC.Tc.Types.Constraint
checkBadTelescope (Implic { ic_info = info
, ic_skols = skols })
- | ForAllSkol {} <- info
+ | checkTelescopeSkol info
= do{ skols <- mapM TcS.zonkTyCoVarKind skols
; return (go emptyVarSet (reverse skols))}
@@ -2238,6 +2259,7 @@ defaultTyVarTcS the_tv
approximateWC :: Bool -> WantedConstraints -> Cts
-- Postcondition: Wanted or Derived Cts
-- See Note [ApproximateWC]
+-- See Note [floatKindEqualities vs approximateWC]
approximateWC float_past_equalities wc
= float_wc emptyVarSet wc
where