{-# LANGUAGE CPP #-}
module GHC.Tc.Solver(
simplifyInfer, InferMode(..),
growThetaTyVars,
simplifyAmbiguityCheck,
simplifyDefault,
simplifyTop, simplifyTopImplic,
simplifyInteractive,
solveEqualities, solveLocalEqualities, solveLocalEqualitiesX,
simplifyWantedsTcM,
tcCheckSatisfiability,
tcNormalise,
captureTopConstraints,
simpl_top,
promoteTyVarSet, emitFlatConstraints,
solveWanteds, solveWantedsAndDrop,
approximateWC, runTcSDeriveds
) where
#include "HsVersions.h"
import GHC.Prelude
import GHC.Data.Bag
import GHC.Core.Class ( Class, classKey, classTyCon )
import GHC.Driver.Session
import GHC.Types.Id ( idType )
import GHC.Tc.Utils.Instantiate
import GHC.Data.List.SetOps
import GHC.Types.Name
import GHC.Utils.Outputable
import GHC.Builtin.Utils
import GHC.Builtin.Names
import GHC.Tc.Errors
import GHC.Tc.Types.Evidence
import GHC.Tc.Solver.Interact
import GHC.Tc.Solver.Canonical ( makeSuperClasses, solveCallStack )
import GHC.Tc.Solver.Flatten ( flattenType )
import GHC.Tc.Utils.TcMType as TcM
import GHC.Tc.Utils.Monad as TcM
import GHC.Tc.Solver.Monad as TcS
import GHC.Tc.Types.Constraint
import GHC.Core.Predicate
import GHC.Tc.Types.Origin
import GHC.Tc.Utils.TcType
import GHC.Core.Type
import GHC.Builtin.Types ( liftedRepTy, manyDataConTy )
import GHC.Core.Unify ( tcMatchTyKi )
import GHC.Utils.Misc
import GHC.Types.Var
import GHC.Types.Var.Set
import GHC.Types.Basic ( IntWithInf, intGtLimit )
import GHC.Utils.Error ( emptyMessages )
import qualified GHC.LanguageExtensions as LangExt
import Control.Monad
import Data.Foldable ( toList )
import Data.List ( partition )
import Data.List.NonEmpty ( NonEmpty(..) )
captureTopConstraints :: TcM a -> TcM (a, WantedConstraints)
captureTopConstraints :: forall a. TcM a -> TcM (a, WantedConstraints)
captureTopConstraints TcM a
thing_inside
= do { TcRef WantedConstraints
static_wc_var <- WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv (TcRef WantedConstraints)
forall a gbl lcl. a -> TcRnIf gbl lcl (TcRef a)
TcM.newTcRef WantedConstraints
emptyWC ;
; (Maybe a
mb_res, WantedConstraints
lie) <- (TcGblEnv -> TcGblEnv)
-> TcRnIf TcGblEnv TcLclEnv (Maybe a, WantedConstraints)
-> TcRnIf TcGblEnv TcLclEnv (Maybe a, WantedConstraints)
forall gbl lcl a.
(gbl -> gbl) -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
TcM.updGblEnv (\TcGblEnv
env -> TcGblEnv
env { tcg_static_wc :: TcRef WantedConstraints
tcg_static_wc = TcRef WantedConstraints
static_wc_var } ) (TcRnIf TcGblEnv TcLclEnv (Maybe a, WantedConstraints)
-> TcRnIf TcGblEnv TcLclEnv (Maybe a, WantedConstraints))
-> TcRnIf TcGblEnv TcLclEnv (Maybe a, WantedConstraints)
-> TcRnIf TcGblEnv TcLclEnv (Maybe a, WantedConstraints)
forall a b. (a -> b) -> a -> b
$
TcM a -> TcRnIf TcGblEnv TcLclEnv (Maybe a, WantedConstraints)
forall a. TcM a -> TcM (Maybe a, WantedConstraints)
TcM.tryCaptureConstraints TcM a
thing_inside
; WantedConstraints
stWC <- TcRef WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a gbl lcl. TcRef a -> TcRnIf gbl lcl a
TcM.readTcRef TcRef WantedConstraints
static_wc_var
; case Maybe a
mb_res of
Just a
res -> (a, WantedConstraints) -> TcM (a, WantedConstraints)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
res, WantedConstraints
lie WantedConstraints -> WantedConstraints -> WantedConstraints
`andWC` WantedConstraints
stWC)
Maybe a
Nothing -> do { Bag EvBind
_ <- WantedConstraints -> TcM (Bag EvBind)
simplifyTop WantedConstraints
lie; TcM (a, WantedConstraints)
forall env a. IOEnv env a
failM } }
simplifyTopImplic :: Bag Implication -> TcM ()
simplifyTopImplic :: Bag Implication -> TcM ()
simplifyTopImplic Bag Implication
implics
= do { Bag EvBind
empty_binds <- WantedConstraints -> TcM (Bag EvBind)
simplifyTop (Bag Implication -> WantedConstraints
mkImplicWC Bag Implication
implics)
; MASSERT2( isEmptyBag empty_binds, ppr empty_binds )
; () -> TcM ()
forall (m :: * -> *) a. Monad m => a -> m a
return () }
simplifyTop :: WantedConstraints -> TcM (Bag EvBind)
simplifyTop :: WantedConstraints -> TcM (Bag EvBind)
simplifyTop WantedConstraints
wanteds
= do { String -> SDoc -> TcM ()
traceTc String
"simplifyTop {" (SDoc -> TcM ()) -> SDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"wanted = " SDoc -> SDoc -> SDoc
<+> WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanteds
; ((WantedConstraints
final_wc, Cts
unsafe_ol), EvBindMap
binds1) <- TcS (WantedConstraints, Cts)
-> TcM ((WantedConstraints, Cts), EvBindMap)
forall a. TcS a -> TcM (a, EvBindMap)
runTcS (TcS (WantedConstraints, Cts)
-> TcM ((WantedConstraints, Cts), EvBindMap))
-> TcS (WantedConstraints, Cts)
-> TcM ((WantedConstraints, Cts), EvBindMap)
forall a b. (a -> b) -> a -> b
$
do { WantedConstraints
final_wc <- WantedConstraints -> TcS WantedConstraints
simpl_top WantedConstraints
wanteds
; Cts
unsafe_ol <- TcS Cts
getSafeOverlapFailures
; (WantedConstraints, Cts) -> TcS (WantedConstraints, Cts)
forall (m :: * -> *) a. Monad m => a -> m a
return (WantedConstraints
final_wc, Cts
unsafe_ol) }
; String -> SDoc -> TcM ()
traceTc String
"End simplifyTop }" SDoc
empty
; Bag EvBind
binds2 <- WantedConstraints -> TcM (Bag EvBind)
reportUnsolved WantedConstraints
final_wc
; String -> SDoc -> TcM ()
traceTc String
"reportUnsolved (unsafe overlapping) {" SDoc
empty
; Bool -> TcM () -> TcM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Cts -> Bool
isEmptyCts Cts
unsafe_ol) (TcM () -> TcM ()) -> TcM () -> TcM ()
forall a b. (a -> b) -> a -> b
$ do {
; TcRef Messages
errs_var <- TcRn (TcRef Messages)
getErrsVar
; Messages
saved_msg <- TcRef Messages -> TcRnIf TcGblEnv TcLclEnv Messages
forall a gbl lcl. TcRef a -> TcRnIf gbl lcl a
TcM.readTcRef TcRef Messages
errs_var
; TcRef Messages -> Messages -> TcM ()
forall a gbl lcl. TcRef a -> a -> TcRnIf gbl lcl ()
TcM.writeTcRef TcRef Messages
errs_var Messages
emptyMessages
; WantedConstraints -> TcM ()
warnAllUnsolved (WantedConstraints -> TcM ()) -> WantedConstraints -> TcM ()
forall a b. (a -> b) -> a -> b
$ WantedConstraints
emptyWC { wc_simple :: Cts
wc_simple = Cts
unsafe_ol }
; WarningMessages
whyUnsafe <- Messages -> WarningMessages
forall a b. (a, b) -> a
fst (Messages -> WarningMessages)
-> TcRnIf TcGblEnv TcLclEnv Messages
-> IOEnv (Env TcGblEnv TcLclEnv) WarningMessages
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TcRef Messages -> TcRnIf TcGblEnv TcLclEnv Messages
forall a gbl lcl. TcRef a -> TcRnIf gbl lcl a
TcM.readTcRef TcRef Messages
errs_var
; TcRef Messages -> Messages -> TcM ()
forall a gbl lcl. TcRef a -> a -> TcRnIf gbl lcl ()
TcM.writeTcRef TcRef Messages
errs_var Messages
saved_msg
; WarningMessages -> TcM ()
recordUnsafeInfer WarningMessages
whyUnsafe
}
; String -> SDoc -> TcM ()
traceTc String
"reportUnsolved (unsafe overlapping) }" SDoc
empty
; Bag EvBind -> TcM (Bag EvBind)
forall (m :: * -> *) a. Monad m => a -> m a
return (EvBindMap -> Bag EvBind
evBindMapBinds EvBindMap
binds1 Bag EvBind -> Bag EvBind -> Bag EvBind
forall a. Bag a -> Bag a -> Bag a
`unionBags` Bag EvBind
binds2) }
solveLocalEqualities :: String -> TcM a -> TcM a
solveLocalEqualities :: forall a. String -> TcM a -> TcM a
solveLocalEqualities String
callsite TcM a
thing_inside
= do { (WantedConstraints
wanted, a
res) <- String -> TcM a -> TcM (WantedConstraints, a)
forall a. String -> TcM a -> TcM (WantedConstraints, a)
solveLocalEqualitiesX String
callsite TcM a
thing_inside
; WantedConstraints -> TcM ()
emitFlatConstraints WantedConstraints
wanted
; a -> TcM a
forall (m :: * -> *) a. Monad m => a -> m a
return a
res }
emitFlatConstraints :: WantedConstraints -> TcM ()
emitFlatConstraints :: WantedConstraints -> TcM ()
emitFlatConstraints WantedConstraints
wanted
= do { WantedConstraints
wanted <- WantedConstraints -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
TcM.zonkWC WantedConstraints
wanted
; case WantedConstraints -> Maybe (Cts, Bag Hole)
floatKindEqualities WantedConstraints
wanted of
Maybe (Cts, Bag Hole)
Nothing -> do { String -> SDoc -> TcM ()
traceTc String
"emitFlatConstraints: failing" (WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanted)
; WantedConstraints -> TcM ()
emitConstraints WantedConstraints
wanted
; TcM ()
forall env a. IOEnv env a
failM }
Just (Cts
simples, Bag Hole
holes)
-> do { Bool
_ <- VarSet -> TcM Bool
promoteTyVarSet (Cts -> VarSet
tyCoVarsOfCts Cts
simples)
; String -> SDoc -> TcM ()
traceTc String
"emitFlatConstraints:" (SDoc -> TcM ()) -> SDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"simples:" SDoc -> SDoc -> SDoc
<+> Cts -> SDoc
forall a. Outputable a => a -> SDoc
ppr Cts
simples
, String -> SDoc
text String
"holes: " SDoc -> SDoc -> SDoc
<+> Bag Hole -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bag Hole
holes ]
; Bag Hole -> TcM ()
emitHoles Bag Hole
holes
; Cts -> TcM ()
emitSimples Cts
simples } }
floatKindEqualities :: WantedConstraints -> Maybe (Bag Ct, Bag Hole)
floatKindEqualities :: WantedConstraints -> Maybe (Cts, Bag Hole)
floatKindEqualities WantedConstraints
wc = VarSet -> WantedConstraints -> Maybe (Cts, Bag Hole)
float_wc VarSet
emptyVarSet WantedConstraints
wc
where
float_wc :: TcTyCoVarSet -> WantedConstraints -> Maybe (Bag Ct, Bag Hole)
float_wc :: VarSet -> WantedConstraints -> Maybe (Cts, Bag Hole)
float_wc VarSet
trapping_tvs (WC { wc_simple :: WantedConstraints -> Cts
wc_simple = Cts
simples
, wc_impl :: WantedConstraints -> Bag Implication
wc_impl = Bag Implication
implics
, wc_holes :: WantedConstraints -> Bag Hole
wc_holes = Bag Hole
holes })
| (Ct -> Bool) -> Cts -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Ct -> Bool
is_floatable Cts
simples
= do { (Cts
inner_simples, Bag Hole
inner_holes)
<- (Implication -> Maybe (Cts, Bag Hole))
-> Bag Implication -> Maybe (Cts, Bag Hole)
forall (m :: * -> *) a b c.
Monad m =>
(a -> m (Bag b, Bag c)) -> Bag a -> m (Bag b, Bag c)
flatMapBagPairM (VarSet -> Implication -> Maybe (Cts, Bag Hole)
float_implic VarSet
trapping_tvs) Bag Implication
implics
; (Cts, Bag Hole) -> Maybe (Cts, Bag Hole)
forall (m :: * -> *) a. Monad m => a -> m a
return ( Cts
simples Cts -> Cts -> Cts
forall a. Bag a -> Bag a -> Bag a
`unionBags` Cts
inner_simples
, Bag Hole
holes Bag Hole -> Bag Hole -> Bag Hole
forall a. Bag a -> Bag a -> Bag a
`unionBags` Bag Hole
inner_holes) }
| Bool
otherwise
= Maybe (Cts, Bag Hole)
forall a. Maybe a
Nothing
where
is_floatable :: Ct -> Bool
is_floatable Ct
ct
| Ct -> Bool
insolubleEqCt Ct
ct = Bool
False
| Bool
otherwise = Ct -> VarSet
tyCoVarsOfCt Ct
ct VarSet -> VarSet -> Bool
`disjointVarSet` VarSet
trapping_tvs
float_implic :: TcTyCoVarSet -> Implication -> Maybe (Bag Ct, Bag Hole)
float_implic :: VarSet -> Implication -> Maybe (Cts, Bag Hole)
float_implic VarSet
trapping_tvs (Implic { ic_wanted :: Implication -> WantedConstraints
ic_wanted = WantedConstraints
wanted, ic_no_eqs :: Implication -> Bool
ic_no_eqs = Bool
no_eqs
, ic_skols :: Implication -> [TcTyVar]
ic_skols = [TcTyVar]
skols, ic_status :: Implication -> ImplicStatus
ic_status = ImplicStatus
status })
| ImplicStatus -> Bool
isInsolubleStatus ImplicStatus
status
= Maybe (Cts, Bag Hole)
forall a. Maybe a
Nothing
| Bool
otherwise
= do { (Cts
simples, Bag Hole
holes) <- VarSet -> WantedConstraints -> Maybe (Cts, Bag Hole)
float_wc VarSet
new_trapping_tvs WantedConstraints
wanted
; Bool -> Maybe () -> Maybe ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool -> Bool
not (Cts -> Bool
forall a. Bag a -> Bool
isEmptyBag Cts
simples) Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
no_eqs) (Maybe () -> Maybe ()) -> Maybe () -> Maybe ()
forall a b. (a -> b) -> a -> b
$
Maybe ()
forall a. Maybe a
Nothing
; (Cts, Bag Hole) -> Maybe (Cts, Bag Hole)
forall (m :: * -> *) a. Monad m => a -> m a
return (Cts
simples, Bag Hole
holes) }
where
new_trapping_tvs :: VarSet
new_trapping_tvs = VarSet
trapping_tvs VarSet -> [TcTyVar] -> VarSet
`extendVarSetList` [TcTyVar]
skols
solveLocalEqualitiesX :: String -> TcM a -> TcM (WantedConstraints, a)
solveLocalEqualitiesX :: forall a. String -> TcM a -> TcM (WantedConstraints, a)
solveLocalEqualitiesX String
callsite TcM a
thing_inside
= do { String -> SDoc -> TcM ()
traceTc String
"solveLocalEqualitiesX {" ([SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Called from" SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
callsite ])
; (a
result, WantedConstraints
wanted) <- TcM a -> TcM (a, WantedConstraints)
forall a. TcM a -> TcM (a, WantedConstraints)
captureConstraints TcM a
thing_inside
; String -> SDoc -> TcM ()
traceTc String
"solveLocalEqualities: running solver" (WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanted)
; WantedConstraints
residual_wanted <- TcS WantedConstraints -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a. TcS a -> TcM a
runTcSEqualities (WantedConstraints -> TcS WantedConstraints
solveWanteds WantedConstraints
wanted)
; String -> SDoc -> TcM ()
traceTc String
"solveLocalEqualitiesX end }" (SDoc -> TcM ()) -> SDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
"residual_wanted =" SDoc -> SDoc -> SDoc
<+> WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
residual_wanted
; (WantedConstraints, a) -> TcM (WantedConstraints, a)
forall (m :: * -> *) a. Monad m => a -> m a
return (WantedConstraints
residual_wanted, a
result) }
solveEqualities :: TcM a -> TcM a
solveEqualities :: forall a. TcM a -> TcM a
solveEqualities TcM a
thing_inside
= TcM a -> TcM a
forall a. TcM a -> TcM a
checkNoErrs (TcM a -> TcM a) -> TcM a -> TcM a
forall a b. (a -> b) -> a -> b
$
do { TcLevel
lvl <- TcM TcLevel
TcM.getTcLevel
; String -> SDoc -> TcM ()
traceTc String
"solveEqualities {" (String -> SDoc
text String
"level =" SDoc -> SDoc -> SDoc
<+> TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
lvl)
; (a
result, WantedConstraints
wanted) <- TcM a -> TcM (a, WantedConstraints)
forall a. TcM a -> TcM (a, WantedConstraints)
captureConstraints TcM a
thing_inside
; String -> SDoc -> TcM ()
traceTc String
"solveEqualities: running solver" (SDoc -> TcM ()) -> SDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"wanted = " SDoc -> SDoc -> SDoc
<+> WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanted
; WantedConstraints
final_wc <- TcS WantedConstraints -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a. TcS a -> TcM a
runTcSEqualities (TcS WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints)
-> TcS WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a b. (a -> b) -> a -> b
$ WantedConstraints -> TcS WantedConstraints
simpl_top WantedConstraints
wanted
; String -> SDoc -> TcM ()
traceTc String
"End solveEqualities }" SDoc
empty
; WantedConstraints -> TcM ()
reportAllUnsolved WantedConstraints
final_wc
; a -> TcM a
forall (m :: * -> *) a. Monad m => a -> m a
return a
result }
simpl_top :: WantedConstraints -> TcS WantedConstraints
simpl_top :: WantedConstraints -> TcS WantedConstraints
simpl_top WantedConstraints
wanteds
= do { WantedConstraints
wc_first_go <- TcS WantedConstraints -> TcS WantedConstraints
forall a. TcS a -> TcS a
nestTcS (WantedConstraints -> TcS WantedConstraints
solveWantedsAndDrop WantedConstraints
wanteds)
; DynFlags
dflags <- TcS DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; DynFlags -> WantedConstraints -> TcS WantedConstraints
try_tyvar_defaulting DynFlags
dflags WantedConstraints
wc_first_go }
where
try_tyvar_defaulting :: DynFlags -> WantedConstraints -> TcS WantedConstraints
try_tyvar_defaulting :: DynFlags -> WantedConstraints -> TcS WantedConstraints
try_tyvar_defaulting DynFlags
dflags WantedConstraints
wc
| WantedConstraints -> Bool
isEmptyWC WantedConstraints
wc
= WantedConstraints -> TcS WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return WantedConstraints
wc
| WantedConstraints -> Bool
insolubleWC WantedConstraints
wc
, GeneralFlag -> DynFlags -> Bool
gopt GeneralFlag
Opt_PrintExplicitRuntimeReps DynFlags
dflags
= WantedConstraints -> TcS WantedConstraints
try_class_defaulting WantedConstraints
wc
| Bool
otherwise
= do { [TcTyVar]
free_tvs <- [TcTyVar] -> TcS [TcTyVar]
TcS.zonkTyCoVarsAndFVList (WantedConstraints -> [TcTyVar]
tyCoVarsOfWCList WantedConstraints
wc)
; let meta_tvs :: [TcTyVar]
meta_tvs = (TcTyVar -> Bool) -> [TcTyVar] -> [TcTyVar]
forall a. (a -> Bool) -> [a] -> [a]
filter (TcTyVar -> Bool
isTyVar (TcTyVar -> Bool) -> (TcTyVar -> Bool) -> TcTyVar -> Bool
forall (f :: * -> *). Applicative f => f Bool -> f Bool -> f Bool
<&&> TcTyVar -> Bool
isMetaTyVar) [TcTyVar]
free_tvs
; [Bool]
defaulted <- (TcTyVar -> TcS Bool) -> [TcTyVar] -> TcS [Bool]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM TcTyVar -> TcS Bool
defaultTyVarTcS [TcTyVar]
meta_tvs
; if [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [Bool]
defaulted
then do { WantedConstraints
wc_residual <- TcS WantedConstraints -> TcS WantedConstraints
forall a. TcS a -> TcS a
nestTcS (WantedConstraints -> TcS WantedConstraints
solveWanteds WantedConstraints
wc)
; WantedConstraints -> TcS WantedConstraints
try_class_defaulting WantedConstraints
wc_residual }
else WantedConstraints -> TcS WantedConstraints
try_class_defaulting WantedConstraints
wc }
try_class_defaulting :: WantedConstraints -> TcS WantedConstraints
try_class_defaulting :: WantedConstraints -> TcS WantedConstraints
try_class_defaulting WantedConstraints
wc
| WantedConstraints -> Bool
isEmptyWC WantedConstraints
wc Bool -> Bool -> Bool
|| WantedConstraints -> Bool
insolubleWC WantedConstraints
wc
= WantedConstraints -> TcS WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return WantedConstraints
wc
| Bool
otherwise
= do { Bool
something_happened <- WantedConstraints -> TcS Bool
applyDefaultingRules WantedConstraints
wc
; if Bool
something_happened
then do { WantedConstraints
wc_residual <- TcS WantedConstraints -> TcS WantedConstraints
forall a. TcS a -> TcS a
nestTcS (WantedConstraints -> TcS WantedConstraints
solveWantedsAndDrop WantedConstraints
wc)
; WantedConstraints -> TcS WantedConstraints
try_class_defaulting WantedConstraints
wc_residual }
else WantedConstraints -> TcS WantedConstraints
try_callstack_defaulting WantedConstraints
wc }
try_callstack_defaulting :: WantedConstraints -> TcS WantedConstraints
try_callstack_defaulting :: WantedConstraints -> TcS WantedConstraints
try_callstack_defaulting WantedConstraints
wc
| WantedConstraints -> Bool
isEmptyWC WantedConstraints
wc
= WantedConstraints -> TcS WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return WantedConstraints
wc
| Bool
otherwise
= WantedConstraints -> TcS WantedConstraints
defaultCallStacks WantedConstraints
wc
defaultCallStacks :: WantedConstraints -> TcS WantedConstraints
defaultCallStacks :: WantedConstraints -> TcS WantedConstraints
defaultCallStacks WantedConstraints
wanteds
= do Cts
simples <- Cts -> TcS Cts
handle_simples (WantedConstraints -> Cts
wc_simple WantedConstraints
wanteds)
Bag (Maybe Implication)
mb_implics <- (Implication -> TcS (Maybe Implication))
-> Bag Implication -> TcS (Bag (Maybe Implication))
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Bag a -> m (Bag b)
mapBagM Implication -> TcS (Maybe Implication)
handle_implic (WantedConstraints -> Bag Implication
wc_impl WantedConstraints
wanteds)
WantedConstraints -> TcS WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return (WantedConstraints
wanteds { wc_simple :: Cts
wc_simple = Cts
simples
, wc_impl :: Bag Implication
wc_impl = Bag (Maybe Implication) -> Bag Implication
forall a. Bag (Maybe a) -> Bag a
catBagMaybes Bag (Maybe Implication)
mb_implics })
where
handle_simples :: Cts -> TcS Cts
handle_simples Cts
simples
= Bag (Maybe Ct) -> Cts
forall a. Bag (Maybe a) -> Bag a
catBagMaybes (Bag (Maybe Ct) -> Cts) -> TcS (Bag (Maybe Ct)) -> TcS Cts
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Ct -> TcS (Maybe Ct)) -> Cts -> TcS (Bag (Maybe Ct))
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Bag a -> m (Bag b)
mapBagM Ct -> TcS (Maybe Ct)
defaultCallStack Cts
simples
handle_implic :: Implication -> TcS (Maybe Implication)
handle_implic :: Implication -> TcS (Maybe Implication)
handle_implic Implication
implic
| ImplicStatus -> Bool
isSolvedStatus (Implication -> ImplicStatus
ic_status Implication
implic)
= Maybe Implication -> TcS (Maybe Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (Implication -> Maybe Implication
forall a. a -> Maybe a
Just Implication
implic)
| Bool
otherwise
= do { WantedConstraints
wanteds <- EvBindsVar -> TcS WantedConstraints -> TcS WantedConstraints
forall a. EvBindsVar -> TcS a -> TcS a
setEvBindsTcS (Implication -> EvBindsVar
ic_binds Implication
implic) (TcS WantedConstraints -> TcS WantedConstraints)
-> TcS WantedConstraints -> TcS WantedConstraints
forall a b. (a -> b) -> a -> b
$
WantedConstraints -> TcS WantedConstraints
defaultCallStacks (Implication -> WantedConstraints
ic_wanted Implication
implic)
; Implication -> TcS (Maybe Implication)
setImplicationStatus (Implication
implic { ic_wanted :: WantedConstraints
ic_wanted = WantedConstraints
wanteds }) }
defaultCallStack :: Ct -> TcS (Maybe Ct)
defaultCallStack Ct
ct
| ClassPred Class
cls [Type]
tys <- Type -> Pred
classifyPredType (Ct -> Type
ctPred Ct
ct)
, Just {} <- Class -> [Type] -> Maybe FastString
isCallStackPred Class
cls [Type]
tys
= do { CtEvidence -> EvCallStack -> TcS ()
solveCallStack (Ct -> CtEvidence
ctEvidence Ct
ct) EvCallStack
EvCsEmpty
; Maybe Ct -> TcS (Maybe Ct)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Ct
forall a. Maybe a
Nothing }
defaultCallStack Ct
ct
= Maybe Ct -> TcS (Maybe Ct)
forall (m :: * -> *) a. Monad m => a -> m a
return (Ct -> Maybe Ct
forall a. a -> Maybe a
Just Ct
ct)
simplifyAmbiguityCheck :: Type -> WantedConstraints -> TcM ()
simplifyAmbiguityCheck :: Type -> WantedConstraints -> TcM ()
simplifyAmbiguityCheck Type
ty WantedConstraints
wanteds
= do { String -> SDoc -> TcM ()
traceTc String
"simplifyAmbiguityCheck {" (String -> SDoc
text String
"type = " SDoc -> SDoc -> SDoc
<+> Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
ty SDoc -> SDoc -> SDoc
$$ String -> SDoc
text String
"wanted = " SDoc -> SDoc -> SDoc
<+> WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanteds)
; (WantedConstraints
final_wc, EvBindMap
_) <- TcS WantedConstraints -> TcM (WantedConstraints, EvBindMap)
forall a. TcS a -> TcM (a, EvBindMap)
runTcS (TcS WantedConstraints -> TcM (WantedConstraints, EvBindMap))
-> TcS WantedConstraints -> TcM (WantedConstraints, EvBindMap)
forall a b. (a -> b) -> a -> b
$ WantedConstraints -> TcS WantedConstraints
solveWantedsAndDrop WantedConstraints
wanteds
; String -> SDoc -> TcM ()
traceTc String
"End simplifyAmbiguityCheck }" SDoc
empty
; Bool
allow_ambiguous <- Extension -> TcM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.AllowAmbiguousTypes
; String -> SDoc -> TcM ()
traceTc String
"reportUnsolved(ambig) {" SDoc
empty
; Bool -> TcM () -> TcM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Bool
allow_ambiguous Bool -> Bool -> Bool
&& Bool -> Bool
not (WantedConstraints -> Bool
insolubleWC WantedConstraints
final_wc))
(TcM (Bag EvBind) -> TcM ()
forall a. TcM a -> TcM ()
discardResult (WantedConstraints -> TcM (Bag EvBind)
reportUnsolved WantedConstraints
final_wc))
; String -> SDoc -> TcM ()
traceTc String
"reportUnsolved(ambig) }" SDoc
empty
; () -> TcM ()
forall (m :: * -> *) a. Monad m => a -> m a
return () }
simplifyInteractive :: WantedConstraints -> TcM (Bag EvBind)
simplifyInteractive :: WantedConstraints -> TcM (Bag EvBind)
simplifyInteractive WantedConstraints
wanteds
= String -> SDoc -> TcM ()
traceTc String
"simplifyInteractive" SDoc
empty TcM () -> TcM (Bag EvBind) -> TcM (Bag EvBind)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
WantedConstraints -> TcM (Bag EvBind)
simplifyTop WantedConstraints
wanteds
simplifyDefault :: ThetaType
-> TcM ()
simplifyDefault :: [Type] -> TcM ()
simplifyDefault [Type]
theta
= do { String -> SDoc -> TcM ()
traceTc String
"simplifyDefault" SDoc
empty
; [CtEvidence]
wanteds <- CtOrigin -> [Type] -> TcM [CtEvidence]
newWanteds CtOrigin
DefaultOrigin [Type]
theta
; WantedConstraints
unsolved <- TcS WantedConstraints -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a. TcS a -> TcM a
runTcSDeriveds (WantedConstraints -> TcS WantedConstraints
solveWantedsAndDrop ([CtEvidence] -> WantedConstraints
mkSimpleWC [CtEvidence]
wanteds))
; WantedConstraints -> TcM ()
reportAllUnsolved WantedConstraints
unsolved
; () -> TcM ()
forall (m :: * -> *) a. Monad m => a -> m a
return () }
tcCheckSatisfiability :: Bag EvVar -> TcM Bool
tcCheckSatisfiability :: Bag TcTyVar -> TcM Bool
tcCheckSatisfiability Bag TcTyVar
given_ids
= do { TcLclEnv
lcl_env <- TcRnIf TcGblEnv TcLclEnv TcLclEnv
forall gbl lcl. TcRnIf gbl lcl lcl
TcM.getLclEnv
; let given_loc :: CtLoc
given_loc = TcLevel -> SkolemInfo -> TcLclEnv -> CtLoc
mkGivenLoc TcLevel
topTcLevel SkolemInfo
UnkSkol TcLclEnv
lcl_env
; (Bool
res, EvBindMap
_ev_binds) <- TcS Bool -> TcM (Bool, EvBindMap)
forall a. TcS a -> TcM (a, EvBindMap)
runTcS (TcS Bool -> TcM (Bool, EvBindMap))
-> TcS Bool -> TcM (Bool, EvBindMap)
forall a b. (a -> b) -> a -> b
$
do { String -> SDoc -> TcS ()
traceTcS String
"checkSatisfiability {" (Bag TcTyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bag TcTyVar
given_ids)
; let given_cts :: [Ct]
given_cts = CtLoc -> [TcTyVar] -> [Ct]
mkGivens CtLoc
given_loc (Bag TcTyVar -> [TcTyVar]
forall a. Bag a -> [a]
bagToList Bag TcTyVar
given_ids)
; [Ct] -> TcS ()
solveSimpleGivens [Ct]
given_cts
; Cts
insols <- TcS Cts
getInertInsols
; Cts
insols <- Cts -> TcS Cts
try_harder Cts
insols
; String -> SDoc -> TcS ()
traceTcS String
"checkSatisfiability }" (Cts -> SDoc
forall a. Outputable a => a -> SDoc
ppr Cts
insols)
; Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Cts -> Bool
forall a. Bag a -> Bool
isEmptyBag Cts
insols) }
; Bool -> TcM Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
res }
where
try_harder :: Cts -> TcS Cts
try_harder :: Cts -> TcS Cts
try_harder Cts
insols
| Bool -> Bool
not (Cts -> Bool
forall a. Bag a -> Bool
isEmptyBag Cts
insols)
= Cts -> TcS Cts
forall (m :: * -> *) a. Monad m => a -> m a
return Cts
insols
| Bool
otherwise
= do { [Ct]
pending_given <- TcS [Ct]
getPendingGivenScs
; [Ct]
new_given <- [Ct] -> TcS [Ct]
makeSuperClasses [Ct]
pending_given
; [Ct] -> TcS ()
solveSimpleGivens [Ct]
new_given
; TcS Cts
getInertInsols }
tcNormalise :: Bag EvVar -> Type -> TcM Type
tcNormalise :: Bag TcTyVar -> Type -> TcM Type
tcNormalise Bag TcTyVar
given_ids Type
ty
= do { TcLclEnv
lcl_env <- TcRnIf TcGblEnv TcLclEnv TcLclEnv
forall gbl lcl. TcRnIf gbl lcl lcl
TcM.getLclEnv
; let given_loc :: CtLoc
given_loc = TcLevel -> SkolemInfo -> TcLclEnv -> CtLoc
mkGivenLoc TcLevel
topTcLevel SkolemInfo
UnkSkol TcLclEnv
lcl_env
; CtLoc
norm_loc <- CtOrigin -> Maybe TypeOrKind -> TcM CtLoc
getCtLocM CtOrigin
PatCheckOrigin Maybe TypeOrKind
forall a. Maybe a
Nothing
; (Type
res, EvBindMap
_ev_binds) <- TcS Type -> TcM (Type, EvBindMap)
forall a. TcS a -> TcM (a, EvBindMap)
runTcS (TcS Type -> TcM (Type, EvBindMap))
-> TcS Type -> TcM (Type, EvBindMap)
forall a b. (a -> b) -> a -> b
$
do { String -> SDoc -> TcS ()
traceTcS String
"tcNormalise {" (Bag TcTyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bag TcTyVar
given_ids)
; let given_cts :: [Ct]
given_cts = CtLoc -> [TcTyVar] -> [Ct]
mkGivens CtLoc
given_loc (Bag TcTyVar -> [TcTyVar]
forall a. Bag a -> [a]
bagToList Bag TcTyVar
given_ids)
; [Ct] -> TcS ()
solveSimpleGivens [Ct]
given_cts
; Type
ty' <- CtLoc -> Type -> TcS Type
flattenType CtLoc
norm_loc Type
ty
; String -> SDoc -> TcS ()
traceTcS String
"tcNormalise }" (Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
ty')
; Type -> TcS Type
forall (f :: * -> *) a. Applicative f => a -> f a
pure Type
ty' }
; Type -> TcM Type
forall (m :: * -> *) a. Monad m => a -> m a
return Type
res }
data InferMode = ApplyMR
| EagerDefaulting
| NoRestrictions
instance Outputable InferMode where
ppr :: InferMode -> SDoc
ppr InferMode
ApplyMR = String -> SDoc
text String
"ApplyMR"
ppr InferMode
EagerDefaulting = String -> SDoc
text String
"EagerDefaulting"
ppr InferMode
NoRestrictions = String -> SDoc
text String
"NoRestrictions"
simplifyInfer :: TcLevel
-> InferMode
-> [TcIdSigInst]
-> [(Name, TcTauType)]
-> WantedConstraints
-> TcM ([TcTyVar],
[EvVar],
TcEvBinds,
WantedConstraints,
Bool)
simplifyInfer :: TcLevel
-> InferMode
-> [TcIdSigInst]
-> [(Name, Type)]
-> WantedConstraints
-> TcM ([TcTyVar], [TcTyVar], TcEvBinds, WantedConstraints, Bool)
simplifyInfer TcLevel
rhs_tclvl InferMode
infer_mode [TcIdSigInst]
sigs [(Name, Type)]
name_taus WantedConstraints
wanteds
| WantedConstraints -> Bool
isEmptyWC WantedConstraints
wanteds
= do {
let psig_tv_tys :: [Type]
psig_tv_tys = [ TcTyVar -> Type
mkTyVarTy TcTyVar
tv | TcIdSigInst
sig <- [TcIdSigInst]
partial_sigs
, (Name
_,Bndr TcTyVar
tv Specificity
_) <- TcIdSigInst -> [(Name, InvisTVBinder)]
sig_inst_skols TcIdSigInst
sig ]
psig_theta :: [Type]
psig_theta = [ Type
pred | TcIdSigInst
sig <- [TcIdSigInst]
partial_sigs
, Type
pred <- TcIdSigInst -> [Type]
sig_inst_theta TcIdSigInst
sig ]
; CandidatesQTvs
dep_vars <- [Type] -> TcM CandidatesQTvs
candidateQTyVarsOfTypes ([Type]
psig_tv_tys [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
psig_theta [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ ((Name, Type) -> Type) -> [(Name, Type)] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map (Name, Type) -> Type
forall a b. (a, b) -> b
snd [(Name, Type)]
name_taus)
; [TcTyVar]
qtkvs <- CandidatesQTvs -> TcM [TcTyVar]
quantifyTyVars CandidatesQTvs
dep_vars
; String -> SDoc -> TcM ()
traceTc String
"simplifyInfer: empty WC" ([(Name, Type)] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [(Name, Type)]
name_taus SDoc -> SDoc -> SDoc
$$ [TcTyVar] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TcTyVar]
qtkvs)
; ([TcTyVar], [TcTyVar], TcEvBinds, WantedConstraints, Bool)
-> TcM ([TcTyVar], [TcTyVar], TcEvBinds, WantedConstraints, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return ([TcTyVar]
qtkvs, [], TcEvBinds
emptyTcEvBinds, WantedConstraints
emptyWC, Bool
False) }
| Bool
otherwise
= do { String -> SDoc -> TcM ()
traceTc String
"simplifyInfer {" (SDoc -> TcM ()) -> SDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"sigs =" SDoc -> SDoc -> SDoc
<+> [TcIdSigInst] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TcIdSigInst]
sigs
, String -> SDoc
text String
"binds =" SDoc -> SDoc -> SDoc
<+> [(Name, Type)] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [(Name, Type)]
name_taus
, String -> SDoc
text String
"rhs_tclvl =" SDoc -> SDoc -> SDoc
<+> TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
rhs_tclvl
, String -> SDoc
text String
"infer_mode =" SDoc -> SDoc -> SDoc
<+> InferMode -> SDoc
forall a. Outputable a => a -> SDoc
ppr InferMode
infer_mode
, String -> SDoc
text String
"(unzonked) wanted =" SDoc -> SDoc -> SDoc
<+> WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanteds
]
; let psig_theta :: [Type]
psig_theta = (TcIdSigInst -> [Type]) -> [TcIdSigInst] -> [Type]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap TcIdSigInst -> [Type]
sig_inst_theta [TcIdSigInst]
partial_sigs
; Env TcGblEnv TcLclEnv
tc_env <- IOEnv (Env TcGblEnv TcLclEnv) (Env TcGblEnv TcLclEnv)
forall env. IOEnv env env
TcM.getEnv
; EvBindsVar
ev_binds_var <- TcM EvBindsVar
TcM.newTcEvBinds
; [TcTyVar]
psig_theta_vars <- (Type -> IOEnv (Env TcGblEnv TcLclEnv) TcTyVar)
-> [Type] -> TcM [TcTyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Type -> IOEnv (Env TcGblEnv TcLclEnv) TcTyVar
forall gbl lcl. Type -> TcRnIf gbl lcl TcTyVar
TcM.newEvVar [Type]
psig_theta
; WantedConstraints
wanted_transformed_incl_derivs
<- TcLevel
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a. TcLevel -> TcM a -> TcM a
setTcLevel TcLevel
rhs_tclvl (TcRnIf TcGblEnv TcLclEnv WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints)
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a b. (a -> b) -> a -> b
$
EvBindsVar
-> TcS WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a. EvBindsVar -> TcS a -> TcM a
runTcSWithEvBinds EvBindsVar
ev_binds_var (TcS WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints)
-> TcS WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a b. (a -> b) -> a -> b
$
do { let loc :: CtLoc
loc = TcLevel -> SkolemInfo -> TcLclEnv -> CtLoc
mkGivenLoc TcLevel
rhs_tclvl SkolemInfo
UnkSkol (TcLclEnv -> CtLoc) -> TcLclEnv -> CtLoc
forall a b. (a -> b) -> a -> b
$
Env TcGblEnv TcLclEnv -> TcLclEnv
forall gbl lcl. Env gbl lcl -> lcl
env_lcl Env TcGblEnv TcLclEnv
tc_env
psig_givens :: [Ct]
psig_givens = CtLoc -> [TcTyVar] -> [Ct]
mkGivens CtLoc
loc [TcTyVar]
psig_theta_vars
; ()
_ <- [Ct] -> TcS ()
solveSimpleGivens [Ct]
psig_givens
; WantedConstraints -> TcS WantedConstraints
solveWanteds WantedConstraints
wanteds }
; WantedConstraints
wanted_transformed_incl_derivs <- WantedConstraints -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
TcM.zonkWC WantedConstraints
wanted_transformed_incl_derivs
; let definite_error :: Bool
definite_error = WantedConstraints -> Bool
insolubleWC WantedConstraints
wanted_transformed_incl_derivs
wanted_transformed :: WantedConstraints
wanted_transformed = WantedConstraints -> WantedConstraints
dropDerivedWC WantedConstraints
wanted_transformed_incl_derivs
quant_pred_candidates :: [Type]
quant_pred_candidates
| Bool
definite_error = []
| Bool
otherwise = Cts -> [Type]
ctsPreds (Bool -> WantedConstraints -> Cts
approximateWC Bool
False WantedConstraints
wanted_transformed)
; ([TcTyVar]
qtvs, [Type]
bound_theta, VarSet
co_vars) <- InferMode
-> TcLevel
-> [(Name, Type)]
-> [TcIdSigInst]
-> [Type]
-> TcM ([TcTyVar], [Type], VarSet)
decideQuantification InferMode
infer_mode TcLevel
rhs_tclvl
[(Name, Type)]
name_taus [TcIdSigInst]
partial_sigs
[Type]
quant_pred_candidates
; [TcTyVar]
bound_theta_vars <- (Type -> IOEnv (Env TcGblEnv TcLclEnv) TcTyVar)
-> [Type] -> TcM [TcTyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Type -> IOEnv (Env TcGblEnv TcLclEnv) TcTyVar
forall gbl lcl. Type -> TcRnIf gbl lcl TcTyVar
TcM.newEvVar [Type]
bound_theta
; CtLoc
ct_loc <- CtOrigin -> Maybe TypeOrKind -> TcM CtLoc
getCtLocM CtOrigin
AnnOrigin Maybe TypeOrKind
forall a. Maybe a
Nothing
; let psig_wanted :: [CtEvidence]
psig_wanted = [ CtWanted :: Type -> TcEvDest -> ShadowInfo -> CtLoc -> CtEvidence
CtWanted { ctev_pred :: Type
ctev_pred = TcTyVar -> Type
idType TcTyVar
psig_theta_var
, ctev_dest :: TcEvDest
ctev_dest = TcTyVar -> TcEvDest
EvVarDest TcTyVar
psig_theta_var
, ctev_nosh :: ShadowInfo
ctev_nosh = ShadowInfo
WDeriv
, ctev_loc :: CtLoc
ctev_loc = CtLoc
ct_loc }
| TcTyVar
psig_theta_var <- [TcTyVar]
psig_theta_vars ]
; WantedConstraints
residual_wanted <- TcLevel
-> EvBindsVar
-> [(Name, Type)]
-> VarSet
-> [TcTyVar]
-> [TcTyVar]
-> WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
mkResidualConstraints TcLevel
rhs_tclvl EvBindsVar
ev_binds_var
[(Name, Type)]
name_taus VarSet
co_vars [TcTyVar]
qtvs [TcTyVar]
bound_theta_vars
(WantedConstraints
wanted_transformed WantedConstraints -> WantedConstraints -> WantedConstraints
`andWC` [CtEvidence] -> WantedConstraints
mkSimpleWC [CtEvidence]
psig_wanted)
; String -> SDoc -> TcM ()
traceTc String
"} simplifyInfer/produced residual implication for quantification" (SDoc -> TcM ()) -> SDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"quant_pred_candidates =" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
quant_pred_candidates
, String -> SDoc
text String
"psig_theta =" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
psig_theta
, String -> SDoc
text String
"bound_theta =" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
bound_theta
, String -> SDoc
text String
"qtvs =" SDoc -> SDoc -> SDoc
<+> [TcTyVar] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TcTyVar]
qtvs
, String -> SDoc
text String
"definite_error =" SDoc -> SDoc -> SDoc
<+> Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
definite_error ]
; ([TcTyVar], [TcTyVar], TcEvBinds, WantedConstraints, Bool)
-> TcM ([TcTyVar], [TcTyVar], TcEvBinds, WantedConstraints, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return ( [TcTyVar]
qtvs, [TcTyVar]
bound_theta_vars, EvBindsVar -> TcEvBinds
TcEvBinds EvBindsVar
ev_binds_var
, WantedConstraints
residual_wanted, Bool
definite_error ) }
where
partial_sigs :: [TcIdSigInst]
partial_sigs = (TcIdSigInst -> Bool) -> [TcIdSigInst] -> [TcIdSigInst]
forall a. (a -> Bool) -> [a] -> [a]
filter TcIdSigInst -> Bool
isPartialSig [TcIdSigInst]
sigs
mkResidualConstraints :: TcLevel -> EvBindsVar
-> [(Name, TcTauType)]
-> VarSet -> [TcTyVar] -> [EvVar]
-> WantedConstraints -> TcM WantedConstraints
mkResidualConstraints :: TcLevel
-> EvBindsVar
-> [(Name, Type)]
-> VarSet
-> [TcTyVar]
-> [TcTyVar]
-> WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
mkResidualConstraints TcLevel
rhs_tclvl EvBindsVar
ev_binds_var
[(Name, Type)]
name_taus VarSet
co_vars [TcTyVar]
qtvs [TcTyVar]
full_theta_vars WantedConstraints
wanteds
| WantedConstraints -> Bool
isEmptyWC WantedConstraints
wanteds
= WantedConstraints -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return WantedConstraints
wanteds
| Bool
otherwise
= do { Cts
wanted_simple <- Cts -> TcM Cts
TcM.zonkSimples (WantedConstraints -> Cts
wc_simple WantedConstraints
wanteds)
; let (Cts
outer_simple, Cts
inner_simple) = (Ct -> Bool) -> Cts -> (Cts, Cts)
forall a. (a -> Bool) -> Bag a -> (Bag a, Bag a)
partitionBag Ct -> Bool
is_mono Cts
wanted_simple
is_mono :: Ct -> Bool
is_mono Ct
ct = Ct -> Bool
isWantedCt Ct
ct Bool -> Bool -> Bool
&& Ct -> TcTyVar
ctEvId Ct
ct TcTyVar -> VarSet -> Bool
`elemVarSet` VarSet
co_vars
; Bool
_ <- VarSet -> TcM Bool
promoteTyVarSet (Cts -> VarSet
tyCoVarsOfCts Cts
outer_simple)
; let inner_wanted :: WantedConstraints
inner_wanted = WantedConstraints
wanteds { wc_simple :: Cts
wc_simple = Cts
inner_simple }
; Bag Implication
implics <- if WantedConstraints -> Bool
isEmptyWC WantedConstraints
inner_wanted
then Bag Implication -> IOEnv (Env TcGblEnv TcLclEnv) (Bag Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return Bag Implication
forall a. Bag a
emptyBag
else do Implication
implic1 <- TcM Implication
newImplication
Bag Implication -> IOEnv (Env TcGblEnv TcLclEnv) (Bag Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bag Implication
-> IOEnv (Env TcGblEnv TcLclEnv) (Bag Implication))
-> Bag Implication
-> IOEnv (Env TcGblEnv TcLclEnv) (Bag Implication)
forall a b. (a -> b) -> a -> b
$ Implication -> Bag Implication
forall a. a -> Bag a
unitBag (Implication -> Bag Implication) -> Implication -> Bag Implication
forall a b. (a -> b) -> a -> b
$
Implication
implic1 { ic_tclvl :: TcLevel
ic_tclvl = TcLevel
rhs_tclvl
, ic_skols :: [TcTyVar]
ic_skols = [TcTyVar]
qtvs
, ic_given :: [TcTyVar]
ic_given = [TcTyVar]
full_theta_vars
, ic_wanted :: WantedConstraints
ic_wanted = WantedConstraints
inner_wanted
, ic_binds :: EvBindsVar
ic_binds = EvBindsVar
ev_binds_var
, ic_no_eqs :: Bool
ic_no_eqs = Bool
False
, ic_info :: SkolemInfo
ic_info = SkolemInfo
skol_info }
; WantedConstraints -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return (WantedConstraints
emptyWC { wc_simple :: Cts
wc_simple = Cts
outer_simple
, wc_impl :: Bag Implication
wc_impl = Bag Implication
implics })}
where
full_theta :: [Type]
full_theta = (TcTyVar -> Type) -> [TcTyVar] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map TcTyVar -> Type
idType [TcTyVar]
full_theta_vars
skol_info :: SkolemInfo
skol_info = [(Name, Type)] -> SkolemInfo
InferSkol [ (Name
name, [TyCoVarBinder] -> [Type] -> Type -> Type
mkSigmaTy [] [Type]
full_theta Type
ty)
| (Name
name, Type
ty) <- [(Name, Type)]
name_taus ]
ctsPreds :: Cts -> [PredType]
ctsPreds :: Cts -> [Type]
ctsPreds Cts
cts = [ CtEvidence -> Type
ctEvPred CtEvidence
ev | Ct
ct <- Cts -> [Ct]
forall a. Bag a -> [a]
bagToList Cts
cts
, let ev :: CtEvidence
ev = Ct -> CtEvidence
ctEvidence Ct
ct ]
decideQuantification
:: InferMode
-> TcLevel
-> [(Name, TcTauType)]
-> [TcIdSigInst]
-> [PredType]
-> TcM ( [TcTyVar]
, [PredType]
, VarSet)
decideQuantification :: InferMode
-> TcLevel
-> [(Name, Type)]
-> [TcIdSigInst]
-> [Type]
-> TcM ([TcTyVar], [Type], VarSet)
decideQuantification InferMode
infer_mode TcLevel
rhs_tclvl [(Name, Type)]
name_taus [TcIdSigInst]
psigs [Type]
candidates
= do {
; (VarSet
mono_tvs, [Type]
candidates, VarSet
co_vars) <- InferMode
-> [(Name, Type)]
-> [TcIdSigInst]
-> [Type]
-> TcM (VarSet, [Type], VarSet)
decideMonoTyVars InferMode
infer_mode
[(Name, Type)]
name_taus [TcIdSigInst]
psigs [Type]
candidates
; [Type]
candidates <- TcLevel -> VarSet -> [Type] -> TcM [Type]
defaultTyVarsAndSimplify TcLevel
rhs_tclvl VarSet
mono_tvs [Type]
candidates
; [TcTyVar]
qtvs <- [(Name, Type)] -> [TcIdSigInst] -> [Type] -> TcM [TcTyVar]
decideQuantifiedTyVars [(Name, Type)]
name_taus [TcIdSigInst]
psigs [Type]
candidates
; [Type]
candidates <- [Type] -> TcM [Type]
TcM.zonkTcTypes [Type]
candidates
; [Type]
psig_theta <- [Type] -> TcM [Type]
TcM.zonkTcTypes ((TcIdSigInst -> [Type]) -> [TcIdSigInst] -> [Type]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap TcIdSigInst -> [Type]
sig_inst_theta [TcIdSigInst]
psigs)
; let quantifiable_candidates :: [Type]
quantifiable_candidates
= VarSet -> [Type] -> [Type]
pickQuantifiablePreds ([TcTyVar] -> VarSet
mkVarSet [TcTyVar]
qtvs) [Type]
candidates
theta :: [Type]
theta = (Type -> Type) -> [Type] -> [Type]
forall a. (a -> Type) -> [a] -> [a]
mkMinimalBySCs Type -> Type
forall a. a -> a
id ([Type] -> [Type]) -> [Type] -> [Type]
forall a b. (a -> b) -> a -> b
$
([Type]
psig_theta [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
quantifiable_candidates)
; String -> SDoc -> TcM ()
traceTc String
"decideQuantification"
([SDoc] -> SDoc
vcat [ String -> SDoc
text String
"infer_mode:" SDoc -> SDoc -> SDoc
<+> InferMode -> SDoc
forall a. Outputable a => a -> SDoc
ppr InferMode
infer_mode
, String -> SDoc
text String
"candidates:" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
candidates
, String -> SDoc
text String
"psig_theta:" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
psig_theta
, String -> SDoc
text String
"mono_tvs:" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
mono_tvs
, String -> SDoc
text String
"co_vars:" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
co_vars
, String -> SDoc
text String
"qtvs:" SDoc -> SDoc -> SDoc
<+> [TcTyVar] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TcTyVar]
qtvs
, String -> SDoc
text String
"theta:" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
theta ])
; ([TcTyVar], [Type], VarSet) -> TcM ([TcTyVar], [Type], VarSet)
forall (m :: * -> *) a. Monad m => a -> m a
return ([TcTyVar]
qtvs, [Type]
theta, VarSet
co_vars) }
decideMonoTyVars :: InferMode
-> [(Name,TcType)]
-> [TcIdSigInst]
-> [PredType]
-> TcM (TcTyCoVarSet, [PredType], CoVarSet)
decideMonoTyVars :: InferMode
-> [(Name, Type)]
-> [TcIdSigInst]
-> [Type]
-> TcM (VarSet, [Type], VarSet)
decideMonoTyVars InferMode
infer_mode [(Name, Type)]
name_taus [TcIdSigInst]
psigs [Type]
candidates
= do { ([Type]
no_quant, [Type]
maybe_quant) <- InferMode -> [Type] -> TcM ([Type], [Type])
pick InferMode
infer_mode [Type]
candidates
; [TcTyVar]
psig_qtvs <- (TcTyVar -> IOEnv (Env TcGblEnv TcLclEnv) TcTyVar)
-> [TcTyVar] -> TcM [TcTyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM HasDebugCallStack =>
TcTyVar -> IOEnv (Env TcGblEnv TcLclEnv) TcTyVar
TcTyVar -> IOEnv (Env TcGblEnv TcLclEnv) TcTyVar
zonkTcTyVarToTyVar ([TcTyVar] -> TcM [TcTyVar]) -> [TcTyVar] -> TcM [TcTyVar]
forall a b. (a -> b) -> a -> b
$ [InvisTVBinder] -> [TcTyVar]
forall tv argf. [VarBndr tv argf] -> [tv]
binderVars ([InvisTVBinder] -> [TcTyVar]) -> [InvisTVBinder] -> [TcTyVar]
forall a b. (a -> b) -> a -> b
$
(TcIdSigInst -> [InvisTVBinder])
-> [TcIdSigInst] -> [InvisTVBinder]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (((Name, InvisTVBinder) -> InvisTVBinder)
-> [(Name, InvisTVBinder)] -> [InvisTVBinder]
forall a b. (a -> b) -> [a] -> [b]
map (Name, InvisTVBinder) -> InvisTVBinder
forall a b. (a, b) -> b
snd ([(Name, InvisTVBinder)] -> [InvisTVBinder])
-> (TcIdSigInst -> [(Name, InvisTVBinder)])
-> TcIdSigInst
-> [InvisTVBinder]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcIdSigInst -> [(Name, InvisTVBinder)]
sig_inst_skols) [TcIdSigInst]
psigs
; [Type]
psig_theta <- (Type -> TcM Type) -> [Type] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Type -> TcM Type
TcM.zonkTcType ([Type] -> TcM [Type]) -> [Type] -> TcM [Type]
forall a b. (a -> b) -> a -> b
$
(TcIdSigInst -> [Type]) -> [TcIdSigInst] -> [Type]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap TcIdSigInst -> [Type]
sig_inst_theta [TcIdSigInst]
psigs
; [Type]
taus <- ((Name, Type) -> TcM Type) -> [(Name, Type)] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Type -> TcM Type
TcM.zonkTcType (Type -> TcM Type)
-> ((Name, Type) -> Type) -> (Name, Type) -> TcM Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Name, Type) -> Type
forall a b. (a, b) -> b
snd) [(Name, Type)]
name_taus
; TcLevel
tc_lvl <- TcM TcLevel
TcM.getTcLevel
; let psig_tys :: [Type]
psig_tys = [TcTyVar] -> [Type]
mkTyVarTys [TcTyVar]
psig_qtvs [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
psig_theta
co_vars :: VarSet
co_vars = [Type] -> VarSet
coVarsOfTypes ([Type]
psig_tys [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
taus)
co_var_tvs :: VarSet
co_var_tvs = VarSet -> VarSet
closeOverKinds VarSet
co_vars
mono_tvs0 :: VarSet
mono_tvs0 = (TcTyVar -> Bool) -> VarSet -> VarSet
filterVarSet (Bool -> Bool
not (Bool -> Bool) -> (TcTyVar -> Bool) -> TcTyVar -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcLevel -> TcTyVar -> Bool
isQuantifiableTv TcLevel
tc_lvl) (VarSet -> VarSet) -> VarSet -> VarSet
forall a b. (a -> b) -> a -> b
$
[Type] -> VarSet
tyCoVarsOfTypes [Type]
candidates
mono_tvs1 :: VarSet
mono_tvs1 = VarSet
mono_tvs0 VarSet -> VarSet -> VarSet
`unionVarSet` VarSet
co_var_tvs
eq_constraints :: [Type]
eq_constraints = (Type -> Bool) -> [Type] -> [Type]
forall a. (a -> Bool) -> [a] -> [a]
filter Type -> Bool
isEqPrimPred [Type]
candidates
mono_tvs2 :: VarSet
mono_tvs2 = [Type] -> VarSet -> VarSet
growThetaTyVars [Type]
eq_constraints VarSet
mono_tvs1
constrained_tvs :: VarSet
constrained_tvs = (TcTyVar -> Bool) -> VarSet -> VarSet
filterVarSet (TcLevel -> TcTyVar -> Bool
isQuantifiableTv TcLevel
tc_lvl) (VarSet -> VarSet) -> VarSet -> VarSet
forall a b. (a -> b) -> a -> b
$
([Type] -> VarSet -> VarSet
growThetaTyVars [Type]
eq_constraints
([Type] -> VarSet
tyCoVarsOfTypes [Type]
no_quant)
VarSet -> VarSet -> VarSet
`minusVarSet` VarSet
mono_tvs2)
VarSet -> [TcTyVar] -> VarSet
`delVarSetList` [TcTyVar]
psig_qtvs
mono_tvs :: VarSet
mono_tvs = VarSet
mono_tvs2 VarSet -> VarSet -> VarSet
`unionVarSet` VarSet
constrained_tvs
; Bool
warn_mono <- WarningFlag -> TcM Bool
forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnMonomorphism
; Bool -> TcM () -> TcM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (case InferMode
infer_mode of { InferMode
ApplyMR -> Bool
warn_mono; InferMode
_ -> Bool
False}) (TcM () -> TcM ()) -> TcM () -> TcM ()
forall a b. (a -> b) -> a -> b
$
WarnReason -> Bool -> SDoc -> TcM ()
warnTc (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnMonomorphism)
(VarSet
constrained_tvs VarSet -> VarSet -> Bool
`intersectsVarSet` [Type] -> VarSet
tyCoVarsOfTypes [Type]
taus)
SDoc
mr_msg
; String -> SDoc -> TcM ()
traceTc String
"decideMonoTyVars" (SDoc -> TcM ()) -> SDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"mono_tvs0 =" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
mono_tvs0
, String -> SDoc
text String
"no_quant =" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
no_quant
, String -> SDoc
text String
"maybe_quant =" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
maybe_quant
, String -> SDoc
text String
"eq_constraints =" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
eq_constraints
, String -> SDoc
text String
"mono_tvs =" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
mono_tvs
, String -> SDoc
text String
"co_vars =" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
co_vars ]
; (VarSet, [Type], VarSet) -> TcM (VarSet, [Type], VarSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (VarSet
mono_tvs, [Type]
maybe_quant, VarSet
co_vars) }
where
pick :: InferMode -> [PredType] -> TcM ([PredType], [PredType])
pick :: InferMode -> [Type] -> TcM ([Type], [Type])
pick InferMode
NoRestrictions [Type]
cand = ([Type], [Type]) -> TcM ([Type], [Type])
forall (m :: * -> *) a. Monad m => a -> m a
return ([], [Type]
cand)
pick InferMode
ApplyMR [Type]
cand = ([Type], [Type]) -> TcM ([Type], [Type])
forall (m :: * -> *) a. Monad m => a -> m a
return ([Type]
cand, [])
pick InferMode
EagerDefaulting [Type]
cand = do { Bool
os <- Extension -> TcM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.OverloadedStrings
; ([Type], [Type]) -> TcM ([Type], [Type])
forall (m :: * -> *) a. Monad m => a -> m a
return ((Type -> Bool) -> [Type] -> ([Type], [Type])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (Bool -> Type -> Bool
is_int_ct Bool
os) [Type]
cand) }
is_int_ct :: Bool -> Type -> Bool
is_int_ct Bool
ovl_strings Type
pred
| Just (Class
cls, [Type]
_) <- Type -> Maybe (Class, [Type])
getClassPredTys_maybe Type
pred
= Bool -> Class -> Bool
isInteractiveClass Bool
ovl_strings Class
cls
| Bool
otherwise
= Bool
False
pp_bndrs :: SDoc
pp_bndrs = ((Name, Type) -> SDoc) -> [(Name, Type)] -> SDoc
forall a. (a -> SDoc) -> [a] -> SDoc
pprWithCommas (SDoc -> SDoc
quotes (SDoc -> SDoc) -> ((Name, Type) -> SDoc) -> (Name, Type) -> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Name -> SDoc) -> ((Name, Type) -> Name) -> (Name, Type) -> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Name, Type) -> Name
forall a b. (a, b) -> a
fst) [(Name, Type)]
name_taus
mr_msg :: SDoc
mr_msg =
SDoc -> Int -> SDoc -> SDoc
hang ([SDoc] -> SDoc
sep [ String -> SDoc
text String
"The Monomorphism Restriction applies to the binding"
SDoc -> SDoc -> SDoc
<> [(Name, Type)] -> SDoc
forall a. [a] -> SDoc
plural [(Name, Type)]
name_taus
, String -> SDoc
text String
"for" SDoc -> SDoc -> SDoc
<+> SDoc
pp_bndrs ])
Int
2 ([SDoc] -> SDoc
hsep [ String -> SDoc
text String
"Consider giving"
, String -> SDoc
text (if [(Name, Type)] -> Bool
forall a. [a] -> Bool
isSingleton [(Name, Type)]
name_taus then String
"it" else String
"them")
, String -> SDoc
text String
"a type signature"])
defaultTyVarsAndSimplify :: TcLevel
-> TyCoVarSet
-> [PredType]
-> TcM [PredType]
defaultTyVarsAndSimplify :: TcLevel -> VarSet -> [Type] -> TcM [Type]
defaultTyVarsAndSimplify TcLevel
rhs_tclvl VarSet
mono_tvs [Type]
candidates
= do {
; String -> SDoc -> TcM ()
traceTc String
"decideMonoTyVars: promotion:" (VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
mono_tvs)
; Bool
any_promoted <- VarSet -> TcM Bool
promoteTyVarSet VarSet
mono_tvs
; DV {dv_kvs :: CandidatesQTvs -> DTyVarSet
dv_kvs = DTyVarSet
cand_kvs, dv_tvs :: CandidatesQTvs -> DTyVarSet
dv_tvs = DTyVarSet
cand_tvs}
<- [Type] -> TcM CandidatesQTvs
candidateQTyVarsOfTypes [Type]
candidates
; Bool
poly_kinds <- Extension -> TcM Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.PolyKinds
; [Bool]
default_kvs <- (TcTyVar -> TcM Bool)
-> [TcTyVar] -> IOEnv (Env TcGblEnv TcLclEnv) [Bool]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Bool -> Bool -> TcTyVar -> TcM Bool
default_one Bool
poly_kinds Bool
True)
(DTyVarSet -> [TcTyVar]
dVarSetElems DTyVarSet
cand_kvs)
; [Bool]
default_tvs <- (TcTyVar -> TcM Bool)
-> [TcTyVar] -> IOEnv (Env TcGblEnv TcLclEnv) [Bool]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Bool -> Bool -> TcTyVar -> TcM Bool
default_one Bool
poly_kinds Bool
False)
(DTyVarSet -> [TcTyVar]
dVarSetElems (DTyVarSet
cand_tvs DTyVarSet -> DTyVarSet -> DTyVarSet
`minusDVarSet` DTyVarSet
cand_kvs))
; let some_default :: Bool
some_default = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [Bool]
default_kvs Bool -> Bool -> Bool
|| [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [Bool]
default_tvs
; case () of
()
_ | Bool
some_default -> [Type] -> TcM [Type]
simplify_cand [Type]
candidates
| Bool
any_promoted -> (Type -> TcM Type) -> [Type] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Type -> TcM Type
TcM.zonkTcType [Type]
candidates
| Bool
otherwise -> [Type] -> TcM [Type]
forall (m :: * -> *) a. Monad m => a -> m a
return [Type]
candidates
}
where
default_one :: Bool -> Bool -> TcTyVar -> TcM Bool
default_one Bool
poly_kinds Bool
is_kind_var TcTyVar
tv
| Bool -> Bool
not (TcTyVar -> Bool
isMetaTyVar TcTyVar
tv)
= Bool -> TcM Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
| TcTyVar
tv TcTyVar -> VarSet -> Bool
`elemVarSet` VarSet
mono_tvs
= Bool -> TcM Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
| Bool
otherwise
= Bool -> TcTyVar -> TcM Bool
defaultTyVar (Bool -> Bool
not Bool
poly_kinds Bool -> Bool -> Bool
&& Bool
is_kind_var) TcTyVar
tv
simplify_cand :: [Type] -> TcM [Type]
simplify_cand [Type]
candidates
= do { [CtEvidence]
clone_wanteds <- CtOrigin -> [Type] -> TcM [CtEvidence]
newWanteds CtOrigin
DefaultOrigin [Type]
candidates
; WC { wc_simple :: WantedConstraints -> Cts
wc_simple = Cts
simples } <- TcLevel
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a. TcLevel -> TcM a -> TcM a
setTcLevel TcLevel
rhs_tclvl (TcRnIf TcGblEnv TcLclEnv WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints)
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
-> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall a b. (a -> b) -> a -> b
$
[CtEvidence] -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
simplifyWantedsTcM [CtEvidence]
clone_wanteds
; let new_candidates :: [Type]
new_candidates = Cts -> [Type]
ctsPreds Cts
simples
; String -> SDoc -> TcM ()
traceTc String
"Simplified after defaulting" (SDoc -> TcM ()) -> SDoc -> TcM ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Before:" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
candidates
, String -> SDoc
text String
"After:" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
new_candidates ]
; [Type] -> TcM [Type]
forall (m :: * -> *) a. Monad m => a -> m a
return [Type]
new_candidates }
decideQuantifiedTyVars
:: [(Name,TcType)]
-> [TcIdSigInst]
-> [PredType]
-> TcM [TyVar]
decideQuantifiedTyVars :: [(Name, Type)] -> [TcIdSigInst] -> [Type] -> TcM [TcTyVar]
decideQuantifiedTyVars [(Name, Type)]
name_taus [TcIdSigInst]
psigs [Type]
candidates
= do {
; [Type]
psig_tv_tys <- (TcTyVar -> TcM Type) -> [TcTyVar] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM TcTyVar -> TcM Type
TcM.zonkTcTyVar [ TcTyVar
tv | TcIdSigInst
sig <- [TcIdSigInst]
psigs
, (Name
_,Bndr TcTyVar
tv Specificity
_) <- TcIdSigInst -> [(Name, InvisTVBinder)]
sig_inst_skols TcIdSigInst
sig ]
; [Type]
psig_theta <- (Type -> TcM Type) -> [Type] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Type -> TcM Type
TcM.zonkTcType [ Type
pred | TcIdSigInst
sig <- [TcIdSigInst]
psigs
, Type
pred <- TcIdSigInst -> [Type]
sig_inst_theta TcIdSigInst
sig ]
; [Type]
tau_tys <- ((Name, Type) -> TcM Type) -> [(Name, Type)] -> TcM [Type]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Type -> TcM Type
TcM.zonkTcType (Type -> TcM Type)
-> ((Name, Type) -> Type) -> (Name, Type) -> TcM Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Name, Type) -> Type
forall a b. (a, b) -> b
snd) [(Name, Type)]
name_taus
; let
psig_tys :: [Type]
psig_tys = [Type]
psig_tv_tys [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
psig_theta
seed_tys :: [Type]
seed_tys = [Type]
psig_tys [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
tau_tys
grown_tcvs :: VarSet
grown_tcvs = [Type] -> VarSet -> VarSet
growThetaTyVars [Type]
candidates ([Type] -> VarSet
tyCoVarsOfTypes [Type]
seed_tys)
; dv :: CandidatesQTvs
dv@DV {dv_kvs :: CandidatesQTvs -> DTyVarSet
dv_kvs = DTyVarSet
cand_kvs, dv_tvs :: CandidatesQTvs -> DTyVarSet
dv_tvs = DTyVarSet
cand_tvs} <- [Type] -> TcM CandidatesQTvs
candidateQTyVarsOfTypes ([Type] -> TcM CandidatesQTvs) -> [Type] -> TcM CandidatesQTvs
forall a b. (a -> b) -> a -> b
$
[Type]
psig_tys [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
candidates [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
tau_tys
; let pick :: DTyVarSet -> DTyVarSet
pick = (DTyVarSet -> VarSet -> DTyVarSet
`dVarSetIntersectVarSet` VarSet
grown_tcvs)
dvs_plus :: CandidatesQTvs
dvs_plus = CandidatesQTvs
dv { dv_kvs :: DTyVarSet
dv_kvs = DTyVarSet -> DTyVarSet
pick DTyVarSet
cand_kvs, dv_tvs :: DTyVarSet
dv_tvs = DTyVarSet -> DTyVarSet
pick DTyVarSet
cand_tvs }
; String -> SDoc -> TcM ()
traceTc String
"decideQuantifiedTyVars" ([SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"candidates =" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
candidates
, String -> SDoc
text String
"tau_tys =" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
tau_tys
, String -> SDoc
text String
"seed_tys =" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Type]
seed_tys
, String -> SDoc
text String
"seed_tcvs =" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr ([Type] -> VarSet
tyCoVarsOfTypes [Type]
seed_tys)
, String -> SDoc
text String
"grown_tcvs =" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
grown_tcvs
, String -> SDoc
text String
"dvs =" SDoc -> SDoc -> SDoc
<+> CandidatesQTvs -> SDoc
forall a. Outputable a => a -> SDoc
ppr CandidatesQTvs
dvs_plus])
; CandidatesQTvs -> TcM [TcTyVar]
quantifyTyVars CandidatesQTvs
dvs_plus }
growThetaTyVars :: ThetaType -> TyCoVarSet -> TyCoVarSet
growThetaTyVars :: [Type] -> VarSet -> VarSet
growThetaTyVars [Type]
theta VarSet
tcvs
| [Type] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Type]
theta = VarSet
tcvs
| Bool
otherwise = (VarSet -> VarSet) -> VarSet -> VarSet
transCloVarSet VarSet -> VarSet
mk_next VarSet
seed_tcvs
where
seed_tcvs :: VarSet
seed_tcvs = VarSet
tcvs VarSet -> VarSet -> VarSet
`unionVarSet` [Type] -> VarSet
tyCoVarsOfTypes [Type]
ips
([Type]
ips, [Type]
non_ips) = (Type -> Bool) -> [Type] -> ([Type], [Type])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition Type -> Bool
isIPLikePred [Type]
theta
mk_next :: VarSet -> VarSet
mk_next :: VarSet -> VarSet
mk_next VarSet
so_far = (Type -> VarSet -> VarSet) -> VarSet -> [Type] -> VarSet
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (VarSet -> Type -> VarSet -> VarSet
grow_one VarSet
so_far) VarSet
emptyVarSet [Type]
non_ips
grow_one :: VarSet -> Type -> VarSet -> VarSet
grow_one VarSet
so_far Type
pred VarSet
tcvs
| VarSet
pred_tcvs VarSet -> VarSet -> Bool
`intersectsVarSet` VarSet
so_far = VarSet
tcvs VarSet -> VarSet -> VarSet
`unionVarSet` VarSet
pred_tcvs
| Bool
otherwise = VarSet
tcvs
where
pred_tcvs :: VarSet
pred_tcvs = Type -> VarSet
tyCoVarsOfType Type
pred
simplifyWantedsTcM :: [CtEvidence] -> TcM WantedConstraints
simplifyWantedsTcM :: [CtEvidence] -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
simplifyWantedsTcM [CtEvidence]
wanted
= do { String -> SDoc -> TcM ()
traceTc String
"simplifyWantedsTcM {" ([CtEvidence] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [CtEvidence]
wanted)
; (WantedConstraints
result, EvBindMap
_) <- TcS WantedConstraints -> TcM (WantedConstraints, EvBindMap)
forall a. TcS a -> TcM (a, EvBindMap)
runTcS (WantedConstraints -> TcS WantedConstraints
solveWantedsAndDrop ([CtEvidence] -> WantedConstraints
mkSimpleWC [CtEvidence]
wanted))
; WantedConstraints
result <- WantedConstraints -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
TcM.zonkWC WantedConstraints
result
; String -> SDoc -> TcM ()
traceTc String
"simplifyWantedsTcM }" (WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
result)
; WantedConstraints -> TcRnIf TcGblEnv TcLclEnv WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return WantedConstraints
result }
solveWantedsAndDrop :: WantedConstraints -> TcS WantedConstraints
solveWantedsAndDrop :: WantedConstraints -> TcS WantedConstraints
solveWantedsAndDrop WantedConstraints
wanted
= do { WantedConstraints
wc <- WantedConstraints -> TcS WantedConstraints
solveWanteds WantedConstraints
wanted
; WantedConstraints -> TcS WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return (WantedConstraints -> WantedConstraints
dropDerivedWC WantedConstraints
wc) }
solveWanteds :: WantedConstraints -> TcS WantedConstraints
solveWanteds :: WantedConstraints -> TcS WantedConstraints
solveWanteds wc :: WantedConstraints
wc@(WC { wc_simple :: WantedConstraints -> Cts
wc_simple = Cts
simples, wc_impl :: WantedConstraints -> Bag Implication
wc_impl = Bag Implication
implics, wc_holes :: WantedConstraints -> Bag Hole
wc_holes = Bag Hole
holes })
= do { TcLevel
cur_lvl <- TcS TcLevel
TcS.getTcLevel
; String -> SDoc -> TcS ()
traceTcS String
"solveWanteds {" (SDoc -> TcS ()) -> SDoc -> TcS ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Level =" SDoc -> SDoc -> SDoc
<+> TcLevel -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcLevel
cur_lvl
, WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wc ]
; WantedConstraints
wc1 <- Cts -> TcS WantedConstraints
solveSimpleWanteds Cts
simples
; (Cts
floated_eqs, Bag Implication
implics2) <- Bag Implication -> TcS (Cts, Bag Implication)
solveNestedImplications (Bag Implication -> TcS (Cts, Bag Implication))
-> Bag Implication -> TcS (Cts, Bag Implication)
forall a b. (a -> b) -> a -> b
$
Bag Implication
implics Bag Implication -> Bag Implication -> Bag Implication
forall a. Bag a -> Bag a -> Bag a
`unionBags` WantedConstraints -> Bag Implication
wc_impl WantedConstraints
wc1
; DynFlags
dflags <- TcS DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; WantedConstraints
solved_wc <- Int
-> IntWithInf -> Cts -> WantedConstraints -> TcS WantedConstraints
simpl_loop Int
0 (DynFlags -> IntWithInf
solverIterations DynFlags
dflags) Cts
floated_eqs
(WantedConstraints
wc1 { wc_impl :: Bag Implication
wc_impl = Bag Implication
implics2 })
; Bag Hole
holes' <- Bag Hole -> TcS (Bag Hole)
simplifyHoles Bag Hole
holes
; let final_wc :: WantedConstraints
final_wc = WantedConstraints
solved_wc { wc_holes :: Bag Hole
wc_holes = Bag Hole
holes' }
; EvBindsVar
ev_binds_var <- TcS EvBindsVar
getTcEvBindsVar
; EvBindMap
bb <- EvBindsVar -> TcS EvBindMap
TcS.getTcEvBindsMap EvBindsVar
ev_binds_var
; String -> SDoc -> TcS ()
traceTcS String
"solveWanteds }" (SDoc -> TcS ()) -> SDoc -> TcS ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"final wc =" SDoc -> SDoc -> SDoc
<+> WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
final_wc
, String -> SDoc
text String
"current evbinds =" SDoc -> SDoc -> SDoc
<+> Bag EvBind -> SDoc
forall a. Outputable a => a -> SDoc
ppr (EvBindMap -> Bag EvBind
evBindMapBinds EvBindMap
bb) ]
; WantedConstraints -> TcS WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return WantedConstraints
final_wc }
simpl_loop :: Int -> IntWithInf -> Cts
-> WantedConstraints -> TcS WantedConstraints
simpl_loop :: Int
-> IntWithInf -> Cts -> WantedConstraints -> TcS WantedConstraints
simpl_loop Int
n IntWithInf
limit Cts
floated_eqs wc :: WantedConstraints
wc@(WC { wc_simple :: WantedConstraints -> Cts
wc_simple = Cts
simples })
| Int
n Int -> IntWithInf -> Bool
`intGtLimit` IntWithInf
limit
= do {
SDoc -> TcS ()
addErrTcS (SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"solveWanteds: too many iterations"
SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
parens (String -> SDoc
text String
"limit =" SDoc -> SDoc -> SDoc
<+> IntWithInf -> SDoc
forall a. Outputable a => a -> SDoc
ppr IntWithInf
limit))
Int
2 ([SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Unsolved:" SDoc -> SDoc -> SDoc
<+> WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wc
, Bool -> SDoc -> SDoc
ppUnless (Cts -> Bool
forall a. Bag a -> Bool
isEmptyBag Cts
floated_eqs) (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
"Floated equalities:" SDoc -> SDoc -> SDoc
<+> Cts -> SDoc
forall a. Outputable a => a -> SDoc
ppr Cts
floated_eqs
, String -> SDoc
text String
"Set limit with -fconstraint-solver-iterations=n; n=0 for no limit"
]))
; WantedConstraints -> TcS WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return WantedConstraints
wc }
| Bool -> Bool
not (Cts -> Bool
forall a. Bag a -> Bool
isEmptyBag Cts
floated_eqs)
= Int
-> IntWithInf -> Bool -> WantedConstraints -> TcS WantedConstraints
simplify_again Int
n IntWithInf
limit Bool
True (WantedConstraints
wc { wc_simple :: Cts
wc_simple = Cts
floated_eqs Cts -> Cts -> Cts
forall a. Bag a -> Bag a -> Bag a
`unionBags` Cts
simples })
| WantedConstraints -> Bool
superClassesMightHelp WantedConstraints
wc
=
do { [Ct]
pending_given <- TcS [Ct]
getPendingGivenScs
; let ([Ct]
pending_wanted, Cts
simples1) = Cts -> ([Ct], Cts)
getPendingWantedScs Cts
simples
; if [Ct] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Ct]
pending_given Bool -> Bool -> Bool
&& [Ct] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Ct]
pending_wanted
then WantedConstraints -> TcS WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return WantedConstraints
wc
else
do { [Ct]
new_given <- [Ct] -> TcS [Ct]
makeSuperClasses [Ct]
pending_given
; [Ct]
new_wanted <- [Ct] -> TcS [Ct]
makeSuperClasses [Ct]
pending_wanted
; [Ct] -> TcS ()
solveSimpleGivens [Ct]
new_given
; Int
-> IntWithInf -> Bool -> WantedConstraints -> TcS WantedConstraints
simplify_again Int
n IntWithInf
limit ([Ct] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Ct]
pending_given)
WantedConstraints
wc { wc_simple :: Cts
wc_simple = Cts
simples1 Cts -> Cts -> Cts
forall a. Bag a -> Bag a -> Bag a
`unionBags` [Ct] -> Cts
forall a. [a] -> Bag a
listToBag [Ct]
new_wanted } } }
| Bool
otherwise
= WantedConstraints -> TcS WantedConstraints
forall (m :: * -> *) a. Monad m => a -> m a
return WantedConstraints
wc
simplify_again :: Int -> IntWithInf -> Bool
-> WantedConstraints -> TcS WantedConstraints
simplify_again :: Int
-> IntWithInf -> Bool -> WantedConstraints -> TcS WantedConstraints
simplify_again Int
n IntWithInf
limit Bool
no_new_given_scs
wc :: WantedConstraints
wc@(WC { wc_simple :: WantedConstraints -> Cts
wc_simple = Cts
simples, wc_impl :: WantedConstraints -> Bag Implication
wc_impl = Bag Implication
implics })
= do { SDoc -> TcS ()
csTraceTcS (SDoc -> TcS ()) -> SDoc -> TcS ()
forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
"simpl_loop iteration=" SDoc -> SDoc -> SDoc
<> Int -> SDoc
int Int
n
SDoc -> SDoc -> SDoc
<+> (SDoc -> SDoc
parens (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
hsep [ String -> SDoc
text String
"no new given superclasses =" SDoc -> SDoc -> SDoc
<+> Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
no_new_given_scs SDoc -> SDoc -> SDoc
<> SDoc
comma
, Int -> SDoc
int (Cts -> Int
forall a. Bag a -> Int
lengthBag Cts
simples) SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"simples to solve" ])
; String -> SDoc -> TcS ()
traceTcS String
"simpl_loop: wc =" (WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wc)
; (Int
unifs1, WantedConstraints
wc1) <- TcS WantedConstraints -> TcS (Int, WantedConstraints)
forall a. TcS a -> TcS (Int, a)
reportUnifications (TcS WantedConstraints -> TcS (Int, WantedConstraints))
-> TcS WantedConstraints -> TcS (Int, WantedConstraints)
forall a b. (a -> b) -> a -> b
$
Cts -> TcS WantedConstraints
solveSimpleWanteds (Cts -> TcS WantedConstraints) -> Cts -> TcS WantedConstraints
forall a b. (a -> b) -> a -> b
$
Cts
simples
; let new_implics :: Bag Implication
new_implics = WantedConstraints -> Bag Implication
wc_impl WantedConstraints
wc1
; if Int
unifs1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 Bool -> Bool -> Bool
&&
Bool
no_new_given_scs Bool -> Bool -> Bool
&&
Bag Implication -> Bool
forall a. Bag a -> Bool
isEmptyBag Bag Implication
new_implics
then
Int
-> IntWithInf -> Cts -> WantedConstraints -> TcS WantedConstraints
simpl_loop (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) IntWithInf
limit Cts
forall a. Bag a
emptyBag (WantedConstraints
wc1 { wc_impl :: Bag Implication
wc_impl = Bag Implication
implics })
else
do { (Cts
floated_eqs2, Bag Implication
implics2) <- Bag Implication -> TcS (Cts, Bag Implication)
solveNestedImplications (Bag Implication -> TcS (Cts, Bag Implication))
-> Bag Implication -> TcS (Cts, Bag Implication)
forall a b. (a -> b) -> a -> b
$
Bag Implication
implics Bag Implication -> Bag Implication -> Bag Implication
forall a. Bag a -> Bag a -> Bag a
`unionBags` Bag Implication
new_implics
; Int
-> IntWithInf -> Cts -> WantedConstraints -> TcS WantedConstraints
simpl_loop (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) IntWithInf
limit Cts
floated_eqs2 (WantedConstraints
wc1 { wc_impl :: Bag Implication
wc_impl = Bag Implication
implics2 })
} }
solveNestedImplications :: Bag Implication
-> TcS (Cts, Bag Implication)
solveNestedImplications :: Bag Implication -> TcS (Cts, Bag Implication)
solveNestedImplications Bag Implication
implics
| Bag Implication -> Bool
forall a. Bag a -> Bool
isEmptyBag Bag Implication
implics
= (Cts, Bag Implication) -> TcS (Cts, Bag Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (Cts
forall a. Bag a
emptyBag, Bag Implication
forall a. Bag a
emptyBag)
| Bool
otherwise
= do { String -> SDoc -> TcS ()
traceTcS String
"solveNestedImplications starting {" SDoc
empty
; (Bag Cts
floated_eqs_s, Bag (Maybe Implication)
unsolved_implics) <- (Implication -> TcS (Cts, Maybe Implication))
-> Bag Implication -> TcS (Bag Cts, Bag (Maybe Implication))
forall (m :: * -> *) a b c.
Monad m =>
(a -> m (b, c)) -> Bag a -> m (Bag b, Bag c)
mapAndUnzipBagM Implication -> TcS (Cts, Maybe Implication)
solveImplication Bag Implication
implics
; let floated_eqs :: Cts
floated_eqs = Bag Cts -> Cts
forall a. Bag (Bag a) -> Bag a
concatBag Bag Cts
floated_eqs_s
; String -> SDoc -> TcS ()
traceTcS String
"solveNestedImplications end }" (SDoc -> TcS ()) -> SDoc -> TcS ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"all floated_eqs =" SDoc -> SDoc -> SDoc
<+> Cts -> SDoc
forall a. Outputable a => a -> SDoc
ppr Cts
floated_eqs
, String -> SDoc
text String
"unsolved_implics =" SDoc -> SDoc -> SDoc
<+> Bag (Maybe Implication) -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bag (Maybe Implication)
unsolved_implics ]
; (Cts, Bag Implication) -> TcS (Cts, Bag Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (Cts
floated_eqs, Bag (Maybe Implication) -> Bag Implication
forall a. Bag (Maybe a) -> Bag a
catBagMaybes Bag (Maybe Implication)
unsolved_implics) }
solveImplication :: Implication
-> TcS (Cts,
Maybe Implication)
solveImplication :: Implication -> TcS (Cts, Maybe Implication)
solveImplication imp :: Implication
imp@(Implic { ic_tclvl :: Implication -> TcLevel
ic_tclvl = TcLevel
tclvl
, ic_binds :: Implication -> EvBindsVar
ic_binds = EvBindsVar
ev_binds_var
, ic_skols :: Implication -> [TcTyVar]
ic_skols = [TcTyVar]
skols
, ic_given :: Implication -> [TcTyVar]
ic_given = [TcTyVar]
given_ids
, ic_wanted :: Implication -> WantedConstraints
ic_wanted = WantedConstraints
wanteds
, ic_info :: Implication -> SkolemInfo
ic_info = SkolemInfo
info
, ic_status :: Implication -> ImplicStatus
ic_status = ImplicStatus
status })
| ImplicStatus -> Bool
isSolvedStatus ImplicStatus
status
= (Cts, Maybe Implication) -> TcS (Cts, Maybe Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (Cts
emptyCts, Implication -> Maybe Implication
forall a. a -> Maybe a
Just Implication
imp)
| Bool
otherwise
= do { InertSet
inerts <- TcS InertSet
getTcSInerts
; String -> SDoc -> TcS ()
traceTcS String
"solveImplication {" (Implication -> SDoc
forall a. Outputable a => a -> SDoc
ppr Implication
imp SDoc -> SDoc -> SDoc
$$ String -> SDoc
text String
"Inerts" SDoc -> SDoc -> SDoc
<+> InertSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr InertSet
inerts)
; (Bool
no_given_eqs, Cts
given_insols, WantedConstraints
residual_wanted)
<- EvBindsVar
-> TcLevel
-> TcS (Bool, Cts, WantedConstraints)
-> TcS (Bool, Cts, WantedConstraints)
forall a. EvBindsVar -> TcLevel -> TcS a -> TcS a
nestImplicTcS EvBindsVar
ev_binds_var TcLevel
tclvl (TcS (Bool, Cts, WantedConstraints)
-> TcS (Bool, Cts, WantedConstraints))
-> TcS (Bool, Cts, WantedConstraints)
-> TcS (Bool, Cts, WantedConstraints)
forall a b. (a -> b) -> a -> b
$
do { let loc :: CtLoc
loc = TcLevel -> SkolemInfo -> TcLclEnv -> CtLoc
mkGivenLoc TcLevel
tclvl SkolemInfo
info (Implication -> TcLclEnv
ic_env Implication
imp)
givens :: [Ct]
givens = CtLoc -> [TcTyVar] -> [Ct]
mkGivens CtLoc
loc [TcTyVar]
given_ids
; [Ct] -> TcS ()
solveSimpleGivens [Ct]
givens
; WantedConstraints
residual_wanted <- WantedConstraints -> TcS WantedConstraints
solveWanteds WantedConstraints
wanteds
; (Bool
no_eqs, Cts
given_insols) <- TcLevel -> [TcTyVar] -> TcS (Bool, Cts)
getNoGivenEqs TcLevel
tclvl [TcTyVar]
skols
; (Bool, Cts, WantedConstraints)
-> TcS (Bool, Cts, WantedConstraints)
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
no_eqs, Cts
given_insols, WantedConstraints
residual_wanted) }
; (Cts
floated_eqs, WantedConstraints
residual_wanted)
<- [TcTyVar]
-> [TcTyVar]
-> EvBindsVar
-> Bool
-> WantedConstraints
-> TcS (Cts, WantedConstraints)
floatEqualities [TcTyVar]
skols [TcTyVar]
given_ids EvBindsVar
ev_binds_var
Bool
no_given_eqs WantedConstraints
residual_wanted
; String -> SDoc -> TcS ()
traceTcS String
"solveImplication 2"
(Cts -> SDoc
forall a. Outputable a => a -> SDoc
ppr Cts
given_insols SDoc -> SDoc -> SDoc
$$ WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
residual_wanted)
; let final_wanted :: WantedConstraints
final_wanted = WantedConstraints
residual_wanted WantedConstraints -> Cts -> WantedConstraints
`addInsols` Cts
given_insols
; Maybe Implication
res_implic <- Implication -> TcS (Maybe Implication)
setImplicationStatus (Implication
imp { ic_no_eqs :: Bool
ic_no_eqs = Bool
no_given_eqs
, ic_wanted :: WantedConstraints
ic_wanted = WantedConstraints
final_wanted })
; EvBindMap
evbinds <- EvBindsVar -> TcS EvBindMap
TcS.getTcEvBindsMap EvBindsVar
ev_binds_var
; VarSet
tcvs <- EvBindsVar -> TcS VarSet
TcS.getTcEvTyCoVars EvBindsVar
ev_binds_var
; String -> SDoc -> TcS ()
traceTcS String
"solveImplication end }" (SDoc -> TcS ()) -> SDoc -> TcS ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"no_given_eqs =" SDoc -> SDoc -> SDoc
<+> Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
no_given_eqs
, String -> SDoc
text String
"floated_eqs =" SDoc -> SDoc -> SDoc
<+> Cts -> SDoc
forall a. Outputable a => a -> SDoc
ppr Cts
floated_eqs
, String -> SDoc
text String
"res_implic =" SDoc -> SDoc -> SDoc
<+> Maybe Implication -> SDoc
forall a. Outputable a => a -> SDoc
ppr Maybe Implication
res_implic
, String -> SDoc
text String
"implication evbinds =" SDoc -> SDoc -> SDoc
<+> Bag EvBind -> SDoc
forall a. Outputable a => a -> SDoc
ppr (EvBindMap -> Bag EvBind
evBindMapBinds EvBindMap
evbinds)
, String -> SDoc
text String
"implication tvcs =" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
tcvs ]
; (Cts, Maybe Implication) -> TcS (Cts, Maybe Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (Cts
floated_eqs, Maybe Implication
res_implic) }
where
setImplicationStatus :: Implication -> TcS (Maybe Implication)
setImplicationStatus :: Implication -> TcS (Maybe Implication)
setImplicationStatus implic :: Implication
implic@(Implic { ic_status :: Implication -> ImplicStatus
ic_status = ImplicStatus
status
, ic_info :: Implication -> SkolemInfo
ic_info = SkolemInfo
info
, ic_wanted :: Implication -> WantedConstraints
ic_wanted = WantedConstraints
wc
, ic_given :: Implication -> [TcTyVar]
ic_given = [TcTyVar]
givens })
| ASSERT2( not (isSolvedStatus status ), ppr info )
Bool -> Bool
not (WantedConstraints -> Bool
isSolvedWC WantedConstraints
pruned_wc)
= do { String -> SDoc -> TcS ()
traceTcS String
"setImplicationStatus(not-all-solved) {" (Implication -> SDoc
forall a. Outputable a => a -> SDoc
ppr Implication
implic)
; Implication
implic <- Implication -> TcS Implication
neededEvVars Implication
implic
; let new_status :: ImplicStatus
new_status | WantedConstraints -> Bool
insolubleWC WantedConstraints
pruned_wc = ImplicStatus
IC_Insoluble
| Bool
otherwise = ImplicStatus
IC_Unsolved
new_implic :: Implication
new_implic = Implication
implic { ic_status :: ImplicStatus
ic_status = ImplicStatus
new_status
, ic_wanted :: WantedConstraints
ic_wanted = WantedConstraints
pruned_wc }
; String -> SDoc -> TcS ()
traceTcS String
"setImplicationStatus(not-all-solved) }" (Implication -> SDoc
forall a. Outputable a => a -> SDoc
ppr Implication
new_implic)
; Maybe Implication -> TcS (Maybe Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Implication -> TcS (Maybe Implication))
-> Maybe Implication -> TcS (Maybe Implication)
forall a b. (a -> b) -> a -> b
$ Implication -> Maybe Implication
forall a. a -> Maybe a
Just Implication
new_implic }
| Bool
otherwise
= do { String -> SDoc -> TcS ()
traceTcS String
"setImplicationStatus(all-solved) {" (Implication -> SDoc
forall a. Outputable a => a -> SDoc
ppr Implication
implic)
; implic :: Implication
implic@(Implic { ic_need_inner :: Implication -> VarSet
ic_need_inner = VarSet
need_inner
, ic_need_outer :: Implication -> VarSet
ic_need_outer = VarSet
need_outer }) <- Implication -> TcS Implication
neededEvVars Implication
implic
; Bool
bad_telescope <- Implication -> TcS Bool
checkBadTelescope Implication
implic
; let dead_givens :: [TcTyVar]
dead_givens | SkolemInfo -> Bool
warnRedundantGivens SkolemInfo
info
= (TcTyVar -> Bool) -> [TcTyVar] -> [TcTyVar]
forall a. (a -> Bool) -> [a] -> [a]
filterOut (TcTyVar -> VarSet -> Bool
`elemVarSet` VarSet
need_inner) [TcTyVar]
givens
| Bool
otherwise = []
discard_entire_implication :: Bool
discard_entire_implication
= [TcTyVar] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcTyVar]
dead_givens
Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
bad_telescope
Bool -> Bool -> Bool
&& WantedConstraints -> Bool
isEmptyWC WantedConstraints
pruned_wc
Bool -> Bool -> Bool
&& VarSet -> Bool
isEmptyVarSet VarSet
need_outer
final_status :: ImplicStatus
final_status
| Bool
bad_telescope = ImplicStatus
IC_BadTelescope
| Bool
otherwise = IC_Solved :: [TcTyVar] -> ImplicStatus
IC_Solved { ics_dead :: [TcTyVar]
ics_dead = [TcTyVar]
dead_givens }
final_implic :: Implication
final_implic = Implication
implic { ic_status :: ImplicStatus
ic_status = ImplicStatus
final_status
, ic_wanted :: WantedConstraints
ic_wanted = WantedConstraints
pruned_wc }
; String -> SDoc -> TcS ()
traceTcS String
"setImplicationStatus(all-solved) }" (SDoc -> TcS ()) -> SDoc -> TcS ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"discard:" SDoc -> SDoc -> SDoc
<+> Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
discard_entire_implication
, String -> SDoc
text String
"new_implic:" SDoc -> SDoc -> SDoc
<+> Implication -> SDoc
forall a. Outputable a => a -> SDoc
ppr Implication
final_implic ]
; Maybe Implication -> TcS (Maybe Implication)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Implication -> TcS (Maybe Implication))
-> Maybe Implication -> TcS (Maybe Implication)
forall a b. (a -> b) -> a -> b
$ if Bool
discard_entire_implication
then Maybe Implication
forall a. Maybe a
Nothing
else Implication -> Maybe Implication
forall a. a -> Maybe a
Just Implication
final_implic }
where
WC { wc_simple :: WantedConstraints -> Cts
wc_simple = Cts
simples, wc_impl :: WantedConstraints -> Bag Implication
wc_impl = Bag Implication
implics, wc_holes :: WantedConstraints -> Bag Hole
wc_holes = Bag Hole
holes } = WantedConstraints
wc
pruned_simples :: Cts
pruned_simples = Cts -> Cts
dropDerivedSimples Cts
simples
pruned_implics :: Bag Implication
pruned_implics = (Implication -> Bool) -> Bag Implication -> Bag Implication
forall a. (a -> Bool) -> Bag a -> Bag a
filterBag Implication -> Bool
keep_me Bag Implication
implics
pruned_wc :: WantedConstraints
pruned_wc = WC :: Cts -> Bag Implication -> Bag Hole -> WantedConstraints
WC { wc_simple :: Cts
wc_simple = Cts
pruned_simples
, wc_impl :: Bag Implication
wc_impl = Bag Implication
pruned_implics
, wc_holes :: Bag Hole
wc_holes = Bag Hole
holes }
keep_me :: Implication -> Bool
keep_me :: Implication -> Bool
keep_me Implication
ic
| IC_Solved { ics_dead :: ImplicStatus -> [TcTyVar]
ics_dead = [TcTyVar]
dead_givens } <- Implication -> ImplicStatus
ic_status Implication
ic
, [TcTyVar] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcTyVar]
dead_givens
, Bag Implication -> Bool
forall a. Bag a -> Bool
isEmptyBag (WantedConstraints -> Bag Implication
wc_impl (Implication -> WantedConstraints
ic_wanted Implication
ic))
= Bool
False
| Bool
otherwise
= Bool
True
checkBadTelescope :: Implication -> TcS Bool
checkBadTelescope :: Implication -> TcS Bool
checkBadTelescope (Implic { ic_info :: Implication -> SkolemInfo
ic_info = SkolemInfo
info
, ic_skols :: Implication -> [TcTyVar]
ic_skols = [TcTyVar]
skols })
| ForAllSkol {} <- SkolemInfo
info
= do{ [TcTyVar]
skols <- (TcTyVar -> TcS TcTyVar) -> [TcTyVar] -> TcS [TcTyVar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM TcTyVar -> TcS TcTyVar
TcS.zonkTyCoVarKind [TcTyVar]
skols
; Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (VarSet -> [TcTyVar] -> Bool
go VarSet
emptyVarSet ([TcTyVar] -> [TcTyVar]
forall a. [a] -> [a]
reverse [TcTyVar]
skols))}
| Bool
otherwise
= Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
where
go :: TyVarSet
-> [TcTyVar]
-> Bool
go :: VarSet -> [TcTyVar] -> Bool
go VarSet
_ [] = Bool
False
go VarSet
later_skols (TcTyVar
one_skol : [TcTyVar]
earlier_skols)
| Type -> VarSet
tyCoVarsOfType (TcTyVar -> Type
tyVarKind TcTyVar
one_skol) VarSet -> VarSet -> Bool
`intersectsVarSet` VarSet
later_skols
= Bool
True
| Bool
otherwise
= VarSet -> [TcTyVar] -> Bool
go (VarSet
later_skols VarSet -> TcTyVar -> VarSet
`extendVarSet` TcTyVar
one_skol) [TcTyVar]
earlier_skols
warnRedundantGivens :: SkolemInfo -> Bool
warnRedundantGivens :: SkolemInfo -> Bool
warnRedundantGivens (SigSkol UserTypeCtxt
ctxt Type
_ [(Name, TcTyVar)]
_)
= case UserTypeCtxt
ctxt of
FunSigCtxt Name
_ Bool
warn_redundant -> Bool
warn_redundant
UserTypeCtxt
ExprSigCtxt -> Bool
True
UserTypeCtxt
_ -> Bool
False
warnRedundantGivens (InstSkol {}) = Bool
True
warnRedundantGivens SkolemInfo
_ = Bool
False
neededEvVars :: Implication -> TcS Implication
neededEvVars :: Implication -> TcS Implication
neededEvVars implic :: Implication
implic@(Implic { ic_given :: Implication -> [TcTyVar]
ic_given = [TcTyVar]
givens
, ic_binds :: Implication -> EvBindsVar
ic_binds = EvBindsVar
ev_binds_var
, ic_wanted :: Implication -> WantedConstraints
ic_wanted = WC { wc_impl :: WantedConstraints -> Bag Implication
wc_impl = Bag Implication
implics }
, ic_need_inner :: Implication -> VarSet
ic_need_inner = VarSet
old_needs })
= do { EvBindMap
ev_binds <- EvBindsVar -> TcS EvBindMap
TcS.getTcEvBindsMap EvBindsVar
ev_binds_var
; VarSet
tcvs <- EvBindsVar -> TcS VarSet
TcS.getTcEvTyCoVars EvBindsVar
ev_binds_var
; let seeds1 :: VarSet
seeds1 = (Implication -> VarSet -> VarSet)
-> VarSet -> Bag Implication -> VarSet
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Implication -> VarSet -> VarSet
add_implic_seeds VarSet
old_needs Bag Implication
implics
seeds2 :: VarSet
seeds2 = (EvBind -> VarSet -> VarSet) -> VarSet -> EvBindMap -> VarSet
forall a. (EvBind -> a -> a) -> a -> EvBindMap -> a
nonDetStrictFoldEvBindMap EvBind -> VarSet -> VarSet
add_wanted VarSet
seeds1 EvBindMap
ev_binds
seeds3 :: VarSet
seeds3 = VarSet
seeds2 VarSet -> VarSet -> VarSet
`unionVarSet` VarSet
tcvs
need_inner :: VarSet
need_inner = EvBindMap -> VarSet -> VarSet
findNeededEvVars EvBindMap
ev_binds VarSet
seeds3
live_ev_binds :: EvBindMap
live_ev_binds = (EvBind -> Bool) -> EvBindMap -> EvBindMap
filterEvBindMap (VarSet -> EvBind -> Bool
needed_ev_bind VarSet
need_inner) EvBindMap
ev_binds
need_outer :: VarSet
need_outer = VarSet -> EvBindMap -> VarSet
varSetMinusEvBindMap VarSet
need_inner EvBindMap
live_ev_binds
VarSet -> [TcTyVar] -> VarSet
`delVarSetList` [TcTyVar]
givens
; EvBindsVar -> EvBindMap -> TcS ()
TcS.setTcEvBindsMap EvBindsVar
ev_binds_var EvBindMap
live_ev_binds
; String -> SDoc -> TcS ()
traceTcS String
"neededEvVars" (SDoc -> TcS ()) -> SDoc -> TcS ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"old_needs:" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
old_needs
, String -> SDoc
text String
"seeds3:" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
seeds3
, String -> SDoc
text String
"tcvs:" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
tcvs
, String -> SDoc
text String
"ev_binds:" SDoc -> SDoc -> SDoc
<+> EvBindMap -> SDoc
forall a. Outputable a => a -> SDoc
ppr EvBindMap
ev_binds
, String -> SDoc
text String
"live_ev_binds:" SDoc -> SDoc -> SDoc
<+> EvBindMap -> SDoc
forall a. Outputable a => a -> SDoc
ppr EvBindMap
live_ev_binds ]
; Implication -> TcS Implication
forall (m :: * -> *) a. Monad m => a -> m a
return (Implication
implic { ic_need_inner :: VarSet
ic_need_inner = VarSet
need_inner
, ic_need_outer :: VarSet
ic_need_outer = VarSet
need_outer }) }
where
add_implic_seeds :: Implication -> VarSet -> VarSet
add_implic_seeds (Implic { ic_need_outer :: Implication -> VarSet
ic_need_outer = VarSet
needs }) VarSet
acc
= VarSet
needs VarSet -> VarSet -> VarSet
`unionVarSet` VarSet
acc
needed_ev_bind :: VarSet -> EvBind -> Bool
needed_ev_bind VarSet
needed (EvBind { eb_lhs :: EvBind -> TcTyVar
eb_lhs = TcTyVar
ev_var
, eb_is_given :: EvBind -> Bool
eb_is_given = Bool
is_given })
| Bool
is_given = TcTyVar
ev_var TcTyVar -> VarSet -> Bool
`elemVarSet` VarSet
needed
| Bool
otherwise = Bool
True
add_wanted :: EvBind -> VarSet -> VarSet
add_wanted :: EvBind -> VarSet -> VarSet
add_wanted (EvBind { eb_is_given :: EvBind -> Bool
eb_is_given = Bool
is_given, eb_rhs :: EvBind -> EvTerm
eb_rhs = EvTerm
rhs }) VarSet
needs
| Bool
is_given = VarSet
needs
| Bool
otherwise = EvTerm -> VarSet
evVarsOfTerm EvTerm
rhs VarSet -> VarSet -> VarSet
`unionVarSet` VarSet
needs
simplifyHoles :: Bag Hole -> TcS (Bag Hole)
simplifyHoles :: Bag Hole -> TcS (Bag Hole)
simplifyHoles = (Hole -> TcS Hole) -> Bag Hole -> TcS (Bag Hole)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Bag a -> m (Bag b)
mapBagM Hole -> TcS Hole
simpl_hole
where
simpl_hole :: Hole -> TcS Hole
simpl_hole :: Hole -> TcS Hole
simpl_hole h :: Hole
h@(Hole { hole_ty :: Hole -> Type
hole_ty = Type
ty, hole_loc :: Hole -> CtLoc
hole_loc = CtLoc
loc })
= do { Type
ty' <- CtLoc -> Type -> TcS Type
flattenType CtLoc
loc Type
ty
; Hole -> TcS Hole
forall (m :: * -> *) a. Monad m => a -> m a
return (Hole
h { hole_ty :: Type
hole_ty = Type
ty' }) }
promoteTyVarTcS :: TcTyVar -> TcS ()
promoteTyVarTcS :: TcTyVar -> TcS ()
promoteTyVarTcS TcTyVar
tv
= do { TcLevel
tclvl <- TcS TcLevel
TcS.getTcLevel
; Bool -> TcS () -> TcS ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TcLevel -> TcTyVar -> Bool
isFloatedTouchableMetaTyVar TcLevel
tclvl TcTyVar
tv) (TcS () -> TcS ()) -> TcS () -> TcS ()
forall a b. (a -> b) -> a -> b
$
do { TcTyVar
cloned_tv <- TcTyVar -> TcS TcTyVar
TcS.cloneMetaTyVar TcTyVar
tv
; let rhs_tv :: TcTyVar
rhs_tv = TcTyVar -> TcLevel -> TcTyVar
setMetaTyVarTcLevel TcTyVar
cloned_tv TcLevel
tclvl
; TcTyVar -> Type -> TcS ()
unifyTyVar TcTyVar
tv (TcTyVar -> Type
mkTyVarTy TcTyVar
rhs_tv) } }
defaultTyVarTcS :: TcTyVar -> TcS Bool
defaultTyVarTcS :: TcTyVar -> TcS Bool
defaultTyVarTcS TcTyVar
the_tv
| TcTyVar -> Bool
isRuntimeRepVar TcTyVar
the_tv
, Bool -> Bool
not (TcTyVar -> Bool
isTyVarTyVar TcTyVar
the_tv)
= do { String -> SDoc -> TcS ()
traceTcS String
"defaultTyVarTcS RuntimeRep" (TcTyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcTyVar
the_tv)
; TcTyVar -> Type -> TcS ()
unifyTyVar TcTyVar
the_tv Type
liftedRepTy
; Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True }
| TcTyVar -> Bool
isMultiplicityVar TcTyVar
the_tv
, Bool -> Bool
not (TcTyVar -> Bool
isTyVarTyVar TcTyVar
the_tv)
= do { String -> SDoc -> TcS ()
traceTcS String
"defaultTyVarTcS Multiplicity" (TcTyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcTyVar
the_tv)
; TcTyVar -> Type -> TcS ()
unifyTyVar TcTyVar
the_tv Type
manyDataConTy
; Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True }
| Bool
otherwise
= Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
approximateWC :: Bool -> WantedConstraints -> Cts
approximateWC :: Bool -> WantedConstraints -> Cts
approximateWC Bool
float_past_equalities WantedConstraints
wc
= VarSet -> WantedConstraints -> Cts
float_wc VarSet
emptyVarSet WantedConstraints
wc
where
float_wc :: TcTyCoVarSet -> WantedConstraints -> Cts
float_wc :: VarSet -> WantedConstraints -> Cts
float_wc VarSet
trapping_tvs (WC { wc_simple :: WantedConstraints -> Cts
wc_simple = Cts
simples, wc_impl :: WantedConstraints -> Bag Implication
wc_impl = Bag Implication
implics })
= (Ct -> Bool) -> Cts -> Cts
forall a. (a -> Bool) -> Bag a -> Bag a
filterBag (VarSet -> Ct -> Bool
is_floatable VarSet
trapping_tvs) Cts
simples Cts -> Cts -> Cts
forall a. Bag a -> Bag a -> Bag a
`unionBags`
(Implication -> Cts) -> Bag Implication -> Cts
forall a b. (a -> Bag b) -> Bag a -> Bag b
concatMapBag (VarSet -> Implication -> Cts
float_implic VarSet
trapping_tvs) Bag Implication
implics
where
float_implic :: TcTyCoVarSet -> Implication -> Cts
float_implic :: VarSet -> Implication -> Cts
float_implic VarSet
trapping_tvs Implication
imp
| Bool
float_past_equalities Bool -> Bool -> Bool
|| Implication -> Bool
ic_no_eqs Implication
imp
= VarSet -> WantedConstraints -> Cts
float_wc VarSet
new_trapping_tvs (Implication -> WantedConstraints
ic_wanted Implication
imp)
| Bool
otherwise
= Cts
emptyCts
where
new_trapping_tvs :: VarSet
new_trapping_tvs = VarSet
trapping_tvs VarSet -> [TcTyVar] -> VarSet
`extendVarSetList` Implication -> [TcTyVar]
ic_skols Implication
imp
is_floatable :: VarSet -> Ct -> Bool
is_floatable VarSet
skol_tvs Ct
ct
| Ct -> Bool
isGivenCt Ct
ct = Bool
False
| Ct -> Bool
insolubleEqCt Ct
ct = Bool
False
| Bool
otherwise = Ct -> VarSet
tyCoVarsOfCt Ct
ct VarSet -> VarSet -> Bool
`disjointVarSet` VarSet
skol_tvs
floatEqualities :: [TcTyVar] -> [EvId] -> EvBindsVar -> Bool
-> WantedConstraints
-> TcS (Cts, WantedConstraints)
floatEqualities :: [TcTyVar]
-> [TcTyVar]
-> EvBindsVar
-> Bool
-> WantedConstraints
-> TcS (Cts, WantedConstraints)
floatEqualities [TcTyVar]
skols [TcTyVar]
given_ids EvBindsVar
ev_binds_var Bool
no_given_eqs
wanteds :: WantedConstraints
wanteds@(WC { wc_simple :: WantedConstraints -> Cts
wc_simple = Cts
simples })
| Bool -> Bool
not Bool
no_given_eqs
= (Cts, WantedConstraints) -> TcS (Cts, WantedConstraints)
forall (m :: * -> *) a. Monad m => a -> m a
return (Cts
forall a. Bag a
emptyBag, WantedConstraints
wanteds)
| Bool
otherwise
= do {
Cts
simples <- Cts -> TcS Cts
TcS.zonkSimples Cts
simples
; EvBindMap
binds <- EvBindsVar -> TcS EvBindMap
TcS.getTcEvBindsMap EvBindsVar
ev_binds_var
; let (Cts
candidate_eqs, Cts
no_float_cts) = (Ct -> Bool) -> Cts -> (Cts, Cts)
forall a. (a -> Bool) -> Bag a -> (Bag a, Bag a)
partitionBag Ct -> Bool
is_float_eq_candidate Cts
simples
seed_skols :: VarSet
seed_skols = [TcTyVar] -> VarSet
mkVarSet [TcTyVar]
skols VarSet -> VarSet -> VarSet
`unionVarSet`
[TcTyVar] -> VarSet
mkVarSet [TcTyVar]
given_ids VarSet -> VarSet -> VarSet
`unionVarSet`
(Ct -> VarSet -> VarSet) -> VarSet -> Cts -> VarSet
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Ct -> VarSet -> VarSet
add_non_flt_ct VarSet
emptyVarSet Cts
no_float_cts VarSet -> VarSet -> VarSet
`unionVarSet`
EvBindMap -> VarSet
evBindMapToVarSet EvBindMap
binds
extended_skols :: VarSet
extended_skols = (VarSet -> VarSet) -> VarSet -> VarSet
transCloVarSet (Cts -> VarSet -> VarSet
add_captured_ev_ids Cts
candidate_eqs) VarSet
seed_skols
(Cts
flt_eqs, Cts
no_flt_eqs) = (Ct -> Bool) -> Cts -> (Cts, Cts)
forall a. (a -> Bool) -> Bag a -> (Bag a, Bag a)
partitionBag (VarSet -> Ct -> Bool
is_floatable VarSet
extended_skols)
Cts
candidate_eqs
remaining_simples :: Cts
remaining_simples = Cts
no_float_cts Cts -> Cts -> Cts
`andCts` Cts
no_flt_eqs
; (TcTyVar -> TcS ()) -> [TcTyVar] -> TcS ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ TcTyVar -> TcS ()
promoteTyVarTcS (Cts -> [TcTyVar]
tyCoVarsOfCtsList Cts
flt_eqs)
; String -> SDoc -> TcS ()
traceTcS String
"floatEqualities" ([SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Skols =" SDoc -> SDoc -> SDoc
<+> [TcTyVar] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TcTyVar]
skols
, String -> SDoc
text String
"Extended skols =" SDoc -> SDoc -> SDoc
<+> VarSet -> SDoc
forall a. Outputable a => a -> SDoc
ppr VarSet
extended_skols
, String -> SDoc
text String
"Simples =" SDoc -> SDoc -> SDoc
<+> Cts -> SDoc
forall a. Outputable a => a -> SDoc
ppr Cts
simples
, String -> SDoc
text String
"Candidate eqs =" SDoc -> SDoc -> SDoc
<+> Cts -> SDoc
forall a. Outputable a => a -> SDoc
ppr Cts
candidate_eqs
, String -> SDoc
text String
"Floated eqs =" SDoc -> SDoc -> SDoc
<+> Cts -> SDoc
forall a. Outputable a => a -> SDoc
ppr Cts
flt_eqs])
; (Cts, WantedConstraints) -> TcS (Cts, WantedConstraints)
forall (m :: * -> *) a. Monad m => a -> m a
return ( Cts
flt_eqs, WantedConstraints
wanteds { wc_simple :: Cts
wc_simple = Cts
remaining_simples } ) }
where
add_non_flt_ct :: Ct -> VarSet -> VarSet
add_non_flt_ct :: Ct -> VarSet -> VarSet
add_non_flt_ct Ct
ct VarSet
acc | Ct -> Bool
isDerivedCt Ct
ct = VarSet
acc
| Bool
otherwise = VarSet -> TcTyVar -> VarSet
extendVarSet VarSet
acc (Ct -> TcTyVar
ctEvId Ct
ct)
is_floatable :: VarSet -> Ct -> Bool
is_floatable :: VarSet -> Ct -> Bool
is_floatable VarSet
skols Ct
ct
| Ct -> Bool
isDerivedCt Ct
ct = Ct -> VarSet
tyCoVarsOfCt Ct
ct VarSet -> VarSet -> Bool
`disjointVarSet` VarSet
skols
| Bool
otherwise = Bool -> Bool
not (Ct -> TcTyVar
ctEvId Ct
ct TcTyVar -> VarSet -> Bool
`elemVarSet` VarSet
skols)
add_captured_ev_ids :: Cts -> VarSet -> VarSet
add_captured_ev_ids :: Cts -> VarSet -> VarSet
add_captured_ev_ids Cts
cts VarSet
skols = (Ct -> VarSet -> VarSet) -> VarSet -> Cts -> VarSet
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Ct -> VarSet -> VarSet
extra_skol VarSet
emptyVarSet Cts
cts
where
extra_skol :: Ct -> VarSet -> VarSet
extra_skol Ct
ct VarSet
acc
| Ct -> Bool
isDerivedCt Ct
ct = VarSet
acc
| Ct -> VarSet
tyCoVarsOfCt Ct
ct VarSet -> VarSet -> Bool
`intersectsVarSet` VarSet
skols = VarSet -> TcTyVar -> VarSet
extendVarSet VarSet
acc (Ct -> TcTyVar
ctEvId Ct
ct)
| Bool
otherwise = VarSet
acc
is_float_eq_candidate :: Ct -> Bool
is_float_eq_candidate Ct
ct
| Type
pred <- Ct -> Type
ctPred Ct
ct
, EqPred EqRel
NomEq Type
ty1 Type
ty2 <- Type -> Pred
classifyPredType Type
pred
, case Ct
ct of
CIrredCan {} -> Bool
False
Ct
_ -> Bool
True
= Type -> Type -> Bool
float_eq Type
ty1 Type
ty2 Bool -> Bool -> Bool
|| Type -> Type -> Bool
float_eq Type
ty2 Type
ty1
| Bool
otherwise
= Bool
False
float_eq :: Type -> Type -> Bool
float_eq Type
ty1 Type
ty2
= case Type -> Maybe TcTyVar
getTyVar_maybe Type
ty1 of
Just TcTyVar
tv1 -> TcTyVar -> Bool
isMetaTyVar TcTyVar
tv1
Bool -> Bool -> Bool
&& (Bool -> Bool
not (TcTyVar -> Bool
isTyVarTyVar TcTyVar
tv1) Bool -> Bool -> Bool
|| Type -> Bool
isTyVarTy Type
ty2)
Maybe TcTyVar
Nothing -> Bool
False
applyDefaultingRules :: WantedConstraints -> TcS Bool
applyDefaultingRules :: WantedConstraints -> TcS Bool
applyDefaultingRules WantedConstraints
wanteds
| WantedConstraints -> Bool
isEmptyWC WantedConstraints
wanteds
= Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
| Bool
otherwise
= do { info :: ([Type], (Bool, Bool))
info@([Type]
default_tys, (Bool, Bool)
_) <- TcS ([Type], (Bool, Bool))
getDefaultInfo
; WantedConstraints
wanteds <- WantedConstraints -> TcS WantedConstraints
TcS.zonkWC WantedConstraints
wanteds
; let groups :: [(TcTyVar, [Ct])]
groups = ([Type], (Bool, Bool)) -> WantedConstraints -> [(TcTyVar, [Ct])]
findDefaultableGroups ([Type], (Bool, Bool))
info WantedConstraints
wanteds
; String -> SDoc -> TcS ()
traceTcS String
"applyDefaultingRules {" (SDoc -> TcS ()) -> SDoc -> TcS ()
forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"wanteds =" SDoc -> SDoc -> SDoc
<+> WantedConstraints -> SDoc
forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanteds
, String -> SDoc
text String
"groups =" SDoc -> SDoc -> SDoc
<+> [(TcTyVar, [Ct])] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [(TcTyVar, [Ct])]
groups
, String -> SDoc
text String
"info =" SDoc -> SDoc -> SDoc
<+> ([Type], (Bool, Bool)) -> SDoc
forall a. Outputable a => a -> SDoc
ppr ([Type], (Bool, Bool))
info ]
; [Bool]
something_happeneds <- ((TcTyVar, [Ct]) -> TcS Bool) -> [(TcTyVar, [Ct])] -> TcS [Bool]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ([Type] -> (TcTyVar, [Ct]) -> TcS Bool
disambigGroup [Type]
default_tys) [(TcTyVar, [Ct])]
groups
; String -> SDoc -> TcS ()
traceTcS String
"applyDefaultingRules }" ([Bool] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Bool]
something_happeneds)
; Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return ([Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [Bool]
something_happeneds) }
findDefaultableGroups
:: ( [Type]
, (Bool,Bool) )
-> WantedConstraints
-> [(TyVar, [Ct])]
findDefaultableGroups :: ([Type], (Bool, Bool)) -> WantedConstraints -> [(TcTyVar, [Ct])]
findDefaultableGroups ([Type]
default_tys, (Bool
ovl_strings, Bool
extended_defaults)) WantedConstraints
wanteds
| [Type] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Type]
default_tys
= []
| Bool
otherwise
= [ (TcTyVar
tv, ((Ct, Class, TcTyVar) -> Ct) -> [(Ct, Class, TcTyVar)] -> [Ct]
forall a b. (a -> b) -> [a] -> [b]
map (Ct, Class, TcTyVar) -> Ct
forall a b c. (a, b, c) -> a
fstOf3 [(Ct, Class, TcTyVar)]
group)
| group' :: NonEmpty (Ct, Class, TcTyVar)
group'@((Ct
_,Class
_,TcTyVar
tv) :| [(Ct, Class, TcTyVar)]
_) <- [NonEmpty (Ct, Class, TcTyVar)]
unary_groups
, let group :: [(Ct, Class, TcTyVar)]
group = NonEmpty (Ct, Class, TcTyVar) -> [(Ct, Class, TcTyVar)]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList NonEmpty (Ct, Class, TcTyVar)
group'
, TcTyVar -> Bool
defaultable_tyvar TcTyVar
tv
, [Class] -> Bool
defaultable_classes (((Ct, Class, TcTyVar) -> Class)
-> [(Ct, Class, TcTyVar)] -> [Class]
forall a b. (a -> b) -> [a] -> [b]
map (Ct, Class, TcTyVar) -> Class
forall a b c. (a, b, c) -> b
sndOf3 [(Ct, Class, TcTyVar)]
group) ]
where
simples :: Cts
simples = Bool -> WantedConstraints -> Cts
approximateWC Bool
True WantedConstraints
wanteds
([(Ct, Class, TcTyVar)]
unaries, [Ct]
non_unaries) = (Ct -> Either (Ct, Class, TcTyVar) Ct)
-> [Ct] -> ([(Ct, Class, TcTyVar)], [Ct])
forall a b c. (a -> Either b c) -> [a] -> ([b], [c])
partitionWith Ct -> Either (Ct, Class, TcTyVar) Ct
find_unary (Cts -> [Ct]
forall a. Bag a -> [a]
bagToList Cts
simples)
unary_groups :: [NonEmpty (Ct, Class, TcTyVar)]
unary_groups = ((Ct, Class, TcTyVar) -> (Ct, Class, TcTyVar) -> Ordering)
-> [(Ct, Class, TcTyVar)] -> [NonEmpty (Ct, Class, TcTyVar)]
forall a. (a -> a -> Ordering) -> [a] -> [NonEmpty a]
equivClasses (Ct, Class, TcTyVar) -> (Ct, Class, TcTyVar) -> Ordering
forall {a} {a} {b} {a} {b}.
Ord a =>
(a, b, a) -> (a, b, a) -> Ordering
cmp_tv [(Ct, Class, TcTyVar)]
unaries
unary_groups :: [NonEmpty (Ct, Class, TcTyVar)]
unaries :: [(Ct, Class, TcTyVar)]
non_unaries :: [Ct]
find_unary :: Ct -> Either (Ct, Class, TyVar) Ct
find_unary :: Ct -> Either (Ct, Class, TcTyVar) Ct
find_unary Ct
cc
| Just (Class
cls,[Type]
tys) <- Type -> Maybe (Class, [Type])
getClassPredTys_maybe (Ct -> Type
ctPred Ct
cc)
, [Type
ty] <- TyCon -> [Type] -> [Type]
filterOutInvisibleTypes (Class -> TyCon
classTyCon Class
cls) [Type]
tys
, Just TcTyVar
tv <- Type -> Maybe TcTyVar
tcGetTyVar_maybe Type
ty
, TcTyVar -> Bool
isMetaTyVar TcTyVar
tv
= (Ct, Class, TcTyVar) -> Either (Ct, Class, TcTyVar) Ct
forall a b. a -> Either a b
Left (Ct
cc, Class
cls, TcTyVar
tv)
find_unary Ct
cc = Ct -> Either (Ct, Class, TcTyVar) Ct
forall a b. b -> Either a b
Right Ct
cc
bad_tvs :: TcTyCoVarSet
bad_tvs :: VarSet
bad_tvs = (Ct -> VarSet) -> [Ct] -> VarSet
forall a. (a -> VarSet) -> [a] -> VarSet
mapUnionVarSet Ct -> VarSet
tyCoVarsOfCt [Ct]
non_unaries
cmp_tv :: (a, b, a) -> (a, b, a) -> Ordering
cmp_tv (a
_,b
_,a
tv1) (a
_,b
_,a
tv2) = a
tv1 a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` a
tv2
defaultable_tyvar :: TcTyVar -> Bool
defaultable_tyvar :: TcTyVar -> Bool
defaultable_tyvar TcTyVar
tv
= let b1 :: Bool
b1 = TcTyVar -> Bool
isTyConableTyVar TcTyVar
tv
b2 :: Bool
b2 = Bool -> Bool
not (TcTyVar
tv TcTyVar -> VarSet -> Bool
`elemVarSet` VarSet
bad_tvs)
in Bool
b1 Bool -> Bool -> Bool
&& (Bool
b2 Bool -> Bool -> Bool
|| Bool
extended_defaults)
defaultable_classes :: [Class] -> Bool
defaultable_classes :: [Class] -> Bool
defaultable_classes [Class]
clss
| Bool
extended_defaults = (Class -> Bool) -> [Class] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Class -> Bool
isInteractiveClass Bool
ovl_strings) [Class]
clss
| Bool
otherwise = (Class -> Bool) -> [Class] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Class -> Bool
is_std_class [Class]
clss Bool -> Bool -> Bool
&& ((Class -> Bool) -> [Class] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Class -> Bool
isNumClass Bool
ovl_strings) [Class]
clss)
is_std_class :: Class -> Bool
is_std_class Class
cls = Class -> Bool
isStandardClass Class
cls Bool -> Bool -> Bool
||
(Bool
ovl_strings Bool -> Bool -> Bool
&& (Class
cls Class -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
isStringClassKey))
disambigGroup :: [Type]
-> (TcTyVar, [Ct])
-> TcS Bool
disambigGroup :: [Type] -> (TcTyVar, [Ct]) -> TcS Bool
disambigGroup [] (TcTyVar, [Ct])
_
= Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
disambigGroup (Type
default_ty:[Type]
default_tys) group :: (TcTyVar, [Ct])
group@(TcTyVar
the_tv, [Ct]
wanteds)
= do { String -> SDoc -> TcS ()
traceTcS String
"disambigGroup {" ([SDoc] -> SDoc
vcat [ Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
default_ty, TcTyVar -> SDoc
forall a. Outputable a => a -> SDoc
ppr TcTyVar
the_tv, [Ct] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Ct]
wanteds ])
; EvBindsVar
fake_ev_binds_var <- TcS EvBindsVar
TcS.newTcEvBinds
; TcLevel
tclvl <- TcS TcLevel
TcS.getTcLevel
; Bool
success <- EvBindsVar -> TcLevel -> TcS Bool -> TcS Bool
forall a. EvBindsVar -> TcLevel -> TcS a -> TcS a
nestImplicTcS EvBindsVar
fake_ev_binds_var (TcLevel -> TcLevel
pushTcLevel TcLevel
tclvl) TcS Bool
try_group
; if Bool
success then
do { TcTyVar -> Type -> TcS ()
unifyTyVar TcTyVar
the_tv Type
default_ty
; TcM () -> TcS ()
forall a. TcM a -> TcS a
wrapWarnTcS (TcM () -> TcS ()) -> TcM () -> TcS ()
forall a b. (a -> b) -> a -> b
$ [Ct] -> Type -> TcM ()
warnDefaulting [Ct]
wanteds Type
default_ty
; String -> SDoc -> TcS ()
traceTcS String
"disambigGroup succeeded }" (Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
default_ty)
; Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True }
else
do { String -> SDoc -> TcS ()
traceTcS String
"disambigGroup failed, will try other default types }"
(Type -> SDoc
forall a. Outputable a => a -> SDoc
ppr Type
default_ty)
; [Type] -> (TcTyVar, [Ct]) -> TcS Bool
disambigGroup [Type]
default_tys (TcTyVar, [Ct])
group } }
where
try_group :: TcS Bool
try_group
| Just TCvSubst
subst <- Maybe TCvSubst
mb_subst
= do { TcLclEnv
lcl_env <- TcS TcLclEnv
TcS.getLclEnv
; TcLevel
tc_lvl <- TcS TcLevel
TcS.getTcLevel
; let loc :: CtLoc
loc = TcLevel -> SkolemInfo -> TcLclEnv -> CtLoc
mkGivenLoc TcLevel
tc_lvl SkolemInfo
UnkSkol TcLclEnv
lcl_env
; [CtEvidence]
wanted_evs <- (Ct -> TcS CtEvidence) -> [Ct] -> TcS [CtEvidence]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (CtLoc -> Type -> TcS CtEvidence
newWantedEvVarNC CtLoc
loc (Type -> TcS CtEvidence) -> (Ct -> Type) -> Ct -> TcS CtEvidence
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => TCvSubst -> Type -> Type
TCvSubst -> Type -> Type
substTy TCvSubst
subst (Type -> Type) -> (Ct -> Type) -> Ct -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ct -> Type
ctPred)
[Ct]
wanteds
; (WantedConstraints -> Bool) -> TcS WantedConstraints -> TcS Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap WantedConstraints -> Bool
isEmptyWC (TcS WantedConstraints -> TcS Bool)
-> TcS WantedConstraints -> TcS Bool
forall a b. (a -> b) -> a -> b
$
Cts -> TcS WantedConstraints
solveSimpleWanteds (Cts -> TcS WantedConstraints) -> Cts -> TcS WantedConstraints
forall a b. (a -> b) -> a -> b
$ [Ct] -> Cts
forall a. [a] -> Bag a
listToBag ([Ct] -> Cts) -> [Ct] -> Cts
forall a b. (a -> b) -> a -> b
$
(CtEvidence -> Ct) -> [CtEvidence] -> [Ct]
forall a b. (a -> b) -> [a] -> [b]
map CtEvidence -> Ct
mkNonCanonical [CtEvidence]
wanted_evs }
| Bool
otherwise
= Bool -> TcS Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
the_ty :: Type
the_ty = TcTyVar -> Type
mkTyVarTy TcTyVar
the_tv
mb_subst :: Maybe TCvSubst
mb_subst = Type -> Type -> Maybe TCvSubst
tcMatchTyKi Type
the_ty Type
default_ty
isInteractiveClass :: Bool
-> Class -> Bool
isInteractiveClass :: Bool -> Class -> Bool
isInteractiveClass Bool
ovl_strings Class
cls
= Bool -> Class -> Bool
isNumClass Bool
ovl_strings Class
cls Bool -> Bool -> Bool
|| (Class -> Unique
classKey Class
cls Unique -> [Unique] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Unique]
interactiveClassKeys)
isNumClass :: Bool
-> Class -> Bool
isNumClass :: Bool -> Class -> Bool
isNumClass Bool
ovl_strings Class
cls
= Class -> Bool
isNumericClass Class
cls Bool -> Bool -> Bool
|| (Bool
ovl_strings Bool -> Bool -> Bool
&& (Class
cls Class -> Unique -> Bool
forall a. Uniquable a => a -> Unique -> Bool
`hasKey` Unique
isStringClassKey))