2 -- Type definitions for the constraint solver
5 -- Canonical constraints
6 CanonicalCts, emptyCCan, andCCan, andCCans,
7 singleCCan, extendCCans, isEmptyCCan, isCTyEqCan,
8 isCDictCan_Maybe, isCIPCan_Maybe, isCFunEqCan_Maybe,
11 WorkList, unionWorkList, unionWorkLists, isEmptyWorkList, emptyWorkList,
12 workListFromEq, workListFromNonEq,
13 workListFromEqs, workListFromNonEqs, foldrWorkListM,
15 CanonicalCt(..), Xi, tyVarsOfCanonical, tyVarsOfCanonicals, tyVarsOfCDicts,
16 deCanonicalise, mkFrozenError,
18 isWanted, isGiven, isDerived,
19 isGivenCt, isWantedCt, isDerivedCt, pprFlavorArising,
24 combineCtLoc, mkGivenFlavor, mkWantedFlavor,
27 TcS, runTcS, failTcS, panicTcS, traceTcS, -- Basic functionality
28 traceFireTcS, bumpStepCountTcS,
29 tryTcS, nestImplicTcS, recoverTcS, wrapErrTcS, wrapWarnTcS,
30 SimplContext(..), isInteractive, simplEqsOnly, performDefaulting,
32 -- Creation of evidence variables
33 newEvVar, newCoVar, newGivenCoVar,
35 newIPVar, newDictVar, newKindConstraint,
37 -- Setting evidence variables
38 setCoBind, setIPBind, setDictBind, setEvBind,
42 getInstEnvs, getFamInstEnvs, -- Getting the environments
43 getTopEnv, getGblEnv, getTcEvBinds, getUntouchables,
44 getTcEvBindsBag, getTcSContext, getTcSTyBinds, getTcSTyBindsMap,
46 newFlattenSkolemTy, -- Flatten skolems
49 instDFunTypes, -- Instantiation
51 newFlexiTcSTy, instFlexiTcS,
57 isTouchableMetaTyVar_InRange,
59 getDefaultInfo, getDynFlags,
61 matchClass, matchFam, MatchInstResult (..),
64 pprEq -- Smaller utils, re-exported from TcM
65 -- TODO (DV): these are only really used in the
66 -- instance matcher in TcSimplify. I am wondering
67 -- if the whole instance matcher simply belongs
71 #include "HsVersions.h"
81 import qualified TcRnMonad as TcM
82 import qualified TcMType as TcM
83 import qualified TcEnv as TcM
84 ( checkWellStaged, topIdLvl, tcLookupFamInst, tcGetDefaultTys )
104 import HsBinds -- for TcEvBinds stuff
113 %************************************************************************
115 %* Canonical constraints *
117 %* These are the constraints the low-level simplifier works with *
119 %************************************************************************
122 -- Types without any type functions inside. However, note that xi
123 -- types CAN contain unexpanded type synonyms; however, the
124 -- (transitive) expansions of those type synonyms will not contain any
126 type Xi = Type -- In many comments, "xi" ranges over Xi
128 type CanonicalCts = Bag CanonicalCt
131 -- Atomic canonical constraints
132 = CDictCan { -- e.g. Num xi
134 cc_flavor :: CtFlavor,
139 | CIPCan { -- ?x::tau
140 -- See note [Canonical implicit parameter constraints].
142 cc_flavor :: CtFlavor,
143 cc_ip_nm :: IPName Name,
144 cc_ip_ty :: TcTauType
147 | CTyEqCan { -- tv ~ xi (recall xi means function free)
149 -- * tv not in tvs(xi) (occurs check)
150 -- * typeKind xi `compatKind` typeKind tv
151 -- See Note [Spontaneous solving and kind compatibility]
152 -- * We prefer unification variables on the left *JUST* for efficiency
154 cc_flavor :: CtFlavor,
159 | CFunEqCan { -- F xis ~ xi
160 -- Invariant: * isSynFamilyTyCon cc_fun
161 -- * typeKind (F xis) `compatKind` typeKind xi
163 cc_flavor :: CtFlavor,
164 cc_fun :: TyCon, -- A type function
165 cc_tyargs :: [Xi], -- Either under-saturated or exactly saturated
166 cc_rhs :: Xi -- *never* over-saturated (because if so
167 -- we should have decomposed)
171 | CFrozenErr { -- A "frozen error" does not interact with anything
172 -- See Note [Frozen Errors]
174 cc_flavor :: CtFlavor
177 mkFrozenError :: CtFlavor -> EvVar -> CanonicalCt
178 mkFrozenError fl ev = CFrozenErr { cc_id = ev, cc_flavor = fl }
180 compatKind :: Kind -> Kind -> Bool
181 compatKind k1 k2 = k1 `isSubKind` k2 || k2 `isSubKind` k1
183 deCanonicalise :: CanonicalCt -> FlavoredEvVar
184 deCanonicalise ct = mkEvVarX (cc_id ct) (cc_flavor ct)
186 tyVarsOfCanonical :: CanonicalCt -> TcTyVarSet
187 tyVarsOfCanonical (CTyEqCan { cc_tyvar = tv, cc_rhs = xi }) = extendVarSet (tyVarsOfType xi) tv
188 tyVarsOfCanonical (CFunEqCan { cc_tyargs = tys, cc_rhs = xi }) = tyVarsOfTypes (xi:tys)
189 tyVarsOfCanonical (CDictCan { cc_tyargs = tys }) = tyVarsOfTypes tys
190 tyVarsOfCanonical (CIPCan { cc_ip_ty = ty }) = tyVarsOfType ty
191 tyVarsOfCanonical (CFrozenErr { cc_id = ev }) = tyVarsOfEvVar ev
193 tyVarsOfCDict :: CanonicalCt -> TcTyVarSet
194 tyVarsOfCDict (CDictCan { cc_tyargs = tys }) = tyVarsOfTypes tys
195 tyVarsOfCDict _ct = emptyVarSet
197 tyVarsOfCDicts :: CanonicalCts -> TcTyVarSet
198 tyVarsOfCDicts = foldrBag (unionVarSet . tyVarsOfCDict) emptyVarSet
200 tyVarsOfCanonicals :: CanonicalCts -> TcTyVarSet
201 tyVarsOfCanonicals = foldrBag (unionVarSet . tyVarsOfCanonical) emptyVarSet
203 instance Outputable CanonicalCt where
204 ppr (CDictCan d fl cls tys)
205 = ppr fl <+> ppr d <+> dcolon <+> pprClassPred cls tys
206 ppr (CIPCan ip fl ip_nm ty)
207 = ppr fl <+> ppr ip <+> dcolon <+> parens (ppr ip_nm <> dcolon <> ppr ty)
208 ppr (CTyEqCan co fl tv ty)
209 = ppr fl <+> ppr co <+> dcolon <+> pprEqPred (Pair (mkTyVarTy tv) ty)
210 ppr (CFunEqCan co fl tc tys ty)
211 = ppr fl <+> ppr co <+> dcolon <+> pprEqPred (Pair (mkTyConApp tc tys) ty)
212 ppr (CFrozenErr co fl)
213 = ppr fl <+> pprEvVarWithType co
216 Note [Canonical implicit parameter constraints]
217 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
218 The type in a canonical implicit parameter constraint doesn't need to
219 be a xi (type-function-free type) since we can defer the flattening
220 until checking this type for equality with another type. If we
221 encounter two IP constraints with the same name, they MUST have the
222 same type, and at that point we can generate a flattened equality
223 constraint between the types. (On the other hand, the types in two
224 class constraints for the same class MAY be equal, so they need to be
225 flattened in the first place to facilitate comparing them.)
228 singleCCan :: CanonicalCt -> CanonicalCts
231 andCCan :: CanonicalCts -> CanonicalCts -> CanonicalCts
234 extendCCans :: CanonicalCts -> CanonicalCt -> CanonicalCts
235 extendCCans = snocBag
237 andCCans :: [CanonicalCts] -> CanonicalCts
238 andCCans = unionManyBags
240 emptyCCan :: CanonicalCts
243 isEmptyCCan :: CanonicalCts -> Bool
244 isEmptyCCan = isEmptyBag
246 isCTyEqCan :: CanonicalCt -> Bool
247 isCTyEqCan (CTyEqCan {}) = True
248 isCTyEqCan (CFunEqCan {}) = False
251 isCDictCan_Maybe :: CanonicalCt -> Maybe Class
252 isCDictCan_Maybe (CDictCan {cc_class = cls }) = Just cls
253 isCDictCan_Maybe _ = Nothing
255 isCIPCan_Maybe :: CanonicalCt -> Maybe (IPName Name)
256 isCIPCan_Maybe (CIPCan {cc_ip_nm = nm }) = Just nm
257 isCIPCan_Maybe _ = Nothing
259 isCFunEqCan_Maybe :: CanonicalCt -> Maybe TyCon
260 isCFunEqCan_Maybe (CFunEqCan { cc_fun = tc }) = Just tc
261 isCFunEqCan_Maybe _ = Nothing
263 isCFrozenErr :: CanonicalCt -> Bool
264 isCFrozenErr (CFrozenErr {}) = True
265 isCFrozenErr _ = False
268 -- A mixture of Given, Wanted, and Derived constraints.
269 -- We split between equalities and the rest to process equalities first.
270 data WorkList = WorkList { weqs :: CanonicalCts
271 -- NB: weqs includes equalities /and/ family equalities
272 , wrest :: CanonicalCts }
274 unionWorkList :: WorkList -> WorkList -> WorkList
275 unionWorkList wl1 wl2
276 = WorkList { weqs = weqs wl1 `andCCan` weqs wl2
277 , wrest = wrest wl1 `andCCan` wrest wl2 }
279 unionWorkLists :: [WorkList] -> WorkList
280 unionWorkLists = foldr unionWorkList emptyWorkList
282 isEmptyWorkList :: WorkList -> Bool
283 isEmptyWorkList wl = isEmptyCCan (weqs wl) && isEmptyCCan (wrest wl)
285 emptyWorkList :: WorkList
287 = WorkList { weqs = emptyBag, wrest = emptyBag }
289 workListFromEq :: CanonicalCt -> WorkList
290 workListFromEq = workListFromEqs . singleCCan
292 workListFromNonEq :: CanonicalCt -> WorkList
293 workListFromNonEq = workListFromNonEqs . singleCCan
295 workListFromNonEqs :: CanonicalCts -> WorkList
296 workListFromNonEqs cts
297 = WorkList { weqs = emptyCCan, wrest = cts }
299 workListFromEqs :: CanonicalCts -> WorkList
301 = WorkList { weqs = cts, wrest = emptyCCan }
303 foldrWorkListM :: (Monad m) => (CanonicalCt -> r -> m r)
304 -> r -> WorkList -> m r
305 -- Prioritizes equalities
306 foldrWorkListM on_ct r (WorkList {weqs = eqs, wrest = rest })
307 = do { r1 <- foldrBagM on_ct r eqs
308 ; foldrBagM on_ct r1 rest }
310 instance Outputable WorkList where
311 ppr wl = vcat [ text "WorkList (Equalities) = " <+> ppr (weqs wl)
312 , text "WorkList (Other) = " <+> ppr (wrest wl) ]
318 %************************************************************************
321 The "flavor" of a canonical constraint
323 %************************************************************************
326 getWantedLoc :: CanonicalCt -> WantedLoc
328 = ASSERT (isWanted (cc_flavor ct))
331 _ -> pprPanic "Can't get WantedLoc of non-wanted constraint!" empty
333 isWantedCt :: CanonicalCt -> Bool
334 isWantedCt ct = isWanted (cc_flavor ct)
335 isGivenCt :: CanonicalCt -> Bool
336 isGivenCt ct = isGiven (cc_flavor ct)
337 isDerivedCt :: CanonicalCt -> Bool
338 isDerivedCt ct = isDerived (cc_flavor ct)
340 canSolve :: CtFlavor -> CtFlavor -> Bool
341 -- canSolve ctid1 ctid2
342 -- The constraint ctid1 can be used to solve ctid2
343 -- "to solve" means a reaction where the active parts of the two constraints match.
344 -- active(F xis ~ xi) = F xis
345 -- active(tv ~ xi) = tv
346 -- active(D xis) = D xis
347 -- active(IP nm ty) = nm
349 -- NB: either (a `canSolve` b) or (b `canSolve` a) must hold
350 -----------------------------------------
351 canSolve (Given {}) _ = True
352 canSolve (Wanted {}) (Derived {}) = True
353 canSolve (Wanted {}) (Wanted {}) = True
354 canSolve (Derived {}) (Derived {}) = True -- Important: derived can't solve wanted/given
355 canSolve _ _ = False -- (There is no *evidence* for a derived.)
357 canRewrite :: CtFlavor -> CtFlavor -> Bool
358 -- canRewrite ctid1 ctid2
359 -- The *equality_constraint* ctid1 can be used to rewrite inside ctid2
360 canRewrite = canSolve
362 combineCtLoc :: CtFlavor -> CtFlavor -> WantedLoc
363 -- Precondition: At least one of them should be wanted
364 combineCtLoc (Wanted loc) _ = loc
365 combineCtLoc _ (Wanted loc) = loc
366 combineCtLoc (Derived loc ) _ = loc
367 combineCtLoc _ (Derived loc ) = loc
368 combineCtLoc _ _ = panic "combineCtLoc: both given"
370 mkGivenFlavor :: CtFlavor -> SkolemInfo -> CtFlavor
371 mkGivenFlavor (Wanted loc) sk = Given (setCtLocOrigin loc sk)
372 mkGivenFlavor (Derived loc) sk = Given (setCtLocOrigin loc sk)
373 mkGivenFlavor (Given loc) sk = Given (setCtLocOrigin loc sk)
376 mkWantedFlavor :: CtFlavor -> CtFlavor
377 mkWantedFlavor (Wanted loc) = Wanted loc
378 mkWantedFlavor (Derived loc) = Wanted loc
379 mkWantedFlavor fl@(Given {}) = pprPanic "mkWantedFlavour" (ppr fl)
382 %************************************************************************
384 %* The TcS solver monad *
386 %************************************************************************
390 The TcS monad is a weak form of the main Tc monad
394 * allocate new variables
395 * fill in evidence variables
397 Filling in a dictionary evidence variable means to create a binding
398 for it, so TcS carries a mutable location where the binding can be
399 added. This is initialised from the innermost implication constraint.
404 tcs_ev_binds :: EvBindsVar,
407 tcs_ty_binds :: IORef (TyVarEnv (TcTyVar, TcType)),
408 -- Global type bindings
410 tcs_context :: SimplContext,
412 tcs_untch :: TcsUntouchables,
414 tcs_ic_depth :: Int, -- Implication nesting depth
415 tcs_count :: IORef Int -- Global step count
418 type TcsUntouchables = (Untouchables,TcTyVarSet)
419 -- Like the TcM Untouchables,
420 -- but records extra TcsTv variables generated during simplification
421 -- See Note [Extra TcsTv untouchables] in TcSimplify
426 = SimplInfer -- Inferring type of a let-bound thing
427 | SimplRuleLhs -- Inferring type of a RULE lhs
428 | SimplInteractive -- Inferring type at GHCi prompt
429 | SimplCheck -- Checking a type signature or RULE rhs
432 instance Outputable SimplContext where
433 ppr SimplInfer = ptext (sLit "SimplInfer")
434 ppr SimplRuleLhs = ptext (sLit "SimplRuleLhs")
435 ppr SimplInteractive = ptext (sLit "SimplInteractive")
436 ppr SimplCheck = ptext (sLit "SimplCheck")
438 isInteractive :: SimplContext -> Bool
439 isInteractive SimplInteractive = True
440 isInteractive _ = False
442 simplEqsOnly :: SimplContext -> Bool
443 -- Simplify equalities only, not dictionaries
444 -- This is used for the LHS of rules; ee
445 -- Note [Simplifying RULE lhs constraints] in TcSimplify
446 simplEqsOnly SimplRuleLhs = True
447 simplEqsOnly _ = False
449 performDefaulting :: SimplContext -> Bool
450 performDefaulting SimplInfer = False
451 performDefaulting SimplRuleLhs = False
452 performDefaulting SimplInteractive = True
453 performDefaulting SimplCheck = True
456 newtype TcS a = TcS { unTcS :: TcSEnv -> TcM a }
458 instance Functor TcS where
459 fmap f m = TcS $ fmap f . unTcS m
461 instance Monad TcS where
462 return x = TcS (\_ -> return x)
463 fail err = TcS (\_ -> fail err)
464 m >>= k = TcS (\ebs -> unTcS m ebs >>= \r -> unTcS (k r) ebs)
466 -- Basic functionality
467 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
468 wrapTcS :: TcM a -> TcS a
469 -- Do not export wrapTcS, because it promotes an arbitrary TcM to TcS,
470 -- and TcS is supposed to have limited functionality
471 wrapTcS = TcS . const -- a TcM action will not use the TcEvBinds
473 wrapErrTcS :: TcM a -> TcS a
474 -- The thing wrapped should just fail
475 -- There's no static check; it's up to the user
476 -- Having a variant for each error message is too painful
479 wrapWarnTcS :: TcM a -> TcS a
480 -- The thing wrapped should just add a warning, or no-op
481 -- There's no static check; it's up to the user
482 wrapWarnTcS = wrapTcS
484 failTcS, panicTcS :: SDoc -> TcS a
485 failTcS = wrapTcS . TcM.failWith
486 panicTcS doc = pprPanic "TcCanonical" doc
488 traceTcS :: String -> SDoc -> TcS ()
489 traceTcS herald doc = TcS $ \_env -> TcM.traceTc herald doc
491 bumpStepCountTcS :: TcS ()
492 bumpStepCountTcS = TcS $ \env -> do { let ref = tcs_count env
493 ; n <- TcM.readTcRef ref
494 ; TcM.writeTcRef ref (n+1) }
496 traceFireTcS :: Int -> SDoc -> TcS ()
497 -- Dump a rule-firing trace
498 traceFireTcS depth doc
500 TcM.ifDOptM Opt_D_dump_cs_trace $
501 do { n <- TcM.readTcRef (tcs_count env)
503 <> text (replicate (tcs_ic_depth env) '>')
504 <> brackets (int depth) <+> doc
507 runTcS :: SimplContext
508 -> Untouchables -- Untouchables
509 -> TcS a -- What to run
510 -> TcM (a, Bag EvBind)
511 runTcS context untouch tcs
512 = do { ty_binds_var <- TcM.newTcRef emptyVarEnv
513 ; ev_binds_var@(EvBindsVar evb_ref _) <- TcM.newTcEvBinds
514 ; step_count <- TcM.newTcRef 0
515 ; let env = TcSEnv { tcs_ev_binds = ev_binds_var
516 , tcs_ty_binds = ty_binds_var
517 , tcs_context = context
518 , tcs_untch = (untouch, emptyVarSet) -- No Tcs untouchables yet
519 , tcs_count = step_count
523 -- Run the computation
524 ; res <- unTcS tcs env
525 -- Perform the type unifications required
526 ; ty_binds <- TcM.readTcRef ty_binds_var
527 ; mapM_ do_unification (varEnvElts ty_binds)
530 -- ; count <- TcM.readTcRef step_count
531 -- ; TcM.dumpTcRn (ptext (sLit "Constraint solver steps =") <+> int count)
534 ; ev_binds <- TcM.readTcRef evb_ref
535 ; return (res, evBindMapBinds ev_binds) }
537 do_unification (tv,ty) = TcM.writeMetaTyVar tv ty
539 nestImplicTcS :: EvBindsVar -> TcsUntouchables -> TcS a -> TcS a
540 nestImplicTcS ref (inner_range, inner_tcs) (TcS thing_inside)
541 = TcS $ \ TcSEnv { tcs_ty_binds = ty_binds
542 , tcs_untch = (_outer_range, outer_tcs)
544 , tcs_ic_depth = idepth
545 , tcs_context = ctxt } ->
547 inner_untch = (inner_range, outer_tcs `unionVarSet` inner_tcs)
548 -- The inner_range should be narrower than the outer one
549 -- (thus increasing the set of untouchables) but
550 -- the inner Tcs-untouchables must be unioned with the
552 nest_env = TcSEnv { tcs_ev_binds = ref
553 , tcs_ty_binds = ty_binds
554 , tcs_untch = inner_untch
556 , tcs_ic_depth = idepth+1
557 , tcs_context = ctxtUnderImplic ctxt }
559 thing_inside nest_env
561 recoverTcS :: TcS a -> TcS a -> TcS a
562 recoverTcS (TcS recovery_code) (TcS thing_inside)
564 TcM.recoverM (recovery_code env) (thing_inside env)
566 ctxtUnderImplic :: SimplContext -> SimplContext
567 -- See Note [Simplifying RULE lhs constraints] in TcSimplify
568 ctxtUnderImplic SimplRuleLhs = SimplCheck
569 ctxtUnderImplic ctxt = ctxt
571 tryTcS :: TcS a -> TcS a
572 -- Like runTcS, but from within the TcS monad
573 -- Ignore all the evidence generated, and do not affect caller's evidence!
575 = TcS (\env -> do { ty_binds_var <- TcM.newTcRef emptyVarEnv
576 ; ev_binds_var <- TcM.newTcEvBinds
577 ; let env1 = env { tcs_ev_binds = ev_binds_var
578 , tcs_ty_binds = ty_binds_var }
582 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
584 getDynFlags :: TcS DynFlags
585 getDynFlags = wrapTcS TcM.getDOpts
587 getTcSContext :: TcS SimplContext
588 getTcSContext = TcS (return . tcs_context)
590 getTcEvBinds :: TcS EvBindsVar
591 getTcEvBinds = TcS (return . tcs_ev_binds)
593 getUntouchables :: TcS TcsUntouchables
594 getUntouchables = TcS (return . tcs_untch)
596 getTcSTyBinds :: TcS (IORef (TyVarEnv (TcTyVar, TcType)))
597 getTcSTyBinds = TcS (return . tcs_ty_binds)
599 getTcSTyBindsMap :: TcS (TyVarEnv (TcTyVar, TcType))
600 getTcSTyBindsMap = getTcSTyBinds >>= wrapTcS . (TcM.readTcRef)
603 getTcEvBindsBag :: TcS EvBindMap
605 = do { EvBindsVar ev_ref _ <- getTcEvBinds
606 ; wrapTcS $ TcM.readTcRef ev_ref }
608 setCoBind :: CoVar -> Coercion -> TcS ()
609 setCoBind cv co = setEvBind cv (EvCoercion co)
611 setWantedTyBind :: TcTyVar -> TcType -> TcS ()
612 -- Add a type binding
613 -- We never do this twice!
614 setWantedTyBind tv ty
615 = do { ref <- getTcSTyBinds
617 do { ty_binds <- TcM.readTcRef ref
619 ; TcM.checkErr (not (tv `elemVarEnv` ty_binds)) $
620 vcat [ text "TERRIBLE ERROR: double set of meta type variable"
621 , ppr tv <+> text ":=" <+> ppr ty
622 , text "Old value =" <+> ppr (lookupVarEnv_NF ty_binds tv)]
624 ; TcM.writeTcRef ref (extendVarEnv ty_binds tv (tv,ty)) } }
626 setIPBind :: EvVar -> EvTerm -> TcS ()
627 setIPBind = setEvBind
629 setDictBind :: EvVar -> EvTerm -> TcS ()
630 setDictBind = setEvBind
632 setEvBind :: EvVar -> EvTerm -> TcS ()
635 = do { tc_evbinds <- getTcEvBinds
636 ; wrapTcS (TcM.addTcEvBind tc_evbinds ev rhs) }
638 warnTcS :: CtLoc orig -> Bool -> SDoc -> TcS ()
639 warnTcS loc warn_if doc
640 | warn_if = wrapTcS $ TcM.setCtLoc loc $ TcM.addWarnTc doc
641 | otherwise = return ()
643 getDefaultInfo :: TcS (SimplContext, [Type], (Bool, Bool))
645 = do { ctxt <- getTcSContext
646 ; (tys, flags) <- wrapTcS (TcM.tcGetDefaultTys (isInteractive ctxt))
647 ; return (ctxt, tys, flags) }
649 -- Just get some environments needed for instance looking up and matching
650 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
652 getInstEnvs :: TcS (InstEnv, InstEnv)
653 getInstEnvs = wrapTcS $ Inst.tcGetInstEnvs
655 getFamInstEnvs :: TcS (FamInstEnv, FamInstEnv)
656 getFamInstEnvs = wrapTcS $ FamInst.tcGetFamInstEnvs
658 getTopEnv :: TcS HscEnv
659 getTopEnv = wrapTcS $ TcM.getTopEnv
661 getGblEnv :: TcS TcGblEnv
662 getGblEnv = wrapTcS $ TcM.getGblEnv
664 -- Various smaller utilities [TODO, maybe will be absorbed in the instance matcher]
665 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
667 checkWellStagedDFun :: PredType -> DFunId -> WantedLoc -> TcS ()
668 checkWellStagedDFun pred dfun_id loc
669 = wrapTcS $ TcM.setCtLoc loc $
670 do { use_stage <- TcM.getStage
671 ; TcM.checkWellStaged pp_thing bind_lvl (thLevel use_stage) }
673 pp_thing = ptext (sLit "instance for") <+> quotes (ppr pred)
674 bind_lvl = TcM.topIdLvl dfun_id
676 pprEq :: TcType -> TcType -> SDoc
677 pprEq ty1 ty2 = pprPredTy $ mkEqPred (ty1,ty2)
679 isTouchableMetaTyVar :: TcTyVar -> TcS Bool
680 isTouchableMetaTyVar tv
681 = do { untch <- getUntouchables
682 ; return $ isTouchableMetaTyVar_InRange untch tv }
684 isTouchableMetaTyVar_InRange :: TcsUntouchables -> TcTyVar -> Bool
685 isTouchableMetaTyVar_InRange (untch,untch_tcs) tv
686 = case tcTyVarDetails tv of
687 MetaTv TcsTv _ -> not (tv `elemVarSet` untch_tcs)
688 -- See Note [Touchable meta type variables]
689 MetaTv {} -> inTouchableRange untch tv
696 Note [Touchable meta type variables]
697 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
698 Meta type variables allocated *by the constraint solver itself* are always
700 instance C a b => D [a] where...
701 if we use this instance declaration we "make up" a fresh meta type
702 variable for 'b', which we must later guess. (Perhaps C has a
703 functional dependency.) But since we aren't in the constraint *generator*
704 we can't allocate a Unique in the touchable range for this implication
705 constraint. Instead, we mark it as a "TcsTv", which makes it always-touchable.
710 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
712 newFlattenSkolemTy :: TcType -> TcS TcType
713 newFlattenSkolemTy ty = mkTyVarTy <$> newFlattenSkolemTyVar ty
715 newFlattenSkolemTyVar :: TcType -> TcS TcTyVar
716 newFlattenSkolemTyVar ty
717 = do { tv <- wrapTcS $ do { uniq <- TcM.newUnique
718 ; let name = TcM.mkTcTyVarName uniq (fsLit "f")
719 ; return $ mkTcTyVar name (typeKind ty) (FlatSkol ty) }
720 ; traceTcS "New Flatten Skolem Born" $
721 (ppr tv <+> text "[:= " <+> ppr ty <+> text "]")
725 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
727 instDFunTypes :: [Either TyVar TcType] -> TcS [TcType]
728 instDFunTypes mb_inst_tys
729 = mapM inst_tv mb_inst_tys
731 inst_tv :: Either TyVar TcType -> TcS Type
732 inst_tv (Left tv) = mkTyVarTy <$> instFlexiTcS tv
733 inst_tv (Right ty) = return ty
735 instDFunConstraints :: TcThetaType -> TcS [EvVar]
736 instDFunConstraints preds = wrapTcS $ TcM.newWantedEvVars preds
739 instFlexiTcS :: TyVar -> TcS TcTyVar
740 -- Like TcM.instMetaTyVar but the variable that is created is always
741 -- touchable; we are supposed to guess its instantiation.
742 -- See Note [Touchable meta type variables]
743 instFlexiTcS tv = instFlexiTcSHelper (tyVarName tv) (tyVarKind tv)
745 newFlexiTcSTy :: Kind -> TcS TcType
748 do { uniq <- TcM.newUnique
749 ; ref <- TcM.newMutVar Flexi
750 ; let name = TcM.mkTcTyVarName uniq (fsLit "uf")
751 ; return $ mkTyVarTy (mkTcTyVar name knd (MetaTv TcsTv ref)) }
753 isFlexiTcsTv :: TyVar -> Bool
755 | not (isTcTyVar tv) = False
756 | MetaTv TcsTv _ <- tcTyVarDetails tv = True
759 newKindConstraint :: TcTyVar -> Kind -> TcS CoVar
760 -- Create new wanted CoVar that constrains the type to have the specified kind.
761 newKindConstraint tv knd
762 = do { tv_k <- instFlexiTcSHelper (tyVarName tv) knd
763 ; let ty_k = mkTyVarTy tv_k
764 ; co_var <- newCoVar (mkTyVarTy tv) ty_k
767 instFlexiTcSHelper :: Name -> Kind -> TcS TcTyVar
768 instFlexiTcSHelper tvname tvkind
770 do { uniq <- TcM.newUnique
771 ; ref <- TcM.newMutVar Flexi
772 ; let name = setNameUnique tvname uniq
774 ; return (mkTcTyVar name kind (MetaTv TcsTv ref)) }
776 -- Superclasses and recursive dictionaries
777 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
779 newEvVar :: TcPredType -> TcS EvVar
780 newEvVar pty = wrapTcS $ TcM.newEvVar pty
782 newDerivedId :: TcPredType -> TcS EvVar
783 newDerivedId pty = wrapTcS $ TcM.newEvVar pty
785 newGivenCoVar :: TcType -> TcType -> Coercion -> TcS EvVar
786 -- Note we create immutable variables for given or derived, since we
787 -- must bind them to TcEvBinds (because their evidence may involve
788 -- superclasses). However we should be able to override existing
789 -- 'derived' evidence, even in TcEvBinds
790 newGivenCoVar ty1 ty2 co
791 = do { cv <- newCoVar ty1 ty2
792 ; setEvBind cv (EvCoercion co)
795 newCoVar :: TcType -> TcType -> TcS EvVar
796 newCoVar ty1 ty2 = wrapTcS $ TcM.newCoVar ty1 ty2
798 newIPVar :: IPName Name -> TcType -> TcS EvVar
799 newIPVar nm ty = wrapTcS $ TcM.newIP nm ty
801 newDictVar :: Class -> [TcType] -> TcS EvVar
802 newDictVar cl tys = wrapTcS $ TcM.newDict cl tys
807 -- Matching and looking up classes and family instances
808 -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
810 data MatchInstResult mi
811 = MatchInstNo -- No matching instance
812 | MatchInstSingle mi -- Single matching instance
813 | MatchInstMany -- Multiple matching instances
816 matchClass :: Class -> [Type] -> TcS (MatchInstResult (DFunId, [Either TyVar TcType]))
817 -- Look up a class constraint in the instance environment
819 = do { let pred = mkClassPred clas tys
820 ; instEnvs <- getInstEnvs
821 ; case lookupInstEnv instEnvs clas tys of {
822 ([], unifs) -- Nothing matches
823 -> do { traceTcS "matchClass not matching"
824 (vcat [ text "dict" <+> ppr pred,
825 text "unifs" <+> ppr unifs ])
828 ([(ispec, inst_tys)], []) -- A single match
829 -> do { let dfun_id = is_dfun ispec
830 ; traceTcS "matchClass success"
831 (vcat [text "dict" <+> ppr pred,
832 text "witness" <+> ppr dfun_id
833 <+> ppr (idType dfun_id) ])
834 -- Record that this dfun is needed
835 ; return $ MatchInstSingle (dfun_id, inst_tys)
837 (matches, unifs) -- More than one matches
838 -> do { traceTcS "matchClass multiple matches, deferring choice"
839 (vcat [text "dict" <+> ppr pred,
840 text "matches" <+> ppr matches,
841 text "unifs" <+> ppr unifs])
842 ; return MatchInstMany
849 -> TcS (MatchInstResult (TyCon, [Type]))
851 = do { mb <- wrapTcS $ TcM.tcLookupFamInst tycon args
853 Nothing -> return MatchInstNo
854 Just res -> return $ MatchInstSingle res
855 -- DV: We never return MatchInstMany, since tcLookupFamInst never returns
856 -- multiple matches. Check.