{-# LANGUAGE CPP #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
{-# OPTIONS_GHC -Wno-incomplete-record-updates #-}
module GHC.Tc.Errors(
reportUnsolved, reportAllUnsolved, warnAllUnsolved,
warnDefaulting,
solverDepthErrorTcS
) where
#include "HsVersions.h"
import GHC.Prelude
import GHC.Tc.Types
import GHC.Tc.Utils.Monad
import GHC.Tc.Types.Constraint
import GHC.Core.Predicate
import GHC.Tc.Utils.TcMType
import GHC.Tc.Utils.Env( tcInitTidyEnv )
import GHC.Tc.Utils.TcType
import GHC.Tc.Utils.Unify ( checkTyVarEq )
import GHC.Tc.Types.Origin
import GHC.Rename.Unbound ( unknownNameSuggestions )
import GHC.Core.Type
import GHC.Core.Coercion
import GHC.Core.TyCo.Rep
import GHC.Core.TyCo.Ppr ( pprTyVars, pprWithExplicitKindsWhen, pprSourceTyCon, pprWithTYPE )
import GHC.Core.Unify ( tcMatchTys, flattenTys )
import GHC.Unit.Module
import GHC.Tc.Instance.Family
import GHC.Tc.Utils.Instantiate
import GHC.Core.InstEnv
import GHC.Core.TyCon
import GHC.Core.Class
import GHC.Core.DataCon
import GHC.Tc.Types.Evidence
import GHC.Tc.Types.EvTerm
import GHC.Hs.Binds ( PatSynBind(..) )
import GHC.Types.Name
import GHC.Types.Name.Reader ( lookupGRE_Name, GlobalRdrEnv, mkRdrUnqual )
import GHC.Builtin.Names ( typeableClassName )
import GHC.Types.Id
import GHC.Types.Var
import GHC.Types.Var.Set
import GHC.Types.Var.Env
import GHC.Types.Name.Env
import GHC.Types.Name.Set
import GHC.Data.Bag
import GHC.Utils.Error ( pprLocMsgEnvelope )
import GHC.Types.Basic
import GHC.Types.Error
import GHC.Types.Unique.Set ( nonDetEltsUniqSet )
import GHC.Core.ConLike ( ConLike(..))
import GHC.Utils.Misc
import GHC.Data.FastString
import GHC.Utils.Outputable as O
import GHC.Utils.Panic
import GHC.Types.SrcLoc
import GHC.Driver.Session
import GHC.Driver.Ppr
import GHC.Data.List.SetOps ( equivClasses )
import GHC.Data.Maybe
import qualified GHC.LanguageExtensions as LangExt
import GHC.Utils.FV ( fvVarList, unionFV )
import Control.Monad ( when, foldM, forM_ )
import Data.Foldable ( toList )
import Data.List ( partition, mapAccumL, sortBy, unfoldr )
import {-# SOURCE #-} GHC.Tc.Errors.Hole ( findValidHoleFits )
import qualified Data.Semigroup as Semigroup
reportUnsolved :: WantedConstraints -> TcM (Bag EvBind)
reportUnsolved :: WantedConstraints -> TcM (Bag EvBind)
reportUnsolved WantedConstraints
wanted
= do { EvBindsVar
binds_var <- TcM EvBindsVar
newTcEvBinds
; Bool
defer_errors <- forall gbl lcl. GeneralFlag -> TcRnIf gbl lcl Bool
goptM GeneralFlag
Opt_DeferTypeErrors
; Bool
warn_errors <- forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnDeferredTypeErrors
; let type_errors :: TypeErrorChoice
type_errors | Bool -> Bool
not Bool
defer_errors = TypeErrorChoice
TypeError
| Bool
warn_errors = WarnReason -> TypeErrorChoice
TypeWarn (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnDeferredTypeErrors)
| Bool
otherwise = TypeErrorChoice
TypeDefer
; Bool
defer_holes <- forall gbl lcl. GeneralFlag -> TcRnIf gbl lcl Bool
goptM GeneralFlag
Opt_DeferTypedHoles
; Bool
warn_holes <- forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnTypedHoles
; let expr_holes :: HoleChoice
expr_holes | Bool -> Bool
not Bool
defer_holes = HoleChoice
HoleError
| Bool
warn_holes = HoleChoice
HoleWarn
| Bool
otherwise = HoleChoice
HoleDefer
; Bool
partial_sigs <- forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.PartialTypeSignatures
; Bool
warn_partial_sigs <- forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnPartialTypeSignatures
; let type_holes :: HoleChoice
type_holes | Bool -> Bool
not Bool
partial_sigs = HoleChoice
HoleError
| Bool
warn_partial_sigs = HoleChoice
HoleWarn
| Bool
otherwise = HoleChoice
HoleDefer
; Bool
defer_out_of_scope <- forall gbl lcl. GeneralFlag -> TcRnIf gbl lcl Bool
goptM GeneralFlag
Opt_DeferOutOfScopeVariables
; Bool
warn_out_of_scope <- forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnDeferredOutOfScopeVariables
; let out_of_scope_holes :: HoleChoice
out_of_scope_holes | Bool -> Bool
not Bool
defer_out_of_scope = HoleChoice
HoleError
| Bool
warn_out_of_scope = HoleChoice
HoleWarn
| Bool
otherwise = HoleChoice
HoleDefer
; TypeErrorChoice
-> HoleChoice
-> HoleChoice
-> HoleChoice
-> EvBindsVar
-> WantedConstraints
-> TcM ()
report_unsolved TypeErrorChoice
type_errors HoleChoice
expr_holes
HoleChoice
type_holes HoleChoice
out_of_scope_holes
EvBindsVar
binds_var WantedConstraints
wanted
; EvBindMap
ev_binds <- EvBindsVar -> TcM EvBindMap
getTcEvBindsMap EvBindsVar
binds_var
; forall (m :: * -> *) a. Monad m => a -> m a
return (EvBindMap -> Bag EvBind
evBindMapBinds EvBindMap
ev_binds)}
reportAllUnsolved :: WantedConstraints -> TcM ()
reportAllUnsolved :: WantedConstraints -> TcM ()
reportAllUnsolved WantedConstraints
wanted
= do { EvBindsVar
ev_binds <- TcM EvBindsVar
newNoTcEvBinds
; Bool
partial_sigs <- forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.PartialTypeSignatures
; Bool
warn_partial_sigs <- forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnPartialTypeSignatures
; let type_holes :: HoleChoice
type_holes | Bool -> Bool
not Bool
partial_sigs = HoleChoice
HoleError
| Bool
warn_partial_sigs = HoleChoice
HoleWarn
| Bool
otherwise = HoleChoice
HoleDefer
; TypeErrorChoice
-> HoleChoice
-> HoleChoice
-> HoleChoice
-> EvBindsVar
-> WantedConstraints
-> TcM ()
report_unsolved TypeErrorChoice
TypeError HoleChoice
HoleError HoleChoice
type_holes HoleChoice
HoleError
EvBindsVar
ev_binds WantedConstraints
wanted }
warnAllUnsolved :: WantedConstraints -> TcM ()
warnAllUnsolved :: WantedConstraints -> TcM ()
warnAllUnsolved WantedConstraints
wanted
= do { EvBindsVar
ev_binds <- TcM EvBindsVar
newTcEvBinds
; TypeErrorChoice
-> HoleChoice
-> HoleChoice
-> HoleChoice
-> EvBindsVar
-> WantedConstraints
-> TcM ()
report_unsolved (WarnReason -> TypeErrorChoice
TypeWarn WarnReason
NoReason) HoleChoice
HoleWarn HoleChoice
HoleWarn HoleChoice
HoleWarn
EvBindsVar
ev_binds WantedConstraints
wanted }
report_unsolved :: TypeErrorChoice
-> HoleChoice
-> HoleChoice
-> HoleChoice
-> EvBindsVar
-> WantedConstraints -> TcM ()
report_unsolved :: TypeErrorChoice
-> HoleChoice
-> HoleChoice
-> HoleChoice
-> EvBindsVar
-> WantedConstraints
-> TcM ()
report_unsolved TypeErrorChoice
type_errors HoleChoice
expr_holes
HoleChoice
type_holes HoleChoice
out_of_scope_holes EvBindsVar
binds_var WantedConstraints
wanted
| WantedConstraints -> Bool
isEmptyWC WantedConstraints
wanted
= forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise
= do { String -> SDoc -> TcM ()
traceTc String
"reportUnsolved {" forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"type errors:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr TypeErrorChoice
type_errors
, String -> SDoc
text String
"expr holes:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr HoleChoice
expr_holes
, String -> SDoc
text String
"type holes:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr HoleChoice
type_holes
, String -> SDoc
text String
"scope holes:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr HoleChoice
out_of_scope_holes ]
; String -> SDoc -> TcM ()
traceTc String
"reportUnsolved (before zonking and tidying)" (forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanted)
; WantedConstraints
wanted <- WantedConstraints -> TcM WantedConstraints
zonkWC WantedConstraints
wanted
; let tidy_env :: TidyEnv
tidy_env = TidyEnv -> [TcId] -> TidyEnv
tidyFreeTyCoVars TidyEnv
emptyTidyEnv [TcId]
free_tvs
free_tvs :: [TcId]
free_tvs = forall a. (a -> Bool) -> [a] -> [a]
filterOut TcId -> Bool
isCoVar forall a b. (a -> b) -> a -> b
$
WantedConstraints -> [TcId]
tyCoVarsOfWCList WantedConstraints
wanted
; String -> SDoc -> TcM ()
traceTc String
"reportUnsolved (after zonking):" forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Free tyvars:" SDoc -> SDoc -> SDoc
<+> [TcId] -> SDoc
pprTyVars [TcId]
free_tvs
, String -> SDoc
text String
"Tidy env:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr TidyEnv
tidy_env
, String -> SDoc
text String
"Wanted:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr WantedConstraints
wanted ]
; Bool
warn_redundant <- forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnRedundantConstraints
; Bool
exp_syns <- forall gbl lcl. GeneralFlag -> TcRnIf gbl lcl Bool
goptM GeneralFlag
Opt_PrintExpandedSynonyms
; let err_ctxt :: ReportErrCtxt
err_ctxt = CEC { cec_encl :: [Implication]
cec_encl = []
, cec_tidy :: TidyEnv
cec_tidy = TidyEnv
tidy_env
, cec_defer_type_errors :: TypeErrorChoice
cec_defer_type_errors = TypeErrorChoice
type_errors
, cec_expr_holes :: HoleChoice
cec_expr_holes = HoleChoice
expr_holes
, cec_type_holes :: HoleChoice
cec_type_holes = HoleChoice
type_holes
, cec_out_of_scope_holes :: HoleChoice
cec_out_of_scope_holes = HoleChoice
out_of_scope_holes
, cec_suppress :: Bool
cec_suppress = WantedConstraints -> Bool
insolubleWC WantedConstraints
wanted
, cec_warn_redundant :: Bool
cec_warn_redundant = Bool
warn_redundant
, cec_expand_syns :: Bool
cec_expand_syns = Bool
exp_syns
, cec_binds :: EvBindsVar
cec_binds = EvBindsVar
binds_var }
; TcLevel
tc_lvl <- TcM TcLevel
getTcLevel
; ReportErrCtxt -> TcLevel -> WantedConstraints -> TcM ()
reportWanteds ReportErrCtxt
err_ctxt TcLevel
tc_lvl WantedConstraints
wanted
; String -> SDoc -> TcM ()
traceTc String
"reportUnsolved }" SDoc
empty }
data Report
= Report { Report -> [SDoc]
report_important :: [SDoc]
, Report -> [SDoc]
report_relevant_bindings :: [SDoc]
, Report -> [SDoc]
report_valid_hole_fits :: [SDoc]
}
instance Outputable Report where
ppr :: Report -> SDoc
ppr (Report { report_important :: Report -> [SDoc]
report_important = [SDoc]
imp
, report_relevant_bindings :: Report -> [SDoc]
report_relevant_bindings = [SDoc]
rel
, report_valid_hole_fits :: Report -> [SDoc]
report_valid_hole_fits = [SDoc]
val })
= [SDoc] -> SDoc
vcat [ String -> SDoc
text String
"important:" SDoc -> SDoc -> SDoc
<+> [SDoc] -> SDoc
vcat [SDoc]
imp
, String -> SDoc
text String
"relevant:" SDoc -> SDoc -> SDoc
<+> [SDoc] -> SDoc
vcat [SDoc]
rel
, String -> SDoc
text String
"valid:" SDoc -> SDoc -> SDoc
<+> [SDoc] -> SDoc
vcat [SDoc]
val ]
instance Semigroup Report where
Report [SDoc]
a1 [SDoc]
b1 [SDoc]
c1 <> :: Report -> Report -> Report
<> Report [SDoc]
a2 [SDoc]
b2 [SDoc]
c2 = [SDoc] -> [SDoc] -> [SDoc] -> Report
Report ([SDoc]
a1 forall a. [a] -> [a] -> [a]
++ [SDoc]
a2) ([SDoc]
b1 forall a. [a] -> [a] -> [a]
++ [SDoc]
b2) ([SDoc]
c1 forall a. [a] -> [a] -> [a]
++ [SDoc]
c2)
instance Monoid Report where
mempty :: Report
mempty = [SDoc] -> [SDoc] -> [SDoc] -> Report
Report [] [] []
mappend :: Report -> Report -> Report
mappend = forall a. Semigroup a => a -> a -> a
(Semigroup.<>)
important :: SDoc -> Report
important :: SDoc -> Report
important SDoc
doc = forall a. Monoid a => a
mempty { report_important :: [SDoc]
report_important = [SDoc
doc] }
mk_relevant_bindings :: SDoc -> Report
mk_relevant_bindings :: SDoc -> Report
mk_relevant_bindings SDoc
doc = forall a. Monoid a => a
mempty { report_relevant_bindings :: [SDoc]
report_relevant_bindings = [SDoc
doc] }
valid_hole_fits :: SDoc -> Report
valid_hole_fits :: SDoc -> Report
valid_hole_fits SDoc
docs = forall a. Monoid a => a
mempty { report_valid_hole_fits :: [SDoc]
report_valid_hole_fits = [SDoc
docs] }
data TypeErrorChoice
= TypeError
| TypeWarn WarnReason
| TypeDefer
data HoleChoice
= HoleError
| HoleWarn
| HoleDefer
instance Outputable HoleChoice where
ppr :: HoleChoice -> SDoc
ppr HoleChoice
HoleError = String -> SDoc
text String
"HoleError"
ppr HoleChoice
HoleWarn = String -> SDoc
text String
"HoleWarn"
ppr HoleChoice
HoleDefer = String -> SDoc
text String
"HoleDefer"
instance Outputable TypeErrorChoice where
ppr :: TypeErrorChoice -> SDoc
ppr TypeErrorChoice
TypeError = String -> SDoc
text String
"TypeError"
ppr (TypeWarn WarnReason
reason) = String -> SDoc
text String
"TypeWarn" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr WarnReason
reason
ppr TypeErrorChoice
TypeDefer = String -> SDoc
text String
"TypeDefer"
data ReportErrCtxt
= CEC { ReportErrCtxt -> [Implication]
cec_encl :: [Implication]
, ReportErrCtxt -> TidyEnv
cec_tidy :: TidyEnv
, ReportErrCtxt -> EvBindsVar
cec_binds :: EvBindsVar
, ReportErrCtxt -> TypeErrorChoice
cec_defer_type_errors :: TypeErrorChoice
, ReportErrCtxt -> HoleChoice
cec_expr_holes :: HoleChoice
, ReportErrCtxt -> HoleChoice
cec_type_holes :: HoleChoice
, ReportErrCtxt -> HoleChoice
cec_out_of_scope_holes :: HoleChoice
, ReportErrCtxt -> Bool
cec_warn_redundant :: Bool
, ReportErrCtxt -> Bool
cec_expand_syns :: Bool
, ReportErrCtxt -> Bool
cec_suppress :: Bool
}
instance Outputable ReportErrCtxt where
ppr :: ReportErrCtxt -> SDoc
ppr (CEC { cec_binds :: ReportErrCtxt -> EvBindsVar
cec_binds = EvBindsVar
bvar
, cec_defer_type_errors :: ReportErrCtxt -> TypeErrorChoice
cec_defer_type_errors = TypeErrorChoice
dte
, cec_expr_holes :: ReportErrCtxt -> HoleChoice
cec_expr_holes = HoleChoice
eh
, cec_type_holes :: ReportErrCtxt -> HoleChoice
cec_type_holes = HoleChoice
th
, cec_out_of_scope_holes :: ReportErrCtxt -> HoleChoice
cec_out_of_scope_holes = HoleChoice
osh
, cec_warn_redundant :: ReportErrCtxt -> Bool
cec_warn_redundant = Bool
wr
, cec_expand_syns :: ReportErrCtxt -> Bool
cec_expand_syns = Bool
es
, cec_suppress :: ReportErrCtxt -> Bool
cec_suppress = Bool
sup })
= String -> SDoc
text String
"CEC" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
braces ([SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"cec_binds" SDoc -> SDoc -> SDoc
<+> SDoc
equals SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr EvBindsVar
bvar
, String -> SDoc
text String
"cec_defer_type_errors" SDoc -> SDoc -> SDoc
<+> SDoc
equals SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr TypeErrorChoice
dte
, String -> SDoc
text String
"cec_expr_holes" SDoc -> SDoc -> SDoc
<+> SDoc
equals SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr HoleChoice
eh
, String -> SDoc
text String
"cec_type_holes" SDoc -> SDoc -> SDoc
<+> SDoc
equals SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr HoleChoice
th
, String -> SDoc
text String
"cec_out_of_scope_holes" SDoc -> SDoc -> SDoc
<+> SDoc
equals SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr HoleChoice
osh
, String -> SDoc
text String
"cec_warn_redundant" SDoc -> SDoc -> SDoc
<+> SDoc
equals SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Bool
wr
, String -> SDoc
text String
"cec_expand_syns" SDoc -> SDoc -> SDoc
<+> SDoc
equals SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Bool
es
, String -> SDoc
text String
"cec_suppress" SDoc -> SDoc -> SDoc
<+> SDoc
equals SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Bool
sup ])
deferringAnyBindings :: ReportErrCtxt -> Bool
deferringAnyBindings :: ReportErrCtxt -> Bool
deferringAnyBindings (CEC { cec_defer_type_errors :: ReportErrCtxt -> TypeErrorChoice
cec_defer_type_errors = TypeErrorChoice
TypeError
, cec_expr_holes :: ReportErrCtxt -> HoleChoice
cec_expr_holes = HoleChoice
HoleError
, cec_out_of_scope_holes :: ReportErrCtxt -> HoleChoice
cec_out_of_scope_holes = HoleChoice
HoleError }) = Bool
False
deferringAnyBindings ReportErrCtxt
_ = Bool
True
maybeSwitchOffDefer :: EvBindsVar -> ReportErrCtxt -> ReportErrCtxt
maybeSwitchOffDefer :: EvBindsVar -> ReportErrCtxt -> ReportErrCtxt
maybeSwitchOffDefer EvBindsVar
evb ReportErrCtxt
ctxt
| CoEvBindsVar{} <- EvBindsVar
evb
= ReportErrCtxt
ctxt { cec_defer_type_errors :: TypeErrorChoice
cec_defer_type_errors = TypeErrorChoice
TypeError
, cec_expr_holes :: HoleChoice
cec_expr_holes = HoleChoice
HoleError
, cec_out_of_scope_holes :: HoleChoice
cec_out_of_scope_holes = HoleChoice
HoleError }
| Bool
otherwise
= ReportErrCtxt
ctxt
reportImplic :: ReportErrCtxt -> Implication -> TcM ()
reportImplic :: ReportErrCtxt -> Implication -> TcM ()
reportImplic ReportErrCtxt
ctxt implic :: Implication
implic@(Implic { ic_skols :: Implication -> [TcId]
ic_skols = [TcId]
tvs
, ic_given :: Implication -> [TcId]
ic_given = [TcId]
given
, ic_wanted :: Implication -> WantedConstraints
ic_wanted = WantedConstraints
wanted, ic_binds :: Implication -> EvBindsVar
ic_binds = EvBindsVar
evb
, ic_status :: Implication -> ImplicStatus
ic_status = ImplicStatus
status, ic_info :: Implication -> SkolemInfo
ic_info = SkolemInfo
info
, ic_tclvl :: Implication -> TcLevel
ic_tclvl = TcLevel
tc_lvl })
| SkolemInfo
BracketSkol <- SkolemInfo
info
, Bool -> Bool
not Bool
insoluble
= forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise
= do { String -> SDoc -> TcM ()
traceTc String
"reportImplic" (forall a. Outputable a => a -> SDoc
ppr Implication
implic')
; forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
bad_telescope forall a b. (a -> b) -> a -> b
$ ReportErrCtxt -> TcLclEnv -> SkolemInfo -> [TcId] -> TcM ()
reportBadTelescope ReportErrCtxt
ctxt TcLclEnv
tcl_env SkolemInfo
info [TcId]
tvs
; ReportErrCtxt -> TcLevel -> WantedConstraints -> TcM ()
reportWanteds ReportErrCtxt
ctxt' TcLevel
tc_lvl WantedConstraints
wanted
; forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ReportErrCtxt -> Bool
cec_warn_redundant ReportErrCtxt
ctxt) forall a b. (a -> b) -> a -> b
$
ReportErrCtxt -> TcLclEnv -> SkolemInfo -> [TcId] -> TcM ()
warnRedundantConstraints ReportErrCtxt
ctxt' TcLclEnv
tcl_env SkolemInfo
info' [TcId]
dead_givens }
where
tcl_env :: TcLclEnv
tcl_env = Implication -> TcLclEnv
ic_env Implication
implic
insoluble :: Bool
insoluble = ImplicStatus -> Bool
isInsolubleStatus ImplicStatus
status
(TidyEnv
env1, [TcId]
tvs') = forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumL TidyEnv -> TcId -> (TidyEnv, TcId)
tidyVarBndr (ReportErrCtxt -> TidyEnv
cec_tidy ReportErrCtxt
ctxt) forall a b. (a -> b) -> a -> b
$
[TcId] -> [TcId]
scopedSort [TcId]
tvs
info' :: SkolemInfo
info' = TidyEnv -> SkolemInfo -> SkolemInfo
tidySkolemInfo TidyEnv
env1 SkolemInfo
info
implic' :: Implication
implic' = Implication
implic { ic_skols :: [TcId]
ic_skols = [TcId]
tvs'
, ic_given :: [TcId]
ic_given = forall a b. (a -> b) -> [a] -> [b]
map (TidyEnv -> TcId -> TcId
tidyEvVar TidyEnv
env1) [TcId]
given
, ic_info :: SkolemInfo
ic_info = SkolemInfo
info' }
ctxt1 :: ReportErrCtxt
ctxt1 = EvBindsVar -> ReportErrCtxt -> ReportErrCtxt
maybeSwitchOffDefer EvBindsVar
evb ReportErrCtxt
ctxt
ctxt' :: ReportErrCtxt
ctxt' = ReportErrCtxt
ctxt1 { cec_tidy :: TidyEnv
cec_tidy = TidyEnv
env1
, cec_encl :: [Implication]
cec_encl = Implication
implic' forall a. a -> [a] -> [a]
: ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt
, cec_suppress :: Bool
cec_suppress = Bool
insoluble Bool -> Bool -> Bool
|| ReportErrCtxt -> Bool
cec_suppress ReportErrCtxt
ctxt
, cec_binds :: EvBindsVar
cec_binds = EvBindsVar
evb }
dead_givens :: [TcId]
dead_givens = case ImplicStatus
status of
IC_Solved { ics_dead :: ImplicStatus -> [TcId]
ics_dead = [TcId]
dead } -> [TcId]
dead
ImplicStatus
_ -> []
bad_telescope :: Bool
bad_telescope = case ImplicStatus
status of
ImplicStatus
IC_BadTelescope -> Bool
True
ImplicStatus
_ -> Bool
False
warnRedundantConstraints :: ReportErrCtxt -> TcLclEnv -> SkolemInfo -> [EvVar] -> TcM ()
warnRedundantConstraints :: ReportErrCtxt -> TcLclEnv -> SkolemInfo -> [TcId] -> TcM ()
warnRedundantConstraints ReportErrCtxt
ctxt TcLclEnv
env SkolemInfo
info [TcId]
ev_vars
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
redundant_evs
= forall (m :: * -> *) a. Monad m => a -> m a
return ()
| SigSkol {} <- SkolemInfo
info
= forall lcl' gbl a lcl.
lcl' -> TcRnIf gbl lcl' a -> TcRnIf gbl lcl a
setLclEnv TcLclEnv
env forall a b. (a -> b) -> a -> b
$
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (String -> SDoc
text String
"In" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr SkolemInfo
info) forall a b. (a -> b) -> a -> b
$
do { TcLclEnv
env <- forall gbl lcl. TcRnIf gbl lcl lcl
getLclEnv
; MsgEnvelope DecoratedSDoc
msg <- ReportErrCtxt
-> TcLclEnv -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorReport ReportErrCtxt
ctxt TcLclEnv
env (SDoc -> Report
important SDoc
doc)
; WarnReason -> MsgEnvelope DecoratedSDoc -> TcM ()
reportWarning (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnRedundantConstraints) MsgEnvelope DecoratedSDoc
msg }
| Bool
otherwise
= do { MsgEnvelope DecoratedSDoc
msg <- ReportErrCtxt
-> TcLclEnv -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorReport ReportErrCtxt
ctxt TcLclEnv
env (SDoc -> Report
important SDoc
doc)
; WarnReason -> MsgEnvelope DecoratedSDoc -> TcM ()
reportWarning (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnRedundantConstraints) MsgEnvelope DecoratedSDoc
msg }
where
doc :: SDoc
doc = String -> SDoc
text String
"Redundant constraint" SDoc -> SDoc -> SDoc
<> forall a. [a] -> SDoc
plural [TcId]
redundant_evs SDoc -> SDoc -> SDoc
<> SDoc
colon
SDoc -> SDoc -> SDoc
<+> [TcId] -> SDoc
pprEvVarTheta [TcId]
redundant_evs
redundant_evs :: [TcId]
redundant_evs =
forall a. (a -> Bool) -> [a] -> [a]
filterOut TcId -> Bool
is_type_error forall a b. (a -> b) -> a -> b
$
case SkolemInfo
info of
SkolemInfo
InstSkol -> forall a. (a -> Bool) -> [a] -> [a]
filterOut (Type -> Bool
improving forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcId -> Type
idType) [TcId]
ev_vars
SkolemInfo
_ -> [TcId]
ev_vars
is_type_error :: TcId -> Bool
is_type_error = forall a. Maybe a -> Bool
isJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> Maybe Type
userTypeError_maybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcId -> Type
idType
improving :: Type -> Bool
improving Type
pred
= forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Type -> Bool
isImprovementPred (Type
pred forall a. a -> [a] -> [a]
: Type -> [Type]
transSuperClasses Type
pred)
reportBadTelescope :: ReportErrCtxt -> TcLclEnv -> SkolemInfo -> [TcTyVar] -> TcM ()
reportBadTelescope :: ReportErrCtxt -> TcLclEnv -> SkolemInfo -> [TcId] -> TcM ()
reportBadTelescope ReportErrCtxt
ctxt TcLclEnv
env (ForAllSkol SDoc
telescope) [TcId]
skols
= do { MsgEnvelope DecoratedSDoc
msg <- ReportErrCtxt
-> TcLclEnv -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorReport ReportErrCtxt
ctxt TcLclEnv
env (SDoc -> Report
important SDoc
doc)
; MsgEnvelope DecoratedSDoc -> TcM ()
reportError MsgEnvelope DecoratedSDoc
msg }
where
doc :: SDoc
doc = SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"These kind and type variables:" SDoc -> SDoc -> SDoc
<+> SDoc
telescope SDoc -> SDoc -> SDoc
$$
String -> SDoc
text String
"are out of dependency order. Perhaps try this ordering:")
Int
2 ([TcId] -> SDoc
pprTyVars [TcId]
sorted_tvs)
sorted_tvs :: [TcId]
sorted_tvs = [TcId] -> [TcId]
scopedSort [TcId]
skols
reportBadTelescope ReportErrCtxt
_ TcLclEnv
_ SkolemInfo
skol_info [TcId]
skols
= forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"reportBadTelescope" (forall a. Outputable a => a -> SDoc
ppr SkolemInfo
skol_info SDoc -> SDoc -> SDoc
$$ forall a. Outputable a => a -> SDoc
ppr [TcId]
skols)
reportWanteds :: ReportErrCtxt -> TcLevel -> WantedConstraints -> TcM ()
reportWanteds :: ReportErrCtxt -> TcLevel -> WantedConstraints -> TcM ()
reportWanteds ReportErrCtxt
ctxt TcLevel
tc_lvl (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 { String -> SDoc -> TcM ()
traceTc String
"reportWanteds" ([SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Simples =" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Cts
simples
, String -> SDoc
text String
"Suppress =" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (ReportErrCtxt -> Bool
cec_suppress ReportErrCtxt
ctxt)
, String -> SDoc
text String
"tidy_cts =" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr [Ct]
tidy_cts
, String -> SDoc
text String
"tidy_holes = " SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr [Hole]
tidy_holes ])
; let ([Hole]
out_of_scope, [Hole]
other_holes) = forall a. (a -> Bool) -> [a] -> ([a], [a])
partition Hole -> Bool
isOutOfScopeHole [Hole]
tidy_holes
ctxt_for_scope_errs :: ReportErrCtxt
ctxt_for_scope_errs = ReportErrCtxt
ctxt { cec_suppress :: Bool
cec_suppress = Bool
False }
; (()
_, Bool
no_out_of_scope) <- forall a. TcRn a -> TcRn (a, Bool)
askNoErrs forall a b. (a -> b) -> a -> b
$
[Ct] -> ReportErrCtxt -> [Hole] -> TcM ()
reportHoles [Ct]
tidy_cts ReportErrCtxt
ctxt_for_scope_errs [Hole]
out_of_scope
; let ctxt_for_insols :: ReportErrCtxt
ctxt_for_insols = ReportErrCtxt
ctxt { cec_suppress :: Bool
cec_suppress = Bool -> Bool
not Bool
no_out_of_scope }
; [Ct] -> ReportErrCtxt -> [Hole] -> TcM ()
reportHoles [Ct]
tidy_cts ReportErrCtxt
ctxt_for_insols [Hole]
other_holes
; (ReportErrCtxt
ctxt1, [Ct]
cts1) <- ReportErrCtxt
-> [ReporterSpec] -> [Ct] -> TcM (ReportErrCtxt, [Ct])
tryReporters ReportErrCtxt
ctxt_for_insols [ReporterSpec]
report1 [Ct]
tidy_cts
; let ctxt2 :: ReportErrCtxt
ctxt2 = ReportErrCtxt
ctxt { cec_suppress :: Bool
cec_suppress = ReportErrCtxt -> Bool
cec_suppress ReportErrCtxt
ctxt Bool -> Bool -> Bool
|| ReportErrCtxt -> Bool
cec_suppress ReportErrCtxt
ctxt1 }
; (ReportErrCtxt
_, [Ct]
leftovers) <- ReportErrCtxt
-> [ReporterSpec] -> [Ct] -> TcM (ReportErrCtxt, [Ct])
tryReporters ReportErrCtxt
ctxt2 [ReporterSpec]
report2 [Ct]
cts1
; MASSERT2( null leftovers, ppr leftovers )
; forall (m :: * -> *) a b. Monad m => (a -> m b) -> Bag a -> m ()
mapBagM_ (ReportErrCtxt -> Implication -> TcM ()
reportImplic ReportErrCtxt
ctxt2) Bag Implication
implics }
where
env :: TidyEnv
env = ReportErrCtxt -> TidyEnv
cec_tidy ReportErrCtxt
ctxt
tidy_cts :: [Ct]
tidy_cts = forall a. Bag a -> [a]
bagToList (forall a b. (a -> b) -> Bag a -> Bag b
mapBag (TidyEnv -> Ct -> Ct
tidyCt TidyEnv
env) Cts
simples)
tidy_holes :: [Hole]
tidy_holes = forall a. Bag a -> [a]
bagToList (forall a b. (a -> b) -> Bag a -> Bag b
mapBag (TidyEnv -> Hole -> Hole
tidyHole TidyEnv
env) Bag Hole
holes)
report1 :: [ReporterSpec]
report1 = [ (String
"custom_error", (Ct -> Pred -> Bool) -> Ct -> Pred -> Bool
unblocked forall {p}. Ct -> p -> Bool
is_user_type_error, Bool
True, Reporter
mkUserTypeErrorReporter)
, ReporterSpec
given_eq_spec
, (String
"insoluble2", (Ct -> Pred -> Bool) -> Ct -> Pred -> Bool
unblocked forall {p}. p -> Pred -> Bool
utterly_wrong, Bool
True, (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkGroupReporter ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr)
, (String
"skolem eq1", (Ct -> Pred -> Bool) -> Ct -> Pred -> Bool
unblocked Ct -> Pred -> Bool
very_wrong, Bool
True, Reporter
mkSkolReporter)
, (String
"skolem eq2", (Ct -> Pred -> Bool) -> Ct -> Pred -> Bool
unblocked Ct -> Pred -> Bool
skolem_eq, Bool
True, Reporter
mkSkolReporter)
, (String
"non-tv eq", (Ct -> Pred -> Bool) -> Ct -> Pred -> Bool
unblocked forall {p}. p -> Pred -> Bool
non_tv_eq, Bool
True, Reporter
mkSkolReporter)
, (String
"Homo eqs", (Ct -> Pred -> Bool) -> Ct -> Pred -> Bool
unblocked forall {p}. p -> Pred -> Bool
is_homo_equality, Bool
True, (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkGroupReporter ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr)
, (String
"Other eqs", (Ct -> Pred -> Bool) -> Ct -> Pred -> Bool
unblocked Ct -> Pred -> Bool
is_equality, Bool
True, (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkGroupReporter ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr)
, (String
"Blocked eqs", Ct -> Pred -> Bool
is_equality, Bool
False, (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkSuppressReporter ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkBlockedEqErr)]
report2 :: [ReporterSpec]
report2 = [ (String
"Implicit params", Ct -> Pred -> Bool
is_ip, Bool
False, (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkGroupReporter ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkIPErr)
, (String
"Irreds", Ct -> Pred -> Bool
is_irred, Bool
False, (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkGroupReporter ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkIrredErr)
, (String
"Dicts", Ct -> Pred -> Bool
is_dict, Bool
False, (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkGroupReporter ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkDictErr) ]
unblocked :: (Ct -> Pred -> Bool) -> Ct -> Pred -> Bool
unblocked :: (Ct -> Pred -> Bool) -> Ct -> Pred -> Bool
unblocked Ct -> Pred -> Bool
_ (CIrredCan { cc_reason :: Ct -> CtIrredReason
cc_reason = HoleBlockerReason {}}) Pred
_ = Bool
False
unblocked Ct -> Pred -> Bool
checker Ct
ct Pred
pred = Ct -> Pred -> Bool
checker Ct
ct Pred
pred
is_dict, is_equality, is_ip, is_irred :: Ct -> Pred -> Bool
is_given_eq :: Ct -> Pred -> Bool
is_given_eq Ct
ct Pred
pred
| EqPred {} <- Pred
pred = Ct -> Bool
arisesFromGivens Ct
ct
| Bool
otherwise = Bool
False
utterly_wrong :: p -> Pred -> Bool
utterly_wrong p
_ (EqPred EqRel
NomEq Type
ty1 Type
ty2) = Type -> Bool
isRigidTy Type
ty1 Bool -> Bool -> Bool
&& Type -> Bool
isRigidTy Type
ty2
utterly_wrong p
_ Pred
_ = Bool
False
very_wrong :: Ct -> Pred -> Bool
very_wrong Ct
_ (EqPred EqRel
NomEq Type
ty1 Type
ty2) = TcLevel -> Type -> Bool
isSkolemTy TcLevel
tc_lvl Type
ty1 Bool -> Bool -> Bool
&& Type -> Bool
isRigidTy Type
ty2
very_wrong Ct
_ Pred
_ = Bool
False
skolem_eq :: Ct -> Pred -> Bool
skolem_eq Ct
_ (EqPred EqRel
NomEq Type
ty1 Type
_) = TcLevel -> Type -> Bool
isSkolemTy TcLevel
tc_lvl Type
ty1
skolem_eq Ct
_ Pred
_ = Bool
False
non_tv_eq :: p -> Pred -> Bool
non_tv_eq p
_ (EqPred EqRel
NomEq Type
ty1 Type
_) = Bool -> Bool
not (Type -> Bool
isTyVarTy Type
ty1)
non_tv_eq p
_ Pred
_ = Bool
False
is_user_type_error :: Ct -> p -> Bool
is_user_type_error Ct
ct p
_ = Ct -> Bool
isUserTypeErrorCt Ct
ct
is_homo_equality :: p -> Pred -> Bool
is_homo_equality p
_ (EqPred EqRel
_ Type
ty1 Type
ty2) = HasDebugCallStack => Type -> Type
tcTypeKind Type
ty1 HasDebugCallStack => Type -> Type -> Bool
`tcEqType` HasDebugCallStack => Type -> Type
tcTypeKind Type
ty2
is_homo_equality p
_ Pred
_ = Bool
False
is_equality :: Ct -> Pred -> Bool
is_equality Ct
_ (EqPred {}) = Bool
True
is_equality Ct
_ Pred
_ = Bool
False
is_dict :: Ct -> Pred -> Bool
is_dict Ct
_ (ClassPred {}) = Bool
True
is_dict Ct
_ Pred
_ = Bool
False
is_ip :: Ct -> Pred -> Bool
is_ip Ct
_ (ClassPred Class
cls [Type]
_) = Class -> Bool
isIPClass Class
cls
is_ip Ct
_ Pred
_ = Bool
False
is_irred :: Ct -> Pred -> Bool
is_irred Ct
_ (IrredPred {}) = Bool
True
is_irred Ct
_ Pred
_ = Bool
False
given_eq_spec :: ReporterSpec
given_eq_spec
| [Implication] -> Bool
has_gadt_match (ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt)
= (String
"insoluble1a", Ct -> Pred -> Bool
is_given_eq, Bool
True, Reporter
mkGivenErrorReporter)
| Bool
otherwise
= (String
"insoluble1b", Ct -> Pred -> Bool
is_given_eq, Bool
False, Reporter
ignoreErrorReporter)
has_gadt_match :: [Implication] -> Bool
has_gadt_match [] = Bool
False
has_gadt_match (Implication
implic : [Implication]
implics)
| PatSkol {} <- Implication -> SkolemInfo
ic_info Implication
implic
, Implication -> HasGivenEqs
ic_given_eqs Implication
implic forall a. Eq a => a -> a -> Bool
/= HasGivenEqs
NoGivenEqs
, Implication -> Bool
ic_warn_inaccessible Implication
implic
= Bool
True
| Bool
otherwise
= [Implication] -> Bool
has_gadt_match [Implication]
implics
isSkolemTy :: TcLevel -> Type -> Bool
isSkolemTy :: TcLevel -> Type -> Bool
isSkolemTy TcLevel
tc_lvl Type
ty
| Just TcId
tv <- Type -> Maybe TcId
getTyVar_maybe Type
ty
= TcId -> Bool
isSkolemTyVar TcId
tv
Bool -> Bool -> Bool
|| (TcId -> Bool
isTyVarTyVar TcId
tv Bool -> Bool -> Bool
&& TcLevel -> TcId -> Bool
isTouchableMetaTyVar TcLevel
tc_lvl TcId
tv)
| Bool
otherwise
= Bool
False
isTyFun_maybe :: Type -> Maybe TyCon
isTyFun_maybe :: Type -> Maybe TyCon
isTyFun_maybe Type
ty = case HasCallStack => Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty of
Just (TyCon
tc,[Type]
_) | TyCon -> Bool
isTypeFamilyTyCon TyCon
tc -> forall a. a -> Maybe a
Just TyCon
tc
Maybe (TyCon, [Type])
_ -> forall a. Maybe a
Nothing
type Reporter
= ReportErrCtxt -> [Ct] -> TcM ()
type ReporterSpec
= ( String
, Ct -> Pred -> Bool
, Bool
, Reporter)
mkSkolReporter :: Reporter
mkSkolReporter :: Reporter
mkSkolReporter ReportErrCtxt
ctxt [Ct]
cts
= forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
reportGroup ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr ReportErrCtxt
ctxt) ([Ct] -> [[Ct]]
group [Ct]
cts)
where
group :: [Ct] -> [[Ct]]
group [] = []
group (Ct
ct:[Ct]
cts) = (Ct
ct forall a. a -> [a] -> [a]
: [Ct]
yeses) forall a. a -> [a] -> [a]
: [Ct] -> [[Ct]]
group [Ct]
noes
where
([Ct]
yeses, [Ct]
noes) = forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (Ct -> Ct -> Bool
group_with Ct
ct) [Ct]
cts
group_with :: Ct -> Ct -> Bool
group_with Ct
ct1 Ct
ct2
| Ordering
EQ <- Ct -> Ct -> Ordering
cmp_loc Ct
ct1 Ct
ct2 = Bool
True
| Ct -> Ct -> Bool
eq_lhs_type Ct
ct1 Ct
ct2 = Bool
True
| Bool
otherwise = Bool
False
reportHoles :: [Ct]
-> ReportErrCtxt -> [Hole] -> TcM ()
reportHoles :: [Ct] -> ReportErrCtxt -> [Hole] -> TcM ()
reportHoles [Ct]
tidy_cts ReportErrCtxt
ctxt [Hole]
holes
= do
let holes' :: [Hole]
holes' = forall a. (a -> Bool) -> [a] -> [a]
filter (ReportErrCtxt -> Hole -> Bool
keepThisHole ReportErrCtxt
ctxt) [Hole]
holes
(TidyEnv
tidy_env', NameEnv Type
lcl_name_cache) <- TidyEnv -> [TcLclEnv] -> TcM (TidyEnv, NameEnv Type)
zonkTidyTcLclEnvs (ReportErrCtxt -> TidyEnv
cec_tidy ReportErrCtxt
ctxt) (forall a b. (a -> b) -> [a] -> [b]
map (CtLoc -> TcLclEnv
ctl_env forall b c a. (b -> c) -> (a -> b) -> a -> c
. Hole -> CtLoc
hole_loc) [Hole]
holes')
let ctxt' :: ReportErrCtxt
ctxt' = ReportErrCtxt
ctxt { cec_tidy :: TidyEnv
cec_tidy = TidyEnv
tidy_env' }
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Hole]
holes' forall a b. (a -> b) -> a -> b
$ \Hole
hole ->
do { MsgEnvelope DecoratedSDoc
err <- NameEnv Type
-> [Ct] -> ReportErrCtxt -> Hole -> TcM (MsgEnvelope DecoratedSDoc)
mkHoleError NameEnv Type
lcl_name_cache [Ct]
tidy_cts ReportErrCtxt
ctxt' Hole
hole
; ReportErrCtxt -> Hole -> MsgEnvelope DecoratedSDoc -> TcM ()
maybeReportHoleError ReportErrCtxt
ctxt Hole
hole MsgEnvelope DecoratedSDoc
err
; ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> Hole -> TcM ()
maybeAddDeferredHoleBinding ReportErrCtxt
ctxt MsgEnvelope DecoratedSDoc
err Hole
hole }
keepThisHole :: ReportErrCtxt -> Hole -> Bool
keepThisHole :: ReportErrCtxt -> Hole -> Bool
keepThisHole ReportErrCtxt
ctxt Hole
hole
= case Hole -> HoleSort
hole_sort Hole
hole of
ExprHole {} -> Bool
True
HoleSort
TypeHole -> Bool
keep_type_hole
HoleSort
ConstraintHole -> Bool
keep_type_hole
where
keep_type_hole :: Bool
keep_type_hole = case ReportErrCtxt -> HoleChoice
cec_type_holes ReportErrCtxt
ctxt of
HoleChoice
HoleDefer -> Bool
False
HoleChoice
_ -> Bool
True
zonkTidyTcLclEnvs :: TidyEnv -> [TcLclEnv] -> TcM (TidyEnv, NameEnv Type)
zonkTidyTcLclEnvs :: TidyEnv -> [TcLclEnv] -> TcM (TidyEnv, NameEnv Type)
zonkTidyTcLclEnvs TidyEnv
tidy_env [TcLclEnv]
lcls = forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldM (TidyEnv, NameEnv Type) -> TcBinder -> TcM (TidyEnv, NameEnv Type)
go (TidyEnv
tidy_env, forall a. NameEnv a
emptyNameEnv) (forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap TcLclEnv -> TcBinderStack
tcl_bndrs [TcLclEnv]
lcls)
where
go :: (TidyEnv, NameEnv Type) -> TcBinder -> TcM (TidyEnv, NameEnv Type)
go (TidyEnv, NameEnv Type)
envs TcBinder
tc_bndr = case TcBinder
tc_bndr of
TcTvBndr {} -> forall (m :: * -> *) a. Monad m => a -> m a
return (TidyEnv, NameEnv Type)
envs
TcIdBndr TcId
id TopLevelFlag
_top_lvl -> Name
-> Type -> (TidyEnv, NameEnv Type) -> TcM (TidyEnv, NameEnv Type)
go_one (TcId -> Name
idName TcId
id) (TcId -> Type
idType TcId
id) (TidyEnv, NameEnv Type)
envs
TcIdBndr_ExpType Name
name ExpType
et TopLevelFlag
_top_lvl ->
do { Maybe Type
mb_ty <- ExpType -> TcM (Maybe Type)
readExpType_maybe ExpType
et
; case Maybe Type
mb_ty of
Just Type
ty -> Name
-> Type -> (TidyEnv, NameEnv Type) -> TcM (TidyEnv, NameEnv Type)
go_one Name
name Type
ty (TidyEnv, NameEnv Type)
envs
Maybe Type
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return (TidyEnv, NameEnv Type)
envs
}
go_one :: Name
-> Type -> (TidyEnv, NameEnv Type) -> TcM (TidyEnv, NameEnv Type)
go_one Name
name Type
ty (TidyEnv
tidy_env, NameEnv Type
name_env) = do
if Name
name forall a. Name -> NameEnv a -> Bool
`elemNameEnv` NameEnv Type
name_env
then forall (m :: * -> *) a. Monad m => a -> m a
return (TidyEnv
tidy_env, NameEnv Type
name_env)
else do
(TidyEnv
tidy_env', Type
tidy_ty) <- TidyEnv -> Type -> TcM (TidyEnv, Type)
zonkTidyTcType TidyEnv
tidy_env Type
ty
forall (m :: * -> *) a. Monad m => a -> m a
return (TidyEnv
tidy_env', forall a. NameEnv a -> Name -> a -> NameEnv a
extendNameEnv NameEnv Type
name_env Name
name Type
tidy_ty)
mkUserTypeErrorReporter :: Reporter
mkUserTypeErrorReporter :: Reporter
mkUserTypeErrorReporter ReportErrCtxt
ctxt
= forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall a b. (a -> b) -> a -> b
$ \Ct
ct -> do { MsgEnvelope DecoratedSDoc
err <- ReportErrCtxt -> Ct -> TcM (MsgEnvelope DecoratedSDoc)
mkUserTypeError ReportErrCtxt
ctxt Ct
ct
; ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> TcM ()
maybeReportError ReportErrCtxt
ctxt MsgEnvelope DecoratedSDoc
err
; ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> Ct -> TcM ()
addDeferredBinding ReportErrCtxt
ctxt MsgEnvelope DecoratedSDoc
err Ct
ct }
mkUserTypeError :: ReportErrCtxt -> Ct -> TcM (MsgEnvelope DecoratedSDoc)
mkUserTypeError :: ReportErrCtxt -> Ct -> TcM (MsgEnvelope DecoratedSDoc)
mkUserTypeError ReportErrCtxt
ctxt Ct
ct = ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct
forall a b. (a -> b) -> a -> b
$ SDoc -> Report
important
forall a b. (a -> b) -> a -> b
$ Type -> SDoc
pprUserTypeErrorTy
forall a b. (a -> b) -> a -> b
$ case Ct -> Maybe Type
getUserTypeErrorMsg Ct
ct of
Just Type
msg -> Type
msg
Maybe Type
Nothing -> forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"mkUserTypeError" (forall a. Outputable a => a -> SDoc
ppr Ct
ct)
mkGivenErrorReporter :: Reporter
mkGivenErrorReporter :: Reporter
mkGivenErrorReporter ReportErrCtxt
ctxt [Ct]
cts
= do { (ReportErrCtxt
ctxt, SDoc
binds_msg, Ct
ct) <- Bool -> ReportErrCtxt -> Ct -> TcM (ReportErrCtxt, SDoc, Ct)
relevantBindings Bool
True ReportErrCtxt
ctxt Ct
ct
; DynFlags
dflags <- forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; let (Implication
implic:[Implication]
_) = ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt
ct' :: Ct
ct' = Ct -> CtLoc -> Ct
setCtLoc Ct
ct (CtLoc -> TcLclEnv -> CtLoc
setCtLocEnv (Ct -> CtLoc
ctLoc Ct
ct) (Implication -> TcLclEnv
ic_env Implication
implic))
inaccessible_msg :: SDoc
inaccessible_msg = SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Inaccessible code in")
Int
2 (forall a. Outputable a => a -> SDoc
ppr (Implication -> SkolemInfo
ic_info Implication
implic))
report :: Report
report = SDoc -> Report
important SDoc
inaccessible_msg forall a. Monoid a => a -> a -> a
`mappend`
SDoc -> Report
mk_relevant_bindings SDoc
binds_msg
; MsgEnvelope DecoratedSDoc
err <- DynFlags
-> ReportErrCtxt
-> Report
-> Ct
-> Type
-> Type
-> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr_help DynFlags
dflags ReportErrCtxt
ctxt Report
report Ct
ct' Type
ty1 Type
ty2
; String -> SDoc -> TcM ()
traceTc String
"mkGivenErrorReporter" (forall a. Outputable a => a -> SDoc
ppr Ct
ct)
; WarnReason -> MsgEnvelope DecoratedSDoc -> TcM ()
reportWarning (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnInaccessibleCode) MsgEnvelope DecoratedSDoc
err }
where
(Ct
ct : [Ct]
_ ) = [Ct]
cts
(Type
ty1, Type
ty2) = Type -> (Type, Type)
getEqPredTys (Ct -> Type
ctPred Ct
ct)
ignoreErrorReporter :: Reporter
ignoreErrorReporter :: Reporter
ignoreErrorReporter ReportErrCtxt
ctxt [Ct]
cts
= do { String -> SDoc -> TcM ()
traceTc String
"mkGivenErrorReporter no" (forall a. Outputable a => a -> SDoc
ppr [Ct]
cts SDoc -> SDoc -> SDoc
$$ forall a. Outputable a => a -> SDoc
ppr (ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt))
; forall (m :: * -> *) a. Monad m => a -> m a
return () }
mkGroupReporter :: (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkGroupReporter :: (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkGroupReporter ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mk_err ReportErrCtxt
ctxt [Ct]
cts
= forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
reportGroup ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mk_err ReportErrCtxt
ctxt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> [a]
toList) (forall a. (a -> a -> Ordering) -> [a] -> [NonEmpty a]
equivClasses Ct -> Ct -> Ordering
cmp_loc [Ct]
cts)
mkSuppressReporter :: (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)) -> Reporter
mkSuppressReporter :: (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
mkSuppressReporter ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mk_err ReportErrCtxt
ctxt [Ct]
cts
= forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
suppressGroup ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mk_err ReportErrCtxt
ctxt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> [a]
toList) (forall a. (a -> a -> Ordering) -> [a] -> [NonEmpty a]
equivClasses Ct -> Ct -> Ordering
cmp_loc [Ct]
cts)
eq_lhs_type :: Ct -> Ct -> Bool
eq_lhs_type :: Ct -> Ct -> Bool
eq_lhs_type Ct
ct1 Ct
ct2
= case (Type -> Pred
classifyPredType (Ct -> Type
ctPred Ct
ct1), Type -> Pred
classifyPredType (Ct -> Type
ctPred Ct
ct2)) of
(EqPred EqRel
eq_rel1 Type
ty1 Type
_, EqPred EqRel
eq_rel2 Type
ty2 Type
_) ->
(EqRel
eq_rel1 forall a. Eq a => a -> a -> Bool
== EqRel
eq_rel2) Bool -> Bool -> Bool
&& (Type
ty1 Type -> Type -> Bool
`eqType` Type
ty2)
(Pred, Pred)
_ -> forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"mkSkolReporter" (forall a. Outputable a => a -> SDoc
ppr Ct
ct1 SDoc -> SDoc -> SDoc
$$ forall a. Outputable a => a -> SDoc
ppr Ct
ct2)
cmp_loc :: Ct -> Ct -> Ordering
cmp_loc :: Ct -> Ct -> Ordering
cmp_loc Ct
ct1 Ct
ct2 = Ct -> RealSrcLoc
get Ct
ct1 forall a. Ord a => a -> a -> Ordering
`compare` Ct -> RealSrcLoc
get Ct
ct2
where
get :: Ct -> RealSrcLoc
get Ct
ct = RealSrcSpan -> RealSrcLoc
realSrcSpanStart (CtLoc -> RealSrcSpan
ctLocSpan (Ct -> CtLoc
ctLoc Ct
ct))
reportGroup :: (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)) -> Reporter
reportGroup :: (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
reportGroup ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mk_err ReportErrCtxt
ctxt [Ct]
cts =
ASSERT( not (null cts))
do { MsgEnvelope DecoratedSDoc
err <- ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mk_err ReportErrCtxt
ctxt [Ct]
cts
; String -> SDoc -> TcM ()
traceTc String
"About to maybeReportErr" forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Constraint:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr [Ct]
cts
, String -> SDoc
text String
"cec_suppress =" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (ReportErrCtxt -> Bool
cec_suppress ReportErrCtxt
ctxt)
, String -> SDoc
text String
"cec_defer_type_errors =" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (ReportErrCtxt -> TypeErrorChoice
cec_defer_type_errors ReportErrCtxt
ctxt) ]
; ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> TcM ()
maybeReportError ReportErrCtxt
ctxt MsgEnvelope DecoratedSDoc
err
; String -> SDoc -> TcM ()
traceTc String
"reportGroup" (forall a. Outputable a => a -> SDoc
ppr [Ct]
cts)
; forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> Ct -> TcM ()
addDeferredBinding ReportErrCtxt
ctxt MsgEnvelope DecoratedSDoc
err) [Ct]
cts }
suppressGroup :: (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)) -> Reporter
suppressGroup :: (ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc))
-> Reporter
suppressGroup ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mk_err ReportErrCtxt
ctxt [Ct]
cts
= do { MsgEnvelope DecoratedSDoc
err <- ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mk_err ReportErrCtxt
ctxt [Ct]
cts
; String -> SDoc -> TcM ()
traceTc String
"Suppressing errors for" (forall a. Outputable a => a -> SDoc
ppr [Ct]
cts)
; forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> Ct -> TcM ()
addDeferredBinding ReportErrCtxt
ctxt MsgEnvelope DecoratedSDoc
err) [Ct]
cts }
maybeReportHoleError :: ReportErrCtxt -> Hole -> MsgEnvelope DecoratedSDoc -> TcM ()
maybeReportHoleError :: ReportErrCtxt -> Hole -> MsgEnvelope DecoratedSDoc -> TcM ()
maybeReportHoleError ReportErrCtxt
ctxt Hole
hole MsgEnvelope DecoratedSDoc
err
| Hole -> Bool
isOutOfScopeHole Hole
hole
=
case ReportErrCtxt -> HoleChoice
cec_out_of_scope_holes ReportErrCtxt
ctxt of
HoleChoice
HoleError -> MsgEnvelope DecoratedSDoc -> TcM ()
reportError MsgEnvelope DecoratedSDoc
err
HoleChoice
HoleWarn ->
WarnReason -> MsgEnvelope DecoratedSDoc -> TcM ()
reportWarning (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnDeferredOutOfScopeVariables) MsgEnvelope DecoratedSDoc
err
HoleChoice
HoleDefer -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
maybeReportHoleError ReportErrCtxt
ctxt (Hole { hole_sort :: Hole -> HoleSort
hole_sort = HoleSort
hole_sort }) MsgEnvelope DecoratedSDoc
err
| case HoleSort
hole_sort of HoleSort
TypeHole -> Bool
True
HoleSort
ConstraintHole -> Bool
True
HoleSort
_ -> Bool
False
=
case ReportErrCtxt -> HoleChoice
cec_type_holes ReportErrCtxt
ctxt of
HoleChoice
HoleError -> MsgEnvelope DecoratedSDoc -> TcM ()
reportError MsgEnvelope DecoratedSDoc
err
HoleChoice
HoleWarn -> WarnReason -> MsgEnvelope DecoratedSDoc -> TcM ()
reportWarning (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnPartialTypeSignatures) MsgEnvelope DecoratedSDoc
err
HoleChoice
HoleDefer -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
maybeReportHoleError ReportErrCtxt
ctxt Hole
hole MsgEnvelope DecoratedSDoc
err
=
ASSERT( not (isOutOfScopeHole hole) )
case ReportErrCtxt -> HoleChoice
cec_expr_holes ReportErrCtxt
ctxt of
HoleChoice
HoleError -> MsgEnvelope DecoratedSDoc -> TcM ()
reportError MsgEnvelope DecoratedSDoc
err
HoleChoice
HoleWarn -> WarnReason -> MsgEnvelope DecoratedSDoc -> TcM ()
reportWarning (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnTypedHoles) MsgEnvelope DecoratedSDoc
err
HoleChoice
HoleDefer -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
maybeReportError :: ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> TcM ()
maybeReportError :: ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> TcM ()
maybeReportError ReportErrCtxt
ctxt MsgEnvelope DecoratedSDoc
err
| ReportErrCtxt -> Bool
cec_suppress ReportErrCtxt
ctxt
= forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise
= case ReportErrCtxt -> TypeErrorChoice
cec_defer_type_errors ReportErrCtxt
ctxt of
TypeErrorChoice
TypeDefer -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
TypeWarn WarnReason
reason -> WarnReason -> MsgEnvelope DecoratedSDoc -> TcM ()
reportWarning WarnReason
reason MsgEnvelope DecoratedSDoc
err
TypeErrorChoice
TypeError -> MsgEnvelope DecoratedSDoc -> TcM ()
reportError MsgEnvelope DecoratedSDoc
err
addDeferredBinding :: ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> Ct -> TcM ()
addDeferredBinding :: ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> Ct -> TcM ()
addDeferredBinding ReportErrCtxt
ctxt MsgEnvelope DecoratedSDoc
err Ct
ct
| ReportErrCtxt -> Bool
deferringAnyBindings ReportErrCtxt
ctxt
, CtWanted { ctev_pred :: CtEvidence -> Type
ctev_pred = Type
pred, ctev_dest :: CtEvidence -> TcEvDest
ctev_dest = TcEvDest
dest } <- Ct -> CtEvidence
ctEvidence Ct
ct
= do { DynFlags
dflags <- forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; let err_tm :: EvTerm
err_tm = DynFlags -> Type -> MsgEnvelope DecoratedSDoc -> EvTerm
mkErrorTerm DynFlags
dflags Type
pred MsgEnvelope DecoratedSDoc
err
ev_binds_var :: EvBindsVar
ev_binds_var = ReportErrCtxt -> EvBindsVar
cec_binds ReportErrCtxt
ctxt
; case TcEvDest
dest of
EvVarDest TcId
evar
-> EvBindsVar -> EvBind -> TcM ()
addTcEvBind EvBindsVar
ev_binds_var forall a b. (a -> b) -> a -> b
$ TcId -> EvTerm -> EvBind
mkWantedEvBind TcId
evar EvTerm
err_tm
HoleDest CoercionHole
hole
-> do {
let co_var :: TcId
co_var = CoercionHole -> TcId
coHoleCoVar CoercionHole
hole
; EvBindsVar -> EvBind -> TcM ()
addTcEvBind EvBindsVar
ev_binds_var forall a b. (a -> b) -> a -> b
$ TcId -> EvTerm -> EvBind
mkWantedEvBind TcId
co_var EvTerm
err_tm
; CoercionHole -> Coercion -> TcM ()
fillCoercionHole CoercionHole
hole (TcId -> Coercion
mkTcCoVarCo TcId
co_var) }}
| Bool
otherwise
= forall (m :: * -> *) a. Monad m => a -> m a
return ()
mkErrorTerm :: DynFlags -> Type
-> MsgEnvelope DecoratedSDoc -> EvTerm
mkErrorTerm :: DynFlags -> Type -> MsgEnvelope DecoratedSDoc -> EvTerm
mkErrorTerm DynFlags
dflags Type
ty MsgEnvelope DecoratedSDoc
err = Type -> FastString -> EvTerm
evDelayedError Type
ty FastString
err_fs
where
err_msg :: SDoc
err_msg = forall e. RenderableDiagnostic e => MsgEnvelope e -> SDoc
pprLocMsgEnvelope MsgEnvelope DecoratedSDoc
err
err_fs :: FastString
err_fs = String -> FastString
mkFastString forall a b. (a -> b) -> a -> b
$ DynFlags -> SDoc -> String
showSDoc DynFlags
dflags forall a b. (a -> b) -> a -> b
$
SDoc
err_msg SDoc -> SDoc -> SDoc
$$ String -> SDoc
text String
"(deferred type error)"
maybeAddDeferredHoleBinding :: ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> Hole -> TcM ()
maybeAddDeferredHoleBinding :: ReportErrCtxt -> MsgEnvelope DecoratedSDoc -> Hole -> TcM ()
maybeAddDeferredHoleBinding ReportErrCtxt
ctxt MsgEnvelope DecoratedSDoc
err (Hole { hole_sort :: Hole -> HoleSort
hole_sort = ExprHole (HER IORef EvTerm
ref Type
ref_ty Unique
_) })
| ReportErrCtxt -> Bool
deferringAnyBindings ReportErrCtxt
ctxt
= do { DynFlags
dflags <- forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; let err_tm :: EvTerm
err_tm = DynFlags -> Type -> MsgEnvelope DecoratedSDoc -> EvTerm
mkErrorTerm DynFlags
dflags Type
ref_ty MsgEnvelope DecoratedSDoc
err
; forall a env. IORef a -> a -> IOEnv env ()
writeMutVar IORef EvTerm
ref EvTerm
err_tm }
| Bool
otherwise
= forall (m :: * -> *) a. Monad m => a -> m a
return ()
maybeAddDeferredHoleBinding ReportErrCtxt
_ MsgEnvelope DecoratedSDoc
_ (Hole { hole_sort :: Hole -> HoleSort
hole_sort = HoleSort
TypeHole })
= forall (m :: * -> *) a. Monad m => a -> m a
return ()
maybeAddDeferredHoleBinding ReportErrCtxt
_ MsgEnvelope DecoratedSDoc
_ (Hole { hole_sort :: Hole -> HoleSort
hole_sort = HoleSort
ConstraintHole })
= forall (m :: * -> *) a. Monad m => a -> m a
return ()
tryReporters :: ReportErrCtxt -> [ReporterSpec] -> [Ct] -> TcM (ReportErrCtxt, [Ct])
tryReporters :: ReportErrCtxt
-> [ReporterSpec] -> [Ct] -> TcM (ReportErrCtxt, [Ct])
tryReporters ReportErrCtxt
ctxt [ReporterSpec]
reporters [Ct]
cts
= do { let ([Ct]
vis_cts, [Ct]
invis_cts) = forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (CtOrigin -> Bool
isVisibleOrigin forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ct -> CtOrigin
ctOrigin) [Ct]
cts
; String -> SDoc -> TcM ()
traceTc String
"tryReporters {" (forall a. Outputable a => a -> SDoc
ppr [Ct]
vis_cts SDoc -> SDoc -> SDoc
$$ forall a. Outputable a => a -> SDoc
ppr [Ct]
invis_cts)
; (ReportErrCtxt
ctxt', [Ct]
cts') <- ReportErrCtxt
-> [ReporterSpec] -> [Ct] -> [Ct] -> TcM (ReportErrCtxt, [Ct])
go ReportErrCtxt
ctxt [ReporterSpec]
reporters [Ct]
vis_cts [Ct]
invis_cts
; String -> SDoc -> TcM ()
traceTc String
"tryReporters }" (forall a. Outputable a => a -> SDoc
ppr [Ct]
cts')
; forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt', [Ct]
cts') }
where
go :: ReportErrCtxt
-> [ReporterSpec] -> [Ct] -> [Ct] -> TcM (ReportErrCtxt, [Ct])
go ReportErrCtxt
ctxt [] [Ct]
vis_cts [Ct]
invis_cts
= forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt, [Ct]
vis_cts forall a. [a] -> [a] -> [a]
++ [Ct]
invis_cts)
go ReportErrCtxt
ctxt (ReporterSpec
r : [ReporterSpec]
rs) [Ct]
vis_cts [Ct]
invis_cts
= do { (ReportErrCtxt
ctxt', [Ct]
vis_cts') <- ReportErrCtxt -> ReporterSpec -> [Ct] -> TcM (ReportErrCtxt, [Ct])
tryReporter ReportErrCtxt
ctxt ReporterSpec
r [Ct]
vis_cts
; (ReportErrCtxt
ctxt'', [Ct]
invis_cts') <- ReportErrCtxt -> ReporterSpec -> [Ct] -> TcM (ReportErrCtxt, [Ct])
tryReporter ReportErrCtxt
ctxt' ReporterSpec
r [Ct]
invis_cts
; ReportErrCtxt
-> [ReporterSpec] -> [Ct] -> [Ct] -> TcM (ReportErrCtxt, [Ct])
go ReportErrCtxt
ctxt'' [ReporterSpec]
rs [Ct]
vis_cts' [Ct]
invis_cts' }
tryReporter :: ReportErrCtxt -> ReporterSpec -> [Ct] -> TcM (ReportErrCtxt, [Ct])
tryReporter :: ReportErrCtxt -> ReporterSpec -> [Ct] -> TcM (ReportErrCtxt, [Ct])
tryReporter ReportErrCtxt
ctxt (String
str, Ct -> Pred -> Bool
keep_me, Bool
suppress_after, Reporter
reporter) [Ct]
cts
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Ct]
yeses
= forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt, [Ct]
cts)
| Bool
otherwise
= do { String -> SDoc -> TcM ()
traceTc String
"tryReporter{ " (String -> SDoc
text String
str SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr [Ct]
yeses)
; (()
_, Bool
no_errs) <- forall a. TcRn a -> TcRn (a, Bool)
askNoErrs (Reporter
reporter ReportErrCtxt
ctxt [Ct]
yeses)
; let suppress_now :: Bool
suppress_now = Bool -> Bool
not Bool
no_errs Bool -> Bool -> Bool
&& Bool
suppress_after
ctxt' :: ReportErrCtxt
ctxt' = ReportErrCtxt
ctxt { cec_suppress :: Bool
cec_suppress = Bool
suppress_now Bool -> Bool -> Bool
|| ReportErrCtxt -> Bool
cec_suppress ReportErrCtxt
ctxt }
; String -> SDoc -> TcM ()
traceTc String
"tryReporter end }" (String -> SDoc
text String
str SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (ReportErrCtxt -> Bool
cec_suppress ReportErrCtxt
ctxt) SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Bool
suppress_after)
; forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt', [Ct]
nos) }
where
([Ct]
yeses, [Ct]
nos) = forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (\Ct
ct -> Ct -> Pred -> Bool
keep_me Ct
ct (Type -> Pred
classifyPredType (Ct -> Type
ctPred Ct
ct))) [Ct]
cts
pprArising :: CtOrigin -> SDoc
pprArising :: CtOrigin -> SDoc
pprArising (TypeEqOrigin {}) = SDoc
empty
pprArising (KindEqOrigin {}) = SDoc
empty
pprArising CtOrigin
orig | CtOrigin -> Bool
isGivenOrigin CtOrigin
orig = SDoc
empty
| Bool
otherwise = CtOrigin -> SDoc
pprCtOrigin CtOrigin
orig
addArising :: CtOrigin -> SDoc -> SDoc
addArising :: CtOrigin -> SDoc -> SDoc
addArising CtOrigin
orig SDoc
msg = SDoc -> Int -> SDoc -> SDoc
hang SDoc
msg Int
2 (CtOrigin -> SDoc
pprArising CtOrigin
orig)
pprWithArising :: [Ct] -> (CtLoc, SDoc)
pprWithArising :: [Ct] -> (CtLoc, SDoc)
pprWithArising []
= forall a. String -> a
panic String
"pprWithArising"
pprWithArising (Ct
ct:[Ct]
cts)
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Ct]
cts
= (CtLoc
loc, CtOrigin -> SDoc -> SDoc
addArising (CtLoc -> CtOrigin
ctLocOrigin CtLoc
loc)
([Type] -> SDoc
pprTheta [Ct -> Type
ctPred Ct
ct]))
| Bool
otherwise
= (CtLoc
loc, [SDoc] -> SDoc
vcat (forall a b. (a -> b) -> [a] -> [b]
map Ct -> SDoc
ppr_one (Ct
ctforall a. a -> [a] -> [a]
:[Ct]
cts)))
where
loc :: CtLoc
loc = Ct -> CtLoc
ctLoc Ct
ct
ppr_one :: Ct -> SDoc
ppr_one Ct
ct' = SDoc -> Int -> SDoc -> SDoc
hang (SDoc -> SDoc
parens (Type -> SDoc
pprType (Ct -> Type
ctPred Ct
ct')))
Int
2 (CtLoc -> SDoc
pprCtLoc (Ct -> CtLoc
ctLoc Ct
ct'))
mkErrorMsgFromCt :: ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt :: ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct Report
report
= ReportErrCtxt
-> TcLclEnv -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorReport ReportErrCtxt
ctxt (CtLoc -> TcLclEnv
ctLocEnv (Ct -> CtLoc
ctLoc Ct
ct)) Report
report
mkErrorReport :: ReportErrCtxt -> TcLclEnv -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorReport :: ReportErrCtxt
-> TcLclEnv -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorReport ReportErrCtxt
ctxt TcLclEnv
tcl_env (Report [SDoc]
important [SDoc]
relevant_bindings [SDoc]
valid_subs)
= do { SDoc
context <- TidyEnv -> [ErrCtxt] -> TcM SDoc
mkErrInfo (ReportErrCtxt -> TidyEnv
cec_tidy ReportErrCtxt
ctxt) (TcLclEnv -> [ErrCtxt]
tcl_ctxt TcLclEnv
tcl_env)
; SrcSpan -> SDoc -> SDoc -> SDoc -> TcM (MsgEnvelope DecoratedSDoc)
mkDecoratedSDocAt (RealSrcSpan -> Maybe BufSpan -> SrcSpan
RealSrcSpan (TcLclEnv -> RealSrcSpan
tcl_loc TcLclEnv
tcl_env) forall a. Maybe a
Nothing)
([SDoc] -> SDoc
vcat [SDoc]
important)
SDoc
context
([SDoc] -> SDoc
vcat forall a b. (a -> b) -> a -> b
$ [SDoc]
relevant_bindings forall a. [a] -> [a] -> [a]
++ [SDoc]
valid_subs)
}
type UserGiven = Implication
getUserGivens :: ReportErrCtxt -> [UserGiven]
getUserGivens :: ReportErrCtxt -> [Implication]
getUserGivens (CEC {cec_encl :: ReportErrCtxt -> [Implication]
cec_encl = [Implication]
implics}) = [Implication] -> [Implication]
getUserGivensFromImplics [Implication]
implics
getUserGivensFromImplics :: [Implication] -> [UserGiven]
getUserGivensFromImplics :: [Implication] -> [Implication]
getUserGivensFromImplics [Implication]
implics
= forall a. [a] -> [a]
reverse (forall a. (a -> Bool) -> [a] -> [a]
filterOut (forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. Implication -> [TcId]
ic_given) [Implication]
implics)
mkIrredErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkIrredErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkIrredErr ReportErrCtxt
ctxt [Ct]
cts
= do { (ReportErrCtxt
ctxt, SDoc
binds_msg, Ct
ct1) <- Bool -> ReportErrCtxt -> Ct -> TcM (ReportErrCtxt, SDoc, Ct)
relevantBindings Bool
True ReportErrCtxt
ctxt Ct
ct1
; let orig :: CtOrigin
orig = Ct -> CtOrigin
ctOrigin Ct
ct1
msg :: Report
msg = [Implication] -> ([Type], CtOrigin) -> Report
couldNotDeduce (ReportErrCtxt -> [Implication]
getUserGivens ReportErrCtxt
ctxt) (forall a b. (a -> b) -> [a] -> [b]
map Ct -> Type
ctPred [Ct]
cts, CtOrigin
orig)
; ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct1 forall a b. (a -> b) -> a -> b
$
Report
msg forall a. Monoid a => a -> a -> a
`mappend` SDoc -> Report
mk_relevant_bindings SDoc
binds_msg }
where
(Ct
ct1:[Ct]
_) = [Ct]
cts
mkHoleError :: NameEnv Type -> [Ct] -> ReportErrCtxt -> Hole -> TcM (MsgEnvelope DecoratedSDoc)
mkHoleError :: NameEnv Type
-> [Ct] -> ReportErrCtxt -> Hole -> TcM (MsgEnvelope DecoratedSDoc)
mkHoleError NameEnv Type
_ [Ct]
_tidy_simples ReportErrCtxt
_ctxt hole :: Hole
hole@(Hole { hole_occ :: Hole -> OccName
hole_occ = OccName
occ
, hole_ty :: Hole -> Type
hole_ty = Type
hole_ty
, hole_loc :: Hole -> CtLoc
hole_loc = CtLoc
ct_loc })
| Hole -> Bool
isOutOfScopeHole Hole
hole
= do { DynFlags
dflags <- forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; GlobalRdrEnv
rdr_env <- TcRn GlobalRdrEnv
getGlobalRdrEnv
; ImportAvails
imp_info <- TcRn ImportAvails
getImports
; Module
curr_mod <- forall (m :: * -> *). HasModule m => m Module
getModule
; HomePackageTable
hpt <- forall gbl lcl. TcRnIf gbl lcl HomePackageTable
getHpt
; SrcSpan -> SDoc -> SDoc -> SDoc -> TcM (MsgEnvelope DecoratedSDoc)
mkDecoratedSDocAt (RealSrcSpan -> Maybe BufSpan -> SrcSpan
RealSrcSpan (TcLclEnv -> RealSrcSpan
tcl_loc TcLclEnv
lcl_env) forall a. Maybe a
Nothing)
SDoc
out_of_scope_msg SDoc
O.empty
(DynFlags
-> HomePackageTable
-> Module
-> GlobalRdrEnv
-> LocalRdrEnv
-> ImportAvails
-> RdrName
-> SDoc
unknownNameSuggestions DynFlags
dflags HomePackageTable
hpt Module
curr_mod GlobalRdrEnv
rdr_env
(TcLclEnv -> LocalRdrEnv
tcl_rdr TcLclEnv
lcl_env) ImportAvails
imp_info (OccName -> RdrName
mkRdrUnqual OccName
occ)) }
where
herald :: SDoc
herald | OccName -> Bool
isDataOcc OccName
occ = String -> SDoc
text String
"Data constructor not in scope:"
| Bool
otherwise = String -> SDoc
text String
"Variable not in scope:"
out_of_scope_msg :: SDoc
out_of_scope_msg
| Bool
boring_type = SDoc -> Int -> SDoc -> SDoc
hang SDoc
herald Int
2 (forall a. Outputable a => a -> SDoc
ppr OccName
occ)
| Bool
otherwise = SDoc -> Int -> SDoc -> SDoc
hang SDoc
herald Int
2 (OccName -> Type -> SDoc
pp_occ_with_type OccName
occ Type
hole_ty)
lcl_env :: TcLclEnv
lcl_env = CtLoc -> TcLclEnv
ctLocEnv CtLoc
ct_loc
boring_type :: Bool
boring_type = Type -> Bool
isTyVarTy Type
hole_ty
mkHoleError NameEnv Type
lcl_name_cache [Ct]
tidy_simples ReportErrCtxt
ctxt hole :: Hole
hole@(Hole { hole_occ :: Hole -> OccName
hole_occ = OccName
occ
, hole_ty :: Hole -> Type
hole_ty = Type
hole_ty
, hole_sort :: Hole -> HoleSort
hole_sort = HoleSort
sort
, hole_loc :: Hole -> CtLoc
hole_loc = CtLoc
ct_loc })
= do { SDoc
binds_msg
<- Bool -> TcLclEnv -> NameEnv Type -> TyCoVarSet -> TcM SDoc
relevant_bindings Bool
False TcLclEnv
lcl_env NameEnv Type
lcl_name_cache (Type -> TyCoVarSet
tyCoVarsOfType Type
hole_ty)
; Bool
show_hole_constraints <- forall gbl lcl. GeneralFlag -> TcRnIf gbl lcl Bool
goptM GeneralFlag
Opt_ShowHoleConstraints
; let constraints_msg :: SDoc
constraints_msg
| ExprHole HoleExprRef
_ <- HoleSort
sort, Bool
show_hole_constraints
= ReportErrCtxt -> SDoc
givenConstraintsMsg ReportErrCtxt
ctxt
| Bool
otherwise
= SDoc
empty
; Bool
show_valid_hole_fits <- forall gbl lcl. GeneralFlag -> TcRnIf gbl lcl Bool
goptM GeneralFlag
Opt_ShowValidHoleFits
; (ReportErrCtxt
ctxt, SDoc
sub_msg) <- if Bool
show_valid_hole_fits
then ReportErrCtxt -> [Ct] -> Hole -> TcM (ReportErrCtxt, SDoc)
validHoleFits ReportErrCtxt
ctxt [Ct]
tidy_simples Hole
hole
else forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt, SDoc
empty)
; ReportErrCtxt
-> TcLclEnv -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorReport ReportErrCtxt
ctxt TcLclEnv
lcl_env forall a b. (a -> b) -> a -> b
$
SDoc -> Report
important SDoc
hole_msg forall a. Monoid a => a -> a -> a
`mappend`
SDoc -> Report
mk_relevant_bindings (SDoc
binds_msg SDoc -> SDoc -> SDoc
$$ SDoc
constraints_msg) forall a. Monoid a => a -> a -> a
`mappend`
SDoc -> Report
valid_hole_fits SDoc
sub_msg }
where
lcl_env :: TcLclEnv
lcl_env = CtLoc -> TcLclEnv
ctLocEnv CtLoc
ct_loc
hole_kind :: Type
hole_kind = HasDebugCallStack => Type -> Type
tcTypeKind Type
hole_ty
tyvars :: [TcId]
tyvars = Type -> [TcId]
tyCoVarsOfTypeList Type
hole_ty
hole_msg :: SDoc
hole_msg = case HoleSort
sort of
ExprHole HoleExprRef
_ -> [SDoc] -> SDoc
vcat [ SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Found hole:")
Int
2 (OccName -> Type -> SDoc
pp_occ_with_type OccName
occ Type
hole_ty)
, SDoc
tyvars_msg, SDoc
expr_hole_hint ]
HoleSort
TypeHole -> [SDoc] -> SDoc
vcat [ SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Found type wildcard" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr OccName
occ))
Int
2 (String -> SDoc
text String
"standing for" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes SDoc
pp_hole_type_with_kind)
, SDoc
tyvars_msg, SDoc
type_hole_hint ]
HoleSort
ConstraintHole -> [SDoc] -> SDoc
vcat [ SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Found extra-constraints wildcard standing for")
Int
2 (SDoc -> SDoc
quotes forall a b. (a -> b) -> a -> b
$ Type -> SDoc
pprType Type
hole_ty)
, SDoc
tyvars_msg, SDoc
type_hole_hint ]
pp_hole_type_with_kind :: SDoc
pp_hole_type_with_kind
| Type -> Bool
isLiftedTypeKind Type
hole_kind
Bool -> Bool -> Bool
|| Type -> Bool
isCoVarType Type
hole_ty
= Type -> SDoc
pprType Type
hole_ty
| Bool
otherwise
= Type -> SDoc
pprType Type
hole_ty SDoc -> SDoc -> SDoc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
<+> Type -> SDoc
pprKind Type
hole_kind
tyvars_msg :: SDoc
tyvars_msg = Bool -> SDoc -> SDoc
ppUnless (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
tyvars) forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
"Where:" SDoc -> SDoc -> SDoc
<+> ([SDoc] -> SDoc
vcat (forall a b. (a -> b) -> [a] -> [b]
map TcId -> SDoc
loc_msg [TcId]
other_tvs)
SDoc -> SDoc -> SDoc
$$ ReportErrCtxt -> [TcId] -> SDoc
pprSkols ReportErrCtxt
ctxt [TcId]
skol_tvs)
where
([TcId]
skol_tvs, [TcId]
other_tvs) = forall a. (a -> Bool) -> [a] -> ([a], [a])
partition TcId -> Bool
is_skol [TcId]
tyvars
is_skol :: TcId -> Bool
is_skol TcId
tv = TcId -> Bool
isTcTyVar TcId
tv Bool -> Bool -> Bool
&& TcId -> Bool
isSkolemTyVar TcId
tv
type_hole_hint :: SDoc
type_hole_hint
| HoleChoice
HoleError <- ReportErrCtxt -> HoleChoice
cec_type_holes ReportErrCtxt
ctxt
= String -> SDoc
text String
"To use the inferred type, enable PartialTypeSignatures"
| Bool
otherwise
= SDoc
empty
expr_hole_hint :: SDoc
expr_hole_hint
| FastString -> Int
lengthFS (OccName -> FastString
occNameFS OccName
occ) forall a. Ord a => a -> a -> Bool
> Int
1
= String -> SDoc
text String
"Or perhaps" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr OccName
occ)
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"is mis-spelled, or not in scope"
| Bool
otherwise
= SDoc
empty
loc_msg :: TcId -> SDoc
loc_msg TcId
tv
| TcId -> Bool
isTyVar TcId
tv
= case TcId -> TcTyVarDetails
tcTyVarDetails TcId
tv of
MetaTv {} -> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr TcId
tv) SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"is an ambiguous type variable"
TcTyVarDetails
_ -> SDoc
empty
| Bool
otherwise
= (SDocContext -> Bool) -> SDoc -> SDoc
ppWhenOption SDocContext -> Bool
sdocPrintExplicitCoercions forall a b. (a -> b) -> a -> b
$
SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr TcId
tv) SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"is a coercion variable"
pp_occ_with_type :: OccName -> Type -> SDoc
pp_occ_with_type :: OccName -> Type -> SDoc
pp_occ_with_type OccName
occ Type
hole_ty = SDoc -> Int -> SDoc -> SDoc
hang (forall a. OutputableBndr a => a -> SDoc
pprPrefixOcc OccName
occ) Int
2 (SDoc
dcolon SDoc -> SDoc -> SDoc
<+> Type -> SDoc
pprType Type
hole_ty)
validHoleFits :: ReportErrCtxt
-> [Ct]
-> Hole
-> TcM (ReportErrCtxt, SDoc)
validHoleFits :: ReportErrCtxt -> [Ct] -> Hole -> TcM (ReportErrCtxt, SDoc)
validHoleFits ctxt :: ReportErrCtxt
ctxt@(CEC {cec_encl :: ReportErrCtxt -> [Implication]
cec_encl = [Implication]
implics
, cec_tidy :: ReportErrCtxt -> TidyEnv
cec_tidy = TidyEnv
lcl_env}) [Ct]
simps Hole
hole
= do { (TidyEnv
tidy_env, SDoc
msg) <- TidyEnv -> [Implication] -> [Ct] -> Hole -> TcM (TidyEnv, SDoc)
findValidHoleFits TidyEnv
lcl_env [Implication]
implics [Ct]
simps Hole
hole
; forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt {cec_tidy :: TidyEnv
cec_tidy = TidyEnv
tidy_env}, SDoc
msg) }
givenConstraintsMsg :: ReportErrCtxt -> SDoc
givenConstraintsMsg :: ReportErrCtxt -> SDoc
givenConstraintsMsg ReportErrCtxt
ctxt =
let constraints :: [(Type, RealSrcSpan)]
constraints :: [(Type, RealSrcSpan)]
constraints =
do { implic :: Implication
implic@Implic{ ic_given :: Implication -> [TcId]
ic_given = [TcId]
given } <- ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt
; TcId
constraint <- [TcId]
given
; forall (m :: * -> *) a. Monad m => a -> m a
return (TcId -> Type
varType TcId
constraint, TcLclEnv -> RealSrcSpan
tcl_loc (Implication -> TcLclEnv
ic_env Implication
implic)) }
pprConstraint :: (a, a) -> SDoc
pprConstraint (a
constraint, a
loc) =
forall a. Outputable a => a -> SDoc
ppr a
constraint SDoc -> SDoc -> SDoc
<+> Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc
parens (String -> SDoc
text String
"from" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr a
loc))
in Bool -> SDoc -> SDoc
ppUnless (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Type, RealSrcSpan)]
constraints) forall a b. (a -> b) -> a -> b
$
SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Constraints include")
Int
2 ([SDoc] -> SDoc
vcat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall {a} {a}. (Outputable a, Outputable a) => (a, a) -> SDoc
pprConstraint [(Type, RealSrcSpan)]
constraints)
mkIPErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkIPErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkIPErr ReportErrCtxt
ctxt [Ct]
cts
= do { (ReportErrCtxt
ctxt, SDoc
binds_msg, Ct
ct1) <- Bool -> ReportErrCtxt -> Ct -> TcM (ReportErrCtxt, SDoc, Ct)
relevantBindings Bool
True ReportErrCtxt
ctxt Ct
ct1
; let orig :: CtOrigin
orig = Ct -> CtOrigin
ctOrigin Ct
ct1
preds :: [Type]
preds = forall a b. (a -> b) -> [a] -> [b]
map Ct -> Type
ctPred [Ct]
cts
givens :: [Implication]
givens = ReportErrCtxt -> [Implication]
getUserGivens ReportErrCtxt
ctxt
msg :: Report
msg | forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Implication]
givens
= SDoc -> Report
important forall a b. (a -> b) -> a -> b
$ CtOrigin -> SDoc -> SDoc
addArising CtOrigin
orig forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
sep [ String -> SDoc
text String
"Unbound implicit parameter" SDoc -> SDoc -> SDoc
<> forall a. [a] -> SDoc
plural [Ct]
cts
, Int -> SDoc -> SDoc
nest Int
2 ([Type] -> SDoc
pprParendTheta [Type]
preds) ]
| Bool
otherwise
= [Implication] -> ([Type], CtOrigin) -> Report
couldNotDeduce [Implication]
givens ([Type]
preds, CtOrigin
orig)
; ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct1 forall a b. (a -> b) -> a -> b
$
Report
msg forall a. Monoid a => a -> a -> a
`mappend` SDoc -> Report
mk_relevant_bindings SDoc
binds_msg }
where
(Ct
ct1:[Ct]
_) = [Ct]
cts
mkEqErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr ReportErrCtxt
ctxt (Ct
ct:[Ct]
_) = ReportErrCtxt -> Ct -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr1 ReportErrCtxt
ctxt Ct
ct
mkEqErr ReportErrCtxt
_ [] = forall a. String -> a
panic String
"mkEqErr"
mkEqErr1 :: ReportErrCtxt -> Ct -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr1 :: ReportErrCtxt -> Ct -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr1 ReportErrCtxt
ctxt Ct
ct
= do { (ReportErrCtxt
ctxt, SDoc
binds_msg, Ct
ct) <- Bool -> ReportErrCtxt -> Ct -> TcM (ReportErrCtxt, SDoc, Ct)
relevantBindings Bool
True ReportErrCtxt
ctxt Ct
ct
; GlobalRdrEnv
rdr_env <- TcRn GlobalRdrEnv
getGlobalRdrEnv
; FamInstEnvs
fam_envs <- TcM FamInstEnvs
tcGetFamInstEnvs
; let coercible_msg :: SDoc
coercible_msg = case Ct -> EqRel
ctEqRel Ct
ct of
EqRel
NomEq -> SDoc
empty
EqRel
ReprEq -> GlobalRdrEnv -> FamInstEnvs -> Type -> Type -> SDoc
mkCoercibleExplanation GlobalRdrEnv
rdr_env FamInstEnvs
fam_envs Type
ty1 Type
ty2
; DynFlags
dflags <- forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; String -> SDoc -> TcM ()
traceTc String
"mkEqErr1" (forall a. Outputable a => a -> SDoc
ppr Ct
ct SDoc -> SDoc -> SDoc
$$ CtOrigin -> SDoc
pprCtOrigin (Ct -> CtOrigin
ctOrigin Ct
ct))
; let report :: Report
report = forall a. Monoid a => [a] -> a
mconcat [ SDoc -> Report
important SDoc
coercible_msg
, SDoc -> Report
mk_relevant_bindings SDoc
binds_msg]
; DynFlags
-> ReportErrCtxt
-> Report
-> Ct
-> Type
-> Type
-> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr_help DynFlags
dflags ReportErrCtxt
ctxt Report
report Ct
ct Type
ty1 Type
ty2 }
where
(Type
ty1, Type
ty2) = Type -> (Type, Type)
getEqPredTys (Ct -> Type
ctPred Ct
ct)
mkCoercibleExplanation :: GlobalRdrEnv -> FamInstEnvs
-> TcType -> TcType -> SDoc
mkCoercibleExplanation :: GlobalRdrEnv -> FamInstEnvs -> Type -> Type -> SDoc
mkCoercibleExplanation GlobalRdrEnv
rdr_env FamInstEnvs
fam_envs Type
ty1 Type
ty2
| Just (TyCon
tc, [Type]
tys) <- HasCallStack => Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty1
, (TyCon
rep_tc, [Type]
_, Coercion
_) <- FamInstEnvs -> TyCon -> [Type] -> (TyCon, [Type], Coercion)
tcLookupDataFamInst FamInstEnvs
fam_envs TyCon
tc [Type]
tys
, Just SDoc
msg <- TyCon -> Maybe SDoc
coercible_msg_for_tycon TyCon
rep_tc
= SDoc
msg
| Just (TyCon
tc, [Type]
tys) <- HasDebugCallStack => Type -> Maybe (TyCon, [Type])
splitTyConApp_maybe Type
ty2
, (TyCon
rep_tc, [Type]
_, Coercion
_) <- FamInstEnvs -> TyCon -> [Type] -> (TyCon, [Type], Coercion)
tcLookupDataFamInst FamInstEnvs
fam_envs TyCon
tc [Type]
tys
, Just SDoc
msg <- TyCon -> Maybe SDoc
coercible_msg_for_tycon TyCon
rep_tc
= SDoc
msg
| Just (Type
s1, Type
_) <- Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
ty1
, Just (Type
s2, Type
_) <- Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
ty2
, Type
s1 Type -> Type -> Bool
`eqType` Type
s2
, Type -> Bool
has_unknown_roles Type
s1
= SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"NB: We cannot know what roles the parameters to" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Type
s1) SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"have;")
Int
2 (String -> SDoc
text String
"we must assume that the role is nominal")
| Bool
otherwise
= SDoc
empty
where
coercible_msg_for_tycon :: TyCon -> Maybe SDoc
coercible_msg_for_tycon TyCon
tc
| TyCon -> Bool
isAbstractTyCon TyCon
tc
= forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
hsep [ String -> SDoc
text String
"NB: The type constructor"
, SDoc -> SDoc
quotes (TyCon -> SDoc
pprSourceTyCon TyCon
tc)
, String -> SDoc
text String
"is abstract" ]
| TyCon -> Bool
isNewTyCon TyCon
tc
, [DataCon
data_con] <- TyCon -> [DataCon]
tyConDataCons TyCon
tc
, let dc_name :: Name
dc_name = DataCon -> Name
dataConName DataCon
data_con
, forall a. Maybe a -> Bool
isNothing (GlobalRdrEnv -> Name -> Maybe GlobalRdrElt
lookupGRE_Name GlobalRdrEnv
rdr_env Name
dc_name)
= forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"The data constructor" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Name
dc_name))
Int
2 ([SDoc] -> SDoc
sep [ String -> SDoc
text String
"of newtype" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (TyCon -> SDoc
pprSourceTyCon TyCon
tc)
, String -> SDoc
text String
"is not in scope" ])
| Bool
otherwise = forall a. Maybe a
Nothing
has_unknown_roles :: Type -> Bool
has_unknown_roles Type
ty
| Just (TyCon
tc, [Type]
tys) <- HasCallStack => Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty
= [Type]
tys forall a. [a] -> Int -> Bool
`lengthAtLeast` TyCon -> Int
tyConArity TyCon
tc
| Just (Type
s, Type
_) <- Type -> Maybe (Type, Type)
tcSplitAppTy_maybe Type
ty
= Type -> Bool
has_unknown_roles Type
s
| Type -> Bool
isTyVarTy Type
ty
= Bool
True
| Bool
otherwise
= Bool
False
mkEqErr_help :: DynFlags -> ReportErrCtxt -> Report
-> Ct
-> TcType -> TcType -> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr_help :: DynFlags
-> ReportErrCtxt
-> Report
-> Ct
-> Type
-> Type
-> TcM (MsgEnvelope DecoratedSDoc)
mkEqErr_help DynFlags
dflags ReportErrCtxt
ctxt Report
report Ct
ct Type
ty1 Type
ty2
| Just (TcId
tv1, Coercion
_) <- Type -> Maybe (TcId, Coercion)
tcGetCastedTyVar_maybe Type
ty1
= DynFlags
-> ReportErrCtxt
-> Report
-> Ct
-> TcId
-> Type
-> TcM (MsgEnvelope DecoratedSDoc)
mkTyVarEqErr DynFlags
dflags ReportErrCtxt
ctxt Report
report Ct
ct TcId
tv1 Type
ty2
| Just (TcId
tv2, Coercion
_) <- Type -> Maybe (TcId, Coercion)
tcGetCastedTyVar_maybe Type
ty2
= DynFlags
-> ReportErrCtxt
-> Report
-> Ct
-> TcId
-> Type
-> TcM (MsgEnvelope DecoratedSDoc)
mkTyVarEqErr DynFlags
dflags ReportErrCtxt
ctxt Report
report Ct
ct TcId
tv2 Type
ty1
| Bool
otherwise
= ReportErrCtxt
-> Report -> Ct -> Type -> Type -> TcM (MsgEnvelope DecoratedSDoc)
reportEqErr ReportErrCtxt
ctxt Report
report Ct
ct Type
ty1 Type
ty2
reportEqErr :: ReportErrCtxt -> Report
-> Ct
-> TcType -> TcType -> TcM (MsgEnvelope DecoratedSDoc)
reportEqErr :: ReportErrCtxt
-> Report -> Ct -> Type -> Type -> TcM (MsgEnvelope DecoratedSDoc)
reportEqErr ReportErrCtxt
ctxt Report
report Ct
ct Type
ty1 Type
ty2
= ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct (forall a. Monoid a => [a] -> a
mconcat [Report
misMatch, Report
report, Report
eqInfo])
where
misMatch :: Report
misMatch = Bool -> ReportErrCtxt -> Ct -> Type -> Type -> Report
misMatchOrCND Bool
False ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2
eqInfo :: Report
eqInfo = Ct -> Type -> Type -> Report
mkEqInfoMsg Ct
ct Type
ty1 Type
ty2
mkTyVarEqErr, mkTyVarEqErr'
:: DynFlags -> ReportErrCtxt -> Report -> Ct
-> TcTyVar -> TcType -> TcM (MsgEnvelope DecoratedSDoc)
mkTyVarEqErr :: DynFlags
-> ReportErrCtxt
-> Report
-> Ct
-> TcId
-> Type
-> TcM (MsgEnvelope DecoratedSDoc)
mkTyVarEqErr DynFlags
dflags ReportErrCtxt
ctxt Report
report Ct
ct TcId
tv1 Type
ty2
= do { String -> SDoc -> TcM ()
traceTc String
"mkTyVarEqErr" (forall a. Outputable a => a -> SDoc
ppr Ct
ct SDoc -> SDoc -> SDoc
$$ forall a. Outputable a => a -> SDoc
ppr TcId
tv1 SDoc -> SDoc -> SDoc
$$ forall a. Outputable a => a -> SDoc
ppr Type
ty2)
; DynFlags
-> ReportErrCtxt
-> Report
-> Ct
-> TcId
-> Type
-> TcM (MsgEnvelope DecoratedSDoc)
mkTyVarEqErr' DynFlags
dflags ReportErrCtxt
ctxt Report
report Ct
ct TcId
tv1 Type
ty2 }
mkTyVarEqErr' :: DynFlags
-> ReportErrCtxt
-> Report
-> Ct
-> TcId
-> Type
-> TcM (MsgEnvelope DecoratedSDoc)
mkTyVarEqErr' DynFlags
dflags ReportErrCtxt
ctxt Report
report Ct
ct TcId
tv1 Type
ty2
| CheckTyEqResult
check_eq_result CheckTyEqResult -> CheckTyEqProblem -> Bool
`cterHasProblem` CheckTyEqProblem
cteImpredicative
= let msg :: SDoc
msg = [SDoc] -> SDoc
vcat [ (if TcId -> Bool
isSkolemTyVar TcId
tv1
then String -> SDoc
text String
"Cannot equate type variable"
else String -> SDoc
text String
"Cannot instantiate unification variable")
SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr TcId
tv1)
, SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"with a" SDoc -> SDoc -> SDoc
<+> SDoc
what SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"involving polytypes:") Int
2 (forall a. Outputable a => a -> SDoc
ppr Type
ty2) ]
in
ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct forall a b. (a -> b) -> a -> b
$ forall a. Monoid a => [a] -> a
mconcat
[ Report
headline_msg
, SDoc -> Report
important SDoc
msg
, if TcId -> Bool
isSkolemTyVar TcId
tv1 then ReportErrCtxt -> TcId -> Type -> Report
extraTyVarEqInfo ReportErrCtxt
ctxt TcId
tv1 Type
ty2 else forall a. Monoid a => a
mempty
, Report
report ]
| TcId -> Bool
isSkolemTyVar TcId
tv1
Bool -> Bool -> Bool
|| TcId -> Bool
isTyVarTyVar TcId
tv1 Bool -> Bool -> Bool
&& Bool -> Bool
not (Type -> Bool
isTyVarTy Type
ty2)
Bool -> Bool -> Bool
|| Ct -> EqRel
ctEqRel Ct
ct forall a. Eq a => a -> a -> Bool
== EqRel
ReprEq
= ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct forall a b. (a -> b) -> a -> b
$ forall a. Monoid a => [a] -> a
mconcat
[ Report
headline_msg
, ReportErrCtxt -> TcId -> Type -> Report
extraTyVarEqInfo ReportErrCtxt
ctxt TcId
tv1 Type
ty2
, ReportErrCtxt -> Type -> Type -> Report
suggestAddSig ReportErrCtxt
ctxt Type
ty1 Type
ty2
, Report
report
]
| CheckTyEqResult -> Bool
cterHasOccursCheck CheckTyEqResult
check_eq_result
= do { let extra2 :: Report
extra2 = Ct -> Type -> Type -> Report
mkEqInfoMsg Ct
ct Type
ty1 Type
ty2
interesting_tyvars :: [TcId]
interesting_tyvars = forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> Bool
noFreeVarsOfType forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcId -> Type
tyVarKind) forall a b. (a -> b) -> a -> b
$
forall a. (a -> Bool) -> [a] -> [a]
filter TcId -> Bool
isTyVar forall a b. (a -> b) -> a -> b
$
FV -> [TcId]
fvVarList forall a b. (a -> b) -> a -> b
$
Type -> FV
tyCoFVsOfType Type
ty1 FV -> FV -> FV
`unionFV` Type -> FV
tyCoFVsOfType Type
ty2
extra3 :: Report
extra3 = SDoc -> Report
mk_relevant_bindings forall a b. (a -> b) -> a -> b
$
Bool -> SDoc -> SDoc
ppWhen (Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
interesting_tyvars)) forall a b. (a -> b) -> a -> b
$
SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Type variable kinds:") Int
2 forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat (forall a b. (a -> b) -> [a] -> [b]
map (TcId -> SDoc
tyvar_binding forall b c a. (b -> c) -> (a -> b) -> a -> c
. TidyEnv -> TcId -> TcId
tidyTyCoVarOcc (ReportErrCtxt -> TidyEnv
cec_tidy ReportErrCtxt
ctxt))
[TcId]
interesting_tyvars)
tyvar_binding :: TcId -> SDoc
tyvar_binding TcId
tv = forall a. Outputable a => a -> SDoc
ppr TcId
tv SDoc -> SDoc -> SDoc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (TcId -> Type
tyVarKind TcId
tv)
; ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct forall a b. (a -> b) -> a -> b
$
forall a. Monoid a => [a] -> a
mconcat [Report
headline_msg, Report
extra2, Report
extra3, Report
report] }
| (Implication
implic:[Implication]
_) <- ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt
, Implic { ic_skols :: Implication -> [TcId]
ic_skols = [TcId]
skols } <- Implication
implic
, TcId
tv1 forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [TcId]
skols
= ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct forall a b. (a -> b) -> a -> b
$ forall a. Monoid a => [a] -> a
mconcat
[ ReportErrCtxt -> Ct -> Type -> Type -> Report
misMatchMsg ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2
, ReportErrCtxt -> TcId -> Type -> Report
extraTyVarEqInfo ReportErrCtxt
ctxt TcId
tv1 Type
ty2
, Report
report
]
| (Implication
implic:[Implication]
_) <- ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt
, Implic { ic_skols :: Implication -> [TcId]
ic_skols = [TcId]
skols, ic_info :: Implication -> SkolemInfo
ic_info = SkolemInfo
skol_info } <- Implication
implic
, let esc_skols :: [TcId]
esc_skols = forall a. (a -> Bool) -> [a] -> [a]
filter (TcId -> TyCoVarSet -> Bool
`elemVarSet` (Type -> TyCoVarSet
tyCoVarsOfType Type
ty2)) [TcId]
skols
, Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
esc_skols)
= do { let msg :: Report
msg = ReportErrCtxt -> Ct -> Type -> Type -> Report
misMatchMsg ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2
esc_doc :: SDoc
esc_doc = [SDoc] -> SDoc
sep [ String -> SDoc
text String
"because" SDoc -> SDoc -> SDoc
<+> SDoc
what SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"variable" SDoc -> SDoc -> SDoc
<> forall a. [a] -> SDoc
plural [TcId]
esc_skols
SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => [a] -> SDoc
pprQuotedList [TcId]
esc_skols
, String -> SDoc
text String
"would escape" SDoc -> SDoc -> SDoc
<+>
if forall a. [a] -> Bool
isSingleton [TcId]
esc_skols then String -> SDoc
text String
"its scope"
else String -> SDoc
text String
"their scope" ]
tv_extra :: Report
tv_extra = SDoc -> Report
important forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ Int -> SDoc -> SDoc
nest Int
2 forall a b. (a -> b) -> a -> b
$ SDoc
esc_doc
, [SDoc] -> SDoc
sep [ (if forall a. [a] -> Bool
isSingleton [TcId]
esc_skols
then String -> SDoc
text String
"This (rigid, skolem)" SDoc -> SDoc -> SDoc
<+>
SDoc
what SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"variable is"
else String -> SDoc
text String
"These (rigid, skolem)" SDoc -> SDoc -> SDoc
<+>
SDoc
what SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"variables are")
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"bound by"
, Int -> SDoc -> SDoc
nest Int
2 forall a b. (a -> b) -> a -> b
$ forall a. Outputable a => a -> SDoc
ppr SkolemInfo
skol_info
, Int -> SDoc -> SDoc
nest Int
2 forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"at" SDoc -> SDoc -> SDoc
<+>
forall a. Outputable a => a -> SDoc
ppr (TcLclEnv -> RealSrcSpan
tcl_loc (Implication -> TcLclEnv
ic_env Implication
implic)) ] ]
; ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct (forall a. Monoid a => [a] -> a
mconcat [Report
msg, Report
tv_extra, Report
report]) }
| (Implication
implic:[Implication]
_) <- ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt
, Implic { ic_given :: Implication -> [TcId]
ic_given = [TcId]
given, ic_tclvl :: Implication -> TcLevel
ic_tclvl = TcLevel
lvl, ic_info :: Implication -> SkolemInfo
ic_info = SkolemInfo
skol_info } <- Implication
implic
= ASSERT2( not (isTouchableMetaTyVar lvl tv1)
, ppr tv1 $$ ppr lvl )
do { let msg :: Report
msg = ReportErrCtxt -> Ct -> Type -> Type -> Report
misMatchMsg ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2
tclvl_extra :: Report
tclvl_extra = SDoc -> Report
important forall a b. (a -> b) -> a -> b
$
Int -> SDoc -> SDoc
nest Int
2 forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
sep [ SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr TcId
tv1) SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"is untouchable"
, Int -> SDoc -> SDoc
nest Int
2 forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"inside the constraints:" SDoc -> SDoc -> SDoc
<+> [TcId] -> SDoc
pprEvVarTheta [TcId]
given
, Int -> SDoc -> SDoc
nest Int
2 forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"bound by" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr SkolemInfo
skol_info
, Int -> SDoc -> SDoc
nest Int
2 forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"at" SDoc -> SDoc -> SDoc
<+>
forall a. Outputable a => a -> SDoc
ppr (TcLclEnv -> RealSrcSpan
tcl_loc (Implication -> TcLclEnv
ic_env Implication
implic)) ]
tv_extra :: Report
tv_extra = ReportErrCtxt -> TcId -> Type -> Report
extraTyVarEqInfo ReportErrCtxt
ctxt TcId
tv1 Type
ty2
add_sig :: Report
add_sig = ReportErrCtxt -> Type -> Type -> Report
suggestAddSig ReportErrCtxt
ctxt Type
ty1 Type
ty2
; ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct forall a b. (a -> b) -> a -> b
$ forall a. Monoid a => [a] -> a
mconcat
[Report
msg, Report
tclvl_extra, Report
tv_extra, Report
add_sig, Report
report] }
| Bool
otherwise
= ReportErrCtxt
-> Report -> Ct -> Type -> Type -> TcM (MsgEnvelope DecoratedSDoc)
reportEqErr ReportErrCtxt
ctxt Report
report Ct
ct (TcId -> Type
mkTyVarTy TcId
tv1) Type
ty2
where
headline_msg :: Report
headline_msg = Bool -> ReportErrCtxt -> Ct -> Type -> Type -> Report
misMatchOrCND Bool
insoluble_occurs_check ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2
ty1 :: Type
ty1 = TcId -> Type
mkTyVarTy TcId
tv1
check_eq_result :: CheckTyEqResult
check_eq_result = case Ct
ct of
CIrredCan { cc_reason :: Ct -> CtIrredReason
cc_reason = NonCanonicalReason CheckTyEqResult
result } -> CheckTyEqResult
result
CIrredCan { cc_reason :: Ct -> CtIrredReason
cc_reason = HoleBlockerReason {} } -> CheckTyEqProblem -> CheckTyEqResult
cteProblem CheckTyEqProblem
cteHoleBlocker
Ct
_ -> DynFlags -> TcId -> Type -> CheckTyEqResult
checkTyVarEq DynFlags
dflags TcId
tv1 Type
ty2
insoluble_occurs_check :: Bool
insoluble_occurs_check = CheckTyEqResult
check_eq_result CheckTyEqResult -> CheckTyEqProblem -> Bool
`cterHasProblem` CheckTyEqProblem
cteInsolubleOccurs
what :: SDoc
what = String -> SDoc
text forall a b. (a -> b) -> a -> b
$ TypeOrKind -> String
levelString forall a b. (a -> b) -> a -> b
$
CtLoc -> Maybe TypeOrKind
ctLocTypeOrKind_maybe (Ct -> CtLoc
ctLoc Ct
ct) forall a. Maybe a -> a -> a
`orElse` TypeOrKind
TypeLevel
levelString :: TypeOrKind -> String
levelString :: TypeOrKind -> String
levelString TypeOrKind
TypeLevel = String
"type"
levelString TypeOrKind
KindLevel = String
"kind"
mkEqInfoMsg :: Ct -> TcType -> TcType -> Report
mkEqInfoMsg :: Ct -> Type -> Type -> Report
mkEqInfoMsg Ct
ct Type
ty1 Type
ty2
= SDoc -> Report
important (SDoc
tyfun_msg SDoc -> SDoc -> SDoc
$$ SDoc
ambig_msg)
where
mb_fun1 :: Maybe TyCon
mb_fun1 = Type -> Maybe TyCon
isTyFun_maybe Type
ty1
mb_fun2 :: Maybe TyCon
mb_fun2 = Type -> Maybe TyCon
isTyFun_maybe Type
ty2
ambig_msg :: SDoc
ambig_msg | forall a. Maybe a -> Bool
isJust Maybe TyCon
mb_fun1 Bool -> Bool -> Bool
|| forall a. Maybe a -> Bool
isJust Maybe TyCon
mb_fun2
= forall a b. (a, b) -> b
snd (Bool -> Ct -> (Bool, SDoc)
mkAmbigMsg Bool
False Ct
ct)
| Bool
otherwise = SDoc
empty
tyfun_msg :: SDoc
tyfun_msg | Just TyCon
tc1 <- Maybe TyCon
mb_fun1
, Just TyCon
tc2 <- Maybe TyCon
mb_fun2
, TyCon
tc1 forall a. Eq a => a -> a -> Bool
== TyCon
tc2
, Bool -> Bool
not (TyCon -> Role -> Bool
isInjectiveTyCon TyCon
tc1 Role
Nominal)
= String -> SDoc
text String
"NB:" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr TyCon
tc1)
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"is a non-injective type family"
| Bool
otherwise = SDoc
empty
misMatchOrCND :: Bool -> ReportErrCtxt -> Ct
-> TcType -> TcType -> Report
misMatchOrCND :: Bool -> ReportErrCtxt -> Ct -> Type -> Type -> Report
misMatchOrCND Bool
insoluble_occurs_check ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2
| Bool
insoluble_occurs_check
Bool -> Bool -> Bool
|| (Type -> Bool
isRigidTy Type
ty1 Bool -> Bool -> Bool
&& Type -> Bool
isRigidTy Type
ty2)
Bool -> Bool -> Bool
|| Ct -> Bool
isGivenCt Ct
ct
Bool -> Bool -> Bool
|| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Implication]
givens
=
ReportErrCtxt -> Ct -> Type -> Type -> Report
misMatchMsg ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2
| Bool
otherwise
= forall a. Monoid a => [a] -> a
mconcat [ [Implication] -> ([Type], CtOrigin) -> Report
couldNotDeduce [Implication]
givens ([Type
eq_pred], CtOrigin
orig)
, SDoc -> Report
important forall a b. (a -> b) -> a -> b
$ ReportErrCtxt -> TypeOrKind -> Type -> Type -> CtOrigin -> SDoc
mk_supplementary_ea_msg ReportErrCtxt
ctxt TypeOrKind
level Type
ty1 Type
ty2 CtOrigin
orig ]
where
ev :: CtEvidence
ev = Ct -> CtEvidence
ctEvidence Ct
ct
eq_pred :: Type
eq_pred = CtEvidence -> Type
ctEvPred CtEvidence
ev
orig :: CtOrigin
orig = CtEvidence -> CtOrigin
ctEvOrigin CtEvidence
ev
level :: TypeOrKind
level = CtLoc -> Maybe TypeOrKind
ctLocTypeOrKind_maybe (CtEvidence -> CtLoc
ctEvLoc CtEvidence
ev) forall a. Maybe a -> a -> a
`orElse` TypeOrKind
TypeLevel
givens :: [Implication]
givens = [ Implication
given | Implication
given <- ReportErrCtxt -> [Implication]
getUserGivens ReportErrCtxt
ctxt, Implication -> HasGivenEqs
ic_given_eqs Implication
given forall a. Eq a => a -> a -> Bool
/= HasGivenEqs
NoGivenEqs ]
couldNotDeduce :: [UserGiven] -> (ThetaType, CtOrigin) -> Report
couldNotDeduce :: [Implication] -> ([Type], CtOrigin) -> Report
couldNotDeduce [Implication]
givens ([Type]
wanteds, CtOrigin
orig)
= SDoc -> Report
important forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ CtOrigin -> SDoc -> SDoc
addArising CtOrigin
orig (String -> SDoc
text String
"Could not deduce:" SDoc -> SDoc -> SDoc
<+> [Type] -> SDoc
pprTheta [Type]
wanteds)
, [SDoc] -> SDoc
vcat ([Implication] -> [SDoc]
pp_givens [Implication]
givens)]
pp_givens :: [UserGiven] -> [SDoc]
pp_givens :: [Implication] -> [SDoc]
pp_givens [Implication]
givens
= case [Implication]
givens of
[] -> []
(Implication
g:[Implication]
gs) -> SDoc -> Implication -> SDoc
ppr_given (String -> SDoc
text String
"from the context:") Implication
g
forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (SDoc -> Implication -> SDoc
ppr_given (String -> SDoc
text String
"or from:")) [Implication]
gs
where
ppr_given :: SDoc -> Implication -> SDoc
ppr_given SDoc
herald implic :: Implication
implic@(Implic { ic_given :: Implication -> [TcId]
ic_given = [TcId]
gs, ic_info :: Implication -> SkolemInfo
ic_info = SkolemInfo
skol_info })
= SDoc -> Int -> SDoc -> SDoc
hang (SDoc
herald SDoc -> SDoc -> SDoc
<+> [TcId] -> SDoc
pprEvVarTheta (forall a. (a -> Type) -> [a] -> [a]
mkMinimalBySCs TcId -> Type
evVarPred [TcId]
gs))
Int
2 ([SDoc] -> SDoc
sep [ String -> SDoc
text String
"bound by" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr SkolemInfo
skol_info
, String -> SDoc
text String
"at" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (TcLclEnv -> RealSrcSpan
tcl_loc (Implication -> TcLclEnv
ic_env Implication
implic)) ])
mkBlockedEqErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkBlockedEqErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkBlockedEqErr ReportErrCtxt
ctxt (Ct
ct:[Ct]
_) = ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct Report
report
where
report :: Report
report = SDoc -> Report
important SDoc
msg
msg :: SDoc
msg = [SDoc] -> SDoc
vcat [ SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Cannot use equality for substitution:")
Int
2 (forall a. Outputable a => a -> SDoc
ppr (Ct -> Type
ctPred Ct
ct))
, String -> SDoc
text String
"Doing so would be ill-kinded." ]
mkBlockedEqErr ReportErrCtxt
_ [] = forall a. String -> a
panic String
"mkBlockedEqErr no constraints"
extraTyVarEqInfo :: ReportErrCtxt -> TcTyVar -> TcType -> Report
ReportErrCtxt
ctxt TcId
tv1 Type
ty2
= SDoc -> Report
important (ReportErrCtxt -> TcId -> SDoc
extraTyVarInfo ReportErrCtxt
ctxt TcId
tv1 SDoc -> SDoc -> SDoc
$$ Type -> SDoc
ty_extra Type
ty2)
where
ty_extra :: Type -> SDoc
ty_extra Type
ty = case Type -> Maybe (TcId, Coercion)
tcGetCastedTyVar_maybe Type
ty of
Just (TcId
tv, Coercion
_) -> ReportErrCtxt -> TcId -> SDoc
extraTyVarInfo ReportErrCtxt
ctxt TcId
tv
Maybe (TcId, Coercion)
Nothing -> SDoc
empty
extraTyVarInfo :: ReportErrCtxt -> TcTyVar -> SDoc
ReportErrCtxt
ctxt TcId
tv
= ASSERT2( isTyVar tv, ppr tv )
case TcId -> TcTyVarDetails
tcTyVarDetails TcId
tv of
SkolemTv {} -> ReportErrCtxt -> [TcId] -> SDoc
pprSkols ReportErrCtxt
ctxt [TcId
tv]
RuntimeUnk {} -> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr TcId
tv) SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"is an interactive-debugger skolem"
MetaTv {} -> SDoc
empty
suggestAddSig :: ReportErrCtxt -> TcType -> TcType -> Report
suggestAddSig :: ReportErrCtxt -> Type -> Type -> Report
suggestAddSig ReportErrCtxt
ctxt Type
ty1 Type
_ty2
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Name]
inferred_bndrs
= forall a. Monoid a => a
mempty
| [Name
bndr] <- [Name]
inferred_bndrs
= SDoc -> Report
important forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"Possible fix: add a type signature for" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Name
bndr)
| Bool
otherwise
= SDoc -> Report
important forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"Possible fix: add type signatures for some or all of" SDoc -> SDoc -> SDoc
<+> (forall a. Outputable a => a -> SDoc
ppr [Name]
inferred_bndrs)
where
inferred_bndrs :: [Name]
inferred_bndrs = case Type -> Maybe TcId
tcGetTyVar_maybe Type
ty1 of
Just TcId
tv | TcId -> Bool
isSkolemTyVar TcId
tv -> [Implication] -> Bool -> TcId -> [Name]
find (ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt) Bool
False TcId
tv
Maybe TcId
_ -> []
find :: [Implication] -> Bool -> TcId -> [Name]
find [] Bool
_ TcId
_ = []
find (Implication
implic:[Implication]
implics) Bool
seen_eqs TcId
tv
| TcId
tv forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Implication -> [TcId]
ic_skols Implication
implic
, InferSkol [(Name, Type)]
prs <- Implication -> SkolemInfo
ic_info Implication
implic
, Bool
seen_eqs
= forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst [(Name, Type)]
prs
| Bool
otherwise
= [Implication] -> Bool -> TcId -> [Name]
find [Implication]
implics (Bool
seen_eqs Bool -> Bool -> Bool
|| Implication -> HasGivenEqs
ic_given_eqs Implication
implic forall a. Eq a => a -> a -> Bool
/= HasGivenEqs
NoGivenEqs) TcId
tv
misMatchMsg :: ReportErrCtxt -> Ct -> TcType -> TcType -> Report
misMatchMsg :: ReportErrCtxt -> Ct -> Type -> Type -> Report
misMatchMsg ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2
= SDoc -> Report
important forall a b. (a -> b) -> a -> b
$
CtOrigin -> SDoc -> SDoc
addArising CtOrigin
orig forall a b. (a -> b) -> a -> b
$
Type -> Type -> CtOrigin -> SDoc -> SDoc
pprWithExplicitKindsWhenMismatch Type
ty1 Type
ty2 CtOrigin
orig forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
sep [ case CtOrigin
orig of
TypeEqOrigin {} -> ReportErrCtxt -> Ct -> Type -> Type -> CtOrigin -> SDoc
tk_eq_msg ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2 CtOrigin
orig
KindEqOrigin {} -> ReportErrCtxt -> Ct -> Type -> Type -> CtOrigin -> SDoc
tk_eq_msg ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2 CtOrigin
orig
CtOrigin
_ -> Bool -> Ct -> Type -> Type -> SDoc
headline_eq_msg Bool
False Ct
ct Type
ty1 Type
ty2
, Type -> Type -> SDoc
sameOccExtra Type
ty2 Type
ty1 ]
where
orig :: CtOrigin
orig = Ct -> CtOrigin
ctOrigin Ct
ct
headline_eq_msg :: Bool -> Ct -> Type -> Type -> SDoc
headline_eq_msg :: Bool -> Ct -> Type -> Type -> SDoc
headline_eq_msg Bool
add_ea Ct
ct Type
ty1 Type
ty2
| (Type -> Bool
isLiftedRuntimeRep Type
ty1 Bool -> Bool -> Bool
&& Type -> Bool
isUnliftedRuntimeRep Type
ty2) Bool -> Bool -> Bool
||
(Type -> Bool
isLiftedRuntimeRep Type
ty2 Bool -> Bool -> Bool
&& Type -> Bool
isUnliftedRuntimeRep Type
ty1) Bool -> Bool -> Bool
||
(Type -> Bool
isLiftedLevity Type
ty1 Bool -> Bool -> Bool
&& Type -> Bool
isUnliftedLevity Type
ty2) Bool -> Bool -> Bool
||
(Type -> Bool
isLiftedLevity Type
ty2 Bool -> Bool -> Bool
&& Type -> Bool
isUnliftedLevity Type
ty1)
= String -> SDoc
text String
"Couldn't match a lifted type with an unlifted type"
| Type -> Bool
isAtomicTy Type
ty1 Bool -> Bool -> Bool
|| Type -> Bool
isAtomicTy Type
ty2
=
[SDoc] -> SDoc
sep [ String -> SDoc
text String
herald1 SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Type
ty1)
, Int -> SDoc -> SDoc
nest Int
padding forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
herald2 SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Type
ty2) ]
| Bool
otherwise
=
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
herald1 SDoc -> SDoc -> SDoc
<> SDoc
colon SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Type
ty1
, Int -> SDoc -> SDoc
nest Int
padding forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
herald2 SDoc -> SDoc -> SDoc
<> SDoc
colon SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Type
ty2 ]
where
herald1 :: String
herald1 = [String] -> String
conc [ String
"Couldn't match"
, if Bool
is_repr then String
"representation of" else String
""
, if Bool
add_ea then String
"expected" else String
""
, String
what ]
herald2 :: String
herald2 = [String] -> String
conc [ String
"with"
, if Bool
is_repr then String
"that of" else String
""
, if Bool
add_ea then (String
"actual " forall a. [a] -> [a] -> [a]
++ String
what) else String
"" ]
padding :: Int
padding = forall (t :: * -> *) a. Foldable t => t a -> Int
length String
herald1 forall a. Num a => a -> a -> a
- forall (t :: * -> *) a. Foldable t => t a -> Int
length String
herald2
is_repr :: Bool
is_repr = case Ct -> EqRel
ctEqRel Ct
ct of { EqRel
ReprEq -> Bool
True; EqRel
NomEq -> Bool
False }
what :: String
what = TypeOrKind -> String
levelString (CtLoc -> Maybe TypeOrKind
ctLocTypeOrKind_maybe (Ct -> CtLoc
ctLoc Ct
ct) forall a. Maybe a -> a -> a
`orElse` TypeOrKind
TypeLevel)
conc :: [String] -> String
conc :: [String] -> String
conc = forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 String -> String -> String
add_space
add_space :: String -> String -> String
add_space :: String -> String -> String
add_space String
s1 String
s2 | forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
s1 = String
s2
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
s2 = String
s1
| Bool
otherwise = String
s1 forall a. [a] -> [a] -> [a]
++ (Char
' ' forall a. a -> [a] -> [a]
: String
s2)
tk_eq_msg :: ReportErrCtxt
-> Ct -> Type -> Type -> CtOrigin -> SDoc
tk_eq_msg :: ReportErrCtxt -> Ct -> Type -> Type -> CtOrigin -> SDoc
tk_eq_msg ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2 orig :: CtOrigin
orig@(TypeEqOrigin { uo_actual :: CtOrigin -> Type
uo_actual = Type
act
, uo_expected :: CtOrigin -> Type
uo_expected = Type
exp
, uo_thing :: CtOrigin -> Maybe SDoc
uo_thing = Maybe SDoc
mb_thing })
| Type -> Bool
isUnliftedTypeKind Type
act, Type -> Bool
isLiftedTypeKind Type
exp
= [SDoc] -> SDoc
sep [ String -> SDoc
text String
"Expecting a lifted type, but"
, Maybe SDoc -> SDoc -> SDoc -> SDoc
thing_msg Maybe SDoc
mb_thing (String -> SDoc
text String
"an") (String -> SDoc
text String
"unlifted") ]
| Type -> Bool
isLiftedTypeKind Type
act, Type -> Bool
isUnliftedTypeKind Type
exp
= [SDoc] -> SDoc
sep [ String -> SDoc
text String
"Expecting an unlifted type, but"
, Maybe SDoc -> SDoc -> SDoc -> SDoc
thing_msg Maybe SDoc
mb_thing (String -> SDoc
text String
"a") (String -> SDoc
text String
"lifted") ]
| Type -> Bool
tcIsLiftedTypeKind Type
exp
= SDoc
maybe_num_args_msg SDoc -> SDoc -> SDoc
$$
[SDoc] -> SDoc
sep [ String -> SDoc
text String
"Expected a type, but"
, case Maybe SDoc
mb_thing of
Maybe SDoc
Nothing -> String -> SDoc
text String
"found something with kind"
Just SDoc
thing -> SDoc -> SDoc
quotes SDoc
thing SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"has kind"
, SDoc -> SDoc
quotes (Type -> SDoc
pprWithTYPE Type
act) ]
| Just SDoc
nargs_msg <- Maybe SDoc
num_args_msg
= SDoc
nargs_msg SDoc -> SDoc -> SDoc
$$
ReportErrCtxt -> Maybe Ct -> TypeOrKind -> CtOrigin -> SDoc
mk_ea_msg ReportErrCtxt
ctxt (forall a. a -> Maybe a
Just Ct
ct) TypeOrKind
level CtOrigin
orig
|
Type -> Type -> Type -> Type -> Bool
ea_looks_same Type
ty1 Type
ty2 Type
exp Type
act
= ReportErrCtxt -> Maybe Ct -> TypeOrKind -> CtOrigin -> SDoc
mk_ea_msg ReportErrCtxt
ctxt (forall a. a -> Maybe a
Just Ct
ct) TypeOrKind
level CtOrigin
orig
| Bool
otherwise
= [SDoc] -> SDoc
vcat [ Bool -> Ct -> Type -> Type -> SDoc
headline_eq_msg Bool
False Ct
ct Type
ty1 Type
ty2
, ReportErrCtxt -> Maybe Ct -> TypeOrKind -> CtOrigin -> SDoc
mk_ea_msg ReportErrCtxt
ctxt forall a. Maybe a
Nothing TypeOrKind
level CtOrigin
orig ]
where
ct_loc :: CtLoc
ct_loc = Ct -> CtLoc
ctLoc Ct
ct
level :: TypeOrKind
level = CtLoc -> Maybe TypeOrKind
ctLocTypeOrKind_maybe CtLoc
ct_loc forall a. Maybe a -> a -> a
`orElse` TypeOrKind
TypeLevel
thing_msg :: Maybe SDoc -> SDoc -> SDoc -> SDoc
thing_msg (Just SDoc
thing) SDoc
_ SDoc
levity = SDoc -> SDoc
quotes SDoc
thing SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"is" SDoc -> SDoc -> SDoc
<+> SDoc
levity
thing_msg Maybe SDoc
Nothing SDoc
an SDoc
levity = String -> SDoc
text String
"got" SDoc -> SDoc -> SDoc
<+> SDoc
an SDoc -> SDoc -> SDoc
<+> SDoc
levity SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"type"
num_args_msg :: Maybe SDoc
num_args_msg = case TypeOrKind
level of
TypeOrKind
KindLevel
| Bool -> Bool
not (Type -> Bool
isMetaTyVarTy Type
exp) Bool -> Bool -> Bool
&& Bool -> Bool
not (Type -> Bool
isMetaTyVarTy Type
act)
-> let n_act :: Int
n_act = Type -> Int
count_args Type
act
n_exp :: Int
n_exp = Type -> Int
count_args Type
exp in
case Int
n_act forall a. Num a => a -> a -> a
- Int
n_exp of
Int
n | Int
n forall a. Ord a => a -> a -> Bool
> Int
0
, Just SDoc
thing <- Maybe SDoc
mb_thing
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"Expecting" SDoc -> SDoc -> SDoc
<+> Int -> SDoc
speakN (forall a. Num a => a -> a
abs Int
n) SDoc -> SDoc -> SDoc
<+>
SDoc
more SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes SDoc
thing
where
more :: SDoc
more
| Int
n forall a. Eq a => a -> a -> Bool
== Int
1 = String -> SDoc
text String
"more argument to"
| Bool
otherwise = String -> SDoc
text String
"more arguments to"
Int
_ -> forall a. Maybe a
Nothing
TypeOrKind
_ -> forall a. Maybe a
Nothing
maybe_num_args_msg :: SDoc
maybe_num_args_msg = Maybe SDoc
num_args_msg forall a. Maybe a -> a -> a
`orElse` SDoc
empty
count_args :: Type -> Int
count_args Type
ty = forall a. (a -> Bool) -> [a] -> Int
count TyCoBinder -> Bool
isVisibleBinder forall a b. (a -> b) -> a -> b
$ forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ Type -> ([TyCoBinder], Type)
splitPiTys Type
ty
tk_eq_msg ReportErrCtxt
ctxt Ct
ct Type
ty1 Type
ty2
(KindEqOrigin Type
cty1 Type
cty2 CtOrigin
sub_o Maybe TypeOrKind
mb_sub_t_or_k)
= [SDoc] -> SDoc
vcat [ Bool -> Ct -> Type -> Type -> SDoc
headline_eq_msg Bool
False Ct
ct Type
ty1 Type
ty2
, SDoc
supplementary_msg ]
where
sub_t_or_k :: TypeOrKind
sub_t_or_k = Maybe TypeOrKind
mb_sub_t_or_k forall a. Maybe a -> a -> a
`orElse` TypeOrKind
TypeLevel
sub_whats :: SDoc
sub_whats = String -> SDoc
text (TypeOrKind -> String
levelString TypeOrKind
sub_t_or_k) SDoc -> SDoc -> SDoc
<> Char -> SDoc
char Char
's'
supplementary_msg :: SDoc
supplementary_msg
= forall a. (SDocContext -> a) -> (a -> SDoc) -> SDoc
sdocOption SDocContext -> Bool
sdocPrintExplicitCoercions forall a b. (a -> b) -> a -> b
$ \Bool
printExplicitCoercions ->
if Bool
printExplicitCoercions
Bool -> Bool -> Bool
|| Bool -> Bool
not (Type
cty1 Type -> Type -> Bool
`pickyEqType` Type
cty2)
then [SDoc] -> SDoc
vcat [ SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"When matching" SDoc -> SDoc -> SDoc
<+> SDoc
sub_whats)
Int
2 ([SDoc] -> SDoc
vcat [ forall a. Outputable a => a -> SDoc
ppr Type
cty1 SDoc -> SDoc -> SDoc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
<+>
forall a. Outputable a => a -> SDoc
ppr (HasDebugCallStack => Type -> Type
tcTypeKind Type
cty1)
, forall a. Outputable a => a -> SDoc
ppr Type
cty2 SDoc -> SDoc -> SDoc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
<+>
forall a. Outputable a => a -> SDoc
ppr (HasDebugCallStack => Type -> Type
tcTypeKind Type
cty2) ])
, ReportErrCtxt -> TypeOrKind -> Type -> Type -> CtOrigin -> SDoc
mk_supplementary_ea_msg ReportErrCtxt
ctxt TypeOrKind
sub_t_or_k Type
cty1 Type
cty2 CtOrigin
sub_o ]
else String -> SDoc
text String
"When matching the kind of" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Type
cty1)
tk_eq_msg ReportErrCtxt
_ Ct
_ Type
_ Type
_ CtOrigin
_ = forall a. String -> a
panic String
"typeeq_mismatch_msg"
ea_looks_same :: Type -> Type -> Type -> Type -> Bool
ea_looks_same :: Type -> Type -> Type -> Type -> Bool
ea_looks_same Type
ty1 Type
ty2 Type
exp Type
act
= (Type
act Type -> Type -> Bool
`looks_same` Type
ty1 Bool -> Bool -> Bool
&& Type
exp Type -> Type -> Bool
`looks_same` Type
ty2) Bool -> Bool -> Bool
||
(Type
exp Type -> Type -> Bool
`looks_same` Type
ty1 Bool -> Bool -> Bool
&& Type
act Type -> Type -> Bool
`looks_same` Type
ty2)
where
looks_same :: Type -> Type -> Bool
looks_same Type
t1 Type
t2 = Type
t1 Type -> Type -> Bool
`pickyEqType` Type
t2
Bool -> Bool -> Bool
|| Type
t1 Type -> Type -> Bool
`eqType` Type
liftedTypeKind Bool -> Bool -> Bool
&& Type
t2 Type -> Type -> Bool
`eqType` Type
liftedTypeKind
mk_supplementary_ea_msg :: ReportErrCtxt -> TypeOrKind
-> Type -> Type -> CtOrigin -> SDoc
mk_supplementary_ea_msg :: ReportErrCtxt -> TypeOrKind -> Type -> Type -> CtOrigin -> SDoc
mk_supplementary_ea_msg ReportErrCtxt
ctxt TypeOrKind
level Type
ty1 Type
ty2 CtOrigin
orig
| TypeEqOrigin { uo_expected :: CtOrigin -> Type
uo_expected = Type
exp, uo_actual :: CtOrigin -> Type
uo_actual = Type
act } <- CtOrigin
orig
, Bool -> Bool
not (Type -> Type -> Type -> Type -> Bool
ea_looks_same Type
ty1 Type
ty2 Type
exp Type
act)
= ReportErrCtxt -> Maybe Ct -> TypeOrKind -> CtOrigin -> SDoc
mk_ea_msg ReportErrCtxt
ctxt forall a. Maybe a
Nothing TypeOrKind
level CtOrigin
orig
| Bool
otherwise
= SDoc
empty
mk_ea_msg :: ReportErrCtxt -> Maybe Ct -> TypeOrKind -> CtOrigin -> SDoc
mk_ea_msg :: ReportErrCtxt -> Maybe Ct -> TypeOrKind -> CtOrigin -> SDoc
mk_ea_msg ReportErrCtxt
ctxt Maybe Ct
at_top TypeOrKind
level
(TypeEqOrigin { uo_actual :: CtOrigin -> Type
uo_actual = Type
act, uo_expected :: CtOrigin -> Type
uo_expected = Type
exp, uo_thing :: CtOrigin -> Maybe SDoc
uo_thing = Maybe SDoc
mb_thing })
| Just SDoc
thing <- Maybe SDoc
mb_thing
, TypeOrKind
KindLevel <- TypeOrKind
level
= SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Expected" SDoc -> SDoc -> SDoc
<+> SDoc
kind_desc SDoc -> SDoc -> SDoc
<> SDoc
comma)
Int
2 (String -> SDoc
text String
"but" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes SDoc
thing SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"has kind" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Type
act))
| Bool
otherwise
= [SDoc] -> SDoc
vcat [ case Maybe Ct
at_top of
Just Ct
ct -> Bool -> Ct -> Type -> Type -> SDoc
headline_eq_msg Bool
True Ct
ct Type
exp Type
act
Maybe Ct
Nothing -> SDoc
supplementary_ea_msg
, Bool -> SDoc -> SDoc
ppWhen Bool
expand_syns SDoc
expandedTys ]
where
supplementary_ea_msg :: SDoc
supplementary_ea_msg = [SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Expected:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Type
exp
, String -> SDoc
text String
" Actual:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Type
act ]
kind_desc :: SDoc
kind_desc | Type -> Bool
tcIsConstraintKind Type
exp = String -> SDoc
text String
"a constraint"
| Just Type
arg <- HasDebugCallStack => Type -> Maybe Type
kindRep_maybe Type
exp
, Type -> Bool
tcIsTyVarTy Type
arg = forall a. (SDocContext -> a) -> (a -> SDoc) -> SDoc
sdocOption SDocContext -> Bool
sdocPrintExplicitRuntimeReps forall a b. (a -> b) -> a -> b
$ \case
Bool
True -> String -> SDoc
text String
"kind" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Type
exp)
Bool
False -> String -> SDoc
text String
"a type"
| Bool
otherwise = String -> SDoc
text String
"kind" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Type
exp)
expand_syns :: Bool
expand_syns = ReportErrCtxt -> Bool
cec_expand_syns ReportErrCtxt
ctxt
expandedTys :: SDoc
expandedTys = Bool -> SDoc -> SDoc
ppUnless (Type
expTy1 Type -> Type -> Bool
`pickyEqType` Type
exp Bool -> Bool -> Bool
&& Type
expTy2 Type -> Type -> Bool
`pickyEqType` Type
act) forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"Type synonyms expanded:"
, String -> SDoc
text String
"Expected type:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Type
expTy1
, String -> SDoc
text String
" Actual type:" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Type
expTy2 ]
(Type
expTy1, Type
expTy2) = Type -> Type -> (Type, Type)
expandSynonymsToMatch Type
exp Type
act
mk_ea_msg ReportErrCtxt
_ Maybe Ct
_ TypeOrKind
_ CtOrigin
_ = SDoc
empty
pprWithExplicitKindsWhenMismatch :: Type -> Type -> CtOrigin
-> SDoc -> SDoc
pprWithExplicitKindsWhenMismatch :: Type -> Type -> CtOrigin -> SDoc -> SDoc
pprWithExplicitKindsWhenMismatch Type
ty1 Type
ty2 CtOrigin
ct
= Bool -> SDoc -> SDoc
pprWithExplicitKindsWhen Bool
show_kinds
where
(Type
act_ty, Type
exp_ty) = case CtOrigin
ct of
TypeEqOrigin { uo_actual :: CtOrigin -> Type
uo_actual = Type
act
, uo_expected :: CtOrigin -> Type
uo_expected = Type
exp } -> (Type
act, Type
exp)
CtOrigin
_ -> (Type
ty1, Type
ty2)
show_kinds :: Bool
show_kinds = Type -> Type -> Bool
tcEqTypeVis Type
act_ty Type
exp_ty
expandSynonymsToMatch :: Type -> Type -> (Type, Type)
expandSynonymsToMatch :: Type -> Type -> (Type, Type)
expandSynonymsToMatch Type
ty1 Type
ty2 = (Type
ty1_ret, Type
ty2_ret)
where
(Type
ty1_ret, Type
ty2_ret) = Type -> Type -> (Type, Type)
go Type
ty1 Type
ty2
go :: Type -> Type -> (Type, Type)
go :: Type -> Type -> (Type, Type)
go Type
t1 Type
t2
| Type
t1 Type -> Type -> Bool
`pickyEqType` Type
t2 =
(Type
t1, Type
t2)
go (TyConApp TyCon
tc1 [Type]
tys1) (TyConApp TyCon
tc2 [Type]
tys2)
| TyCon
tc1 forall a. Eq a => a -> a -> Bool
== TyCon
tc2
, [Type]
tys1 forall a b. [a] -> [b] -> Bool
`equalLength` [Type]
tys2 =
let ([Type]
tys1', [Type]
tys2') =
forall a b. [(a, b)] -> ([a], [b])
unzip (forall a b c. String -> (a -> b -> c) -> [a] -> [b] -> [c]
zipWithEqual String
"expandSynonymsToMatch" Type -> Type -> (Type, Type)
go [Type]
tys1 [Type]
tys2)
in (TyCon -> [Type] -> Type
TyConApp TyCon
tc1 [Type]
tys1', TyCon -> [Type] -> Type
TyConApp TyCon
tc2 [Type]
tys2')
go (AppTy Type
t1_1 Type
t1_2) (AppTy Type
t2_1 Type
t2_2) =
let (Type
t1_1', Type
t2_1') = Type -> Type -> (Type, Type)
go Type
t1_1 Type
t2_1
(Type
t1_2', Type
t2_2') = Type -> Type -> (Type, Type)
go Type
t1_2 Type
t2_2
in (Type -> Type -> Type
mkAppTy Type
t1_1' Type
t1_2', Type -> Type -> Type
mkAppTy Type
t2_1' Type
t2_2')
go ty1 :: Type
ty1@(FunTy AnonArgFlag
_ Type
w1 Type
t1_1 Type
t1_2) ty2 :: Type
ty2@(FunTy AnonArgFlag
_ Type
w2 Type
t2_1 Type
t2_2) | Type
w1 Type -> Type -> Bool
`eqType` Type
w2 =
let (Type
t1_1', Type
t2_1') = Type -> Type -> (Type, Type)
go Type
t1_1 Type
t2_1
(Type
t1_2', Type
t2_2') = Type -> Type -> (Type, Type)
go Type
t1_2 Type
t2_2
in ( Type
ty1 { ft_arg :: Type
ft_arg = Type
t1_1', ft_res :: Type
ft_res = Type
t1_2' }
, Type
ty2 { ft_arg :: Type
ft_arg = Type
t2_1', ft_res :: Type
ft_res = Type
t2_2' })
go (ForAllTy TyCoVarBinder
b1 Type
t1) (ForAllTy TyCoVarBinder
b2 Type
t2) =
let (Type
t1', Type
t2') = Type -> Type -> (Type, Type)
go Type
t1 Type
t2
in (TyCoVarBinder -> Type -> Type
ForAllTy TyCoVarBinder
b1 Type
t1', TyCoVarBinder -> Type -> Type
ForAllTy TyCoVarBinder
b2 Type
t2')
go (CastTy Type
ty1 Coercion
_) Type
ty2 = Type -> Type -> (Type, Type)
go Type
ty1 Type
ty2
go Type
ty1 (CastTy Type
ty2 Coercion
_) = Type -> Type -> (Type, Type)
go Type
ty1 Type
ty2
go Type
t1 Type
t2 =
let
t1_exp_tys :: [Type]
t1_exp_tys = Type
t1 forall a. a -> [a] -> [a]
: Type -> [Type]
tyExpansions Type
t1
t2_exp_tys :: [Type]
t2_exp_tys = Type
t2 forall a. a -> [a] -> [a]
: Type -> [Type]
tyExpansions Type
t2
t1_exps :: Int
t1_exps = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
t1_exp_tys
t2_exps :: Int
t2_exps = forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
t2_exp_tys
dif :: Int
dif = forall a. Num a => a -> a
abs (Int
t1_exps forall a. Num a => a -> a -> a
- Int
t2_exps)
in
[(Type, Type)] -> (Type, Type)
followExpansions forall a b. (a -> b) -> a -> b
$
forall a b. String -> [a] -> [b] -> [(a, b)]
zipEqual String
"expandSynonymsToMatch.go"
(if Int
t1_exps forall a. Ord a => a -> a -> Bool
> Int
t2_exps then forall a. Int -> [a] -> [a]
drop Int
dif [Type]
t1_exp_tys else [Type]
t1_exp_tys)
(if Int
t2_exps forall a. Ord a => a -> a -> Bool
> Int
t1_exps then forall a. Int -> [a] -> [a]
drop Int
dif [Type]
t2_exp_tys else [Type]
t2_exp_tys)
tyExpansions :: Type -> [Type]
tyExpansions :: Type -> [Type]
tyExpansions = forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr (\Type
t -> (\Type
x -> (Type
x, Type
x)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Type -> Maybe Type
tcView Type
t)
followExpansions :: [(Type, Type)] -> (Type, Type)
followExpansions :: [(Type, Type)] -> (Type, Type)
followExpansions [] = forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"followExpansions" SDoc
empty
followExpansions [(Type
t1, Type
t2)]
| Type -> Type -> Bool
sameShapes Type
t1 Type
t2 = Type -> Type -> (Type, Type)
go Type
t1 Type
t2
| Bool
otherwise = (Type
t1, Type
t2)
followExpansions ((Type
t1, Type
t2) : [(Type, Type)]
tss)
| Type -> Type -> Bool
sameShapes Type
t1 Type
t2 = Type -> Type -> (Type, Type)
go Type
t1 Type
t2
| Bool
otherwise = [(Type, Type)] -> (Type, Type)
followExpansions [(Type, Type)]
tss
sameShapes :: Type -> Type -> Bool
sameShapes :: Type -> Type -> Bool
sameShapes AppTy{} AppTy{} = Bool
True
sameShapes (TyConApp TyCon
tc1 [Type]
_) (TyConApp TyCon
tc2 [Type]
_) = TyCon
tc1 forall a. Eq a => a -> a -> Bool
== TyCon
tc2
sameShapes (FunTy {}) (FunTy {}) = Bool
True
sameShapes (ForAllTy {}) (ForAllTy {}) = Bool
True
sameShapes (CastTy Type
ty1 Coercion
_) Type
ty2 = Type -> Type -> Bool
sameShapes Type
ty1 Type
ty2
sameShapes Type
ty1 (CastTy Type
ty2 Coercion
_) = Type -> Type -> Bool
sameShapes Type
ty1 Type
ty2
sameShapes Type
_ Type
_ = Bool
False
sameOccExtra :: TcType -> TcType -> SDoc
Type
ty1 Type
ty2
| Just (TyCon
tc1, [Type]
_) <- HasCallStack => Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty1
, Just (TyCon
tc2, [Type]
_) <- HasCallStack => Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty2
, let n1 :: Name
n1 = TyCon -> Name
tyConName TyCon
tc1
n2 :: Name
n2 = TyCon -> Name
tyConName TyCon
tc2
same_occ :: Bool
same_occ = Name -> OccName
nameOccName Name
n1 forall a. Eq a => a -> a -> Bool
== Name -> OccName
nameOccName Name
n2
same_pkg :: Bool
same_pkg = forall unit. GenModule unit -> unit
moduleUnit (HasDebugCallStack => Name -> Module
nameModule Name
n1) forall a. Eq a => a -> a -> Bool
== forall unit. GenModule unit -> unit
moduleUnit (HasDebugCallStack => Name -> Module
nameModule Name
n2)
, Name
n1 forall a. Eq a => a -> a -> Bool
/= Name
n2
, Bool
same_occ
= String -> SDoc
text String
"NB:" SDoc -> SDoc -> SDoc
<+> (Bool -> Name -> SDoc
ppr_from Bool
same_pkg Name
n1 SDoc -> SDoc -> SDoc
$$ Bool -> Name -> SDoc
ppr_from Bool
same_pkg Name
n2)
| Bool
otherwise
= SDoc
empty
where
ppr_from :: Bool -> Name -> SDoc
ppr_from Bool
same_pkg Name
nm
| SrcSpan -> Bool
isGoodSrcSpan SrcSpan
loc
= SDoc -> Int -> SDoc -> SDoc
hang (SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Name
nm) SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"is defined at")
Int
2 (forall a. Outputable a => a -> SDoc
ppr SrcSpan
loc)
| Bool
otherwise
= SDoc -> Int -> SDoc -> SDoc
hang (SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Name
nm))
Int
2 ([SDoc] -> SDoc
sep [ String -> SDoc
text String
"is defined in" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr (forall unit. GenModule unit -> ModuleName
moduleName Module
mod))
, Bool -> SDoc -> SDoc
ppUnless (Bool
same_pkg Bool -> Bool -> Bool
|| Unit
pkg forall a. Eq a => a -> a -> Bool
== Unit
mainUnit) forall a b. (a -> b) -> a -> b
$
Int -> SDoc -> SDoc
nest Int
4 forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"in package" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Unit
pkg) ])
where
pkg :: Unit
pkg = forall unit. GenModule unit -> unit
moduleUnit Module
mod
mod :: Module
mod = HasDebugCallStack => Name -> Module
nameModule Name
nm
loc :: SrcSpan
loc = Name -> SrcSpan
nameSrcSpan Name
nm
mkDictErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkDictErr :: ReportErrCtxt -> [Ct] -> TcM (MsgEnvelope DecoratedSDoc)
mkDictErr ReportErrCtxt
ctxt [Ct]
cts
= ASSERT( not (null cts) )
do { InstEnvs
inst_envs <- TcM InstEnvs
tcGetInstEnvs
; let (Ct
ct1:[Ct]
_) = [Ct]
cts
min_cts :: [Ct]
min_cts = [Ct] -> [Ct]
elim_superclasses [Ct]
cts
lookups :: [(Ct, ClsInstLookupResult)]
lookups = forall a b. (a -> b) -> [a] -> [b]
map (InstEnvs -> Ct -> (Ct, ClsInstLookupResult)
lookup_cls_inst InstEnvs
inst_envs) [Ct]
min_cts
([(Ct, ClsInstLookupResult)]
no_inst_cts, [(Ct, ClsInstLookupResult)]
overlap_cts) = forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (Ct, ClsInstLookupResult) -> Bool
is_no_inst [(Ct, ClsInstLookupResult)]
lookups
; (ReportErrCtxt
ctxt, SDoc
err) <- ReportErrCtxt
-> (Ct, ClsInstLookupResult) -> TcM (ReportErrCtxt, SDoc)
mk_dict_err ReportErrCtxt
ctxt (forall a. [a] -> a
head ([(Ct, ClsInstLookupResult)]
no_inst_cts forall a. [a] -> [a] -> [a]
++ [(Ct, ClsInstLookupResult)]
overlap_cts))
; ReportErrCtxt -> Ct -> Report -> TcM (MsgEnvelope DecoratedSDoc)
mkErrorMsgFromCt ReportErrCtxt
ctxt Ct
ct1 (SDoc -> Report
important SDoc
err) }
where
no_givens :: Bool
no_givens = forall (t :: * -> *) a. Foldable t => t a -> Bool
null (ReportErrCtxt -> [Implication]
getUserGivens ReportErrCtxt
ctxt)
is_no_inst :: (Ct, ClsInstLookupResult) -> Bool
is_no_inst (Ct
ct, ([InstMatch]
matches, [ClsInst]
unifiers, [InstMatch]
_))
= Bool
no_givens
Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null [InstMatch]
matches
Bool -> Bool -> Bool
&& (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ClsInst]
unifiers Bool -> Bool -> Bool
|| forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. TcId -> Bool
isAmbiguousTyVar) (Ct -> [TcId]
tyCoVarsOfCtList Ct
ct))
lookup_cls_inst :: InstEnvs -> Ct -> (Ct, ClsInstLookupResult)
lookup_cls_inst InstEnvs
inst_envs Ct
ct
= (Ct
ct, Bool -> InstEnvs -> Class -> [Type] -> ClsInstLookupResult
lookupInstEnv Bool
True InstEnvs
inst_envs Class
clas (InScopeSet -> [Type] -> [Type]
flattenTys InScopeSet
emptyInScopeSet [Type]
tys))
where
(Class
clas, [Type]
tys) = HasDebugCallStack => Type -> (Class, [Type])
getClassPredTys (Ct -> Type
ctPred Ct
ct)
elim_superclasses :: [Ct] -> [Ct]
elim_superclasses [Ct]
cts = forall a. (a -> Type) -> [a] -> [a]
mkMinimalBySCs Ct -> Type
ctPred [Ct]
cts
mk_dict_err :: ReportErrCtxt -> (Ct, ClsInstLookupResult)
-> TcM (ReportErrCtxt, SDoc)
mk_dict_err :: ReportErrCtxt
-> (Ct, ClsInstLookupResult) -> TcM (ReportErrCtxt, SDoc)
mk_dict_err ctxt :: ReportErrCtxt
ctxt@(CEC {cec_encl :: ReportErrCtxt -> [Implication]
cec_encl = [Implication]
implics}) (Ct
ct, ([InstMatch]
matches, [ClsInst]
unifiers, [InstMatch]
unsafe_overlapped))
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [InstMatch]
matches
= do { (ReportErrCtxt
ctxt, SDoc
binds_msg, Ct
ct) <- Bool -> ReportErrCtxt -> Ct -> TcM (ReportErrCtxt, SDoc, Ct)
relevantBindings Bool
True ReportErrCtxt
ctxt Ct
ct
; [ClsInst]
candidate_insts <- TcM [ClsInst]
get_candidate_instances
; forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt, Ct -> [ClsInst] -> SDoc -> SDoc
cannot_resolve_msg Ct
ct [ClsInst]
candidate_insts SDoc
binds_msg) }
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [InstMatch]
unsafe_overlapped
= forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt, SDoc
overlap_msg)
| Bool
otherwise
= forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt, SDoc
safe_haskell_msg)
where
orig :: CtOrigin
orig = Ct -> CtOrigin
ctOrigin Ct
ct
pred :: Type
pred = Ct -> Type
ctPred Ct
ct
(Class
clas, [Type]
tys) = HasDebugCallStack => Type -> (Class, [Type])
getClassPredTys Type
pred
ispecs :: [ClsInst]
ispecs = [ClsInst
ispec | (ClsInst
ispec, [Maybe Type]
_) <- [InstMatch]
matches]
unsafe_ispecs :: [ClsInst]
unsafe_ispecs = [ClsInst
ispec | (ClsInst
ispec, [Maybe Type]
_) <- [InstMatch]
unsafe_overlapped]
useful_givens :: [Implication]
useful_givens = CtOrigin -> [Implication] -> [Implication]
discardProvCtxtGivens CtOrigin
orig ([Implication] -> [Implication]
getUserGivensFromImplics [Implication]
implics)
get_candidate_instances :: TcM [ClsInst]
get_candidate_instances :: TcM [ClsInst]
get_candidate_instances
| [Type
ty] <- [Type]
tys
= do { InstEnvs
instEnvs <- TcM InstEnvs
tcGetInstEnvs
; forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. (a -> Bool) -> [a] -> [a]
filter (Type -> ClsInst -> Bool
is_candidate_inst Type
ty)
(InstEnvs -> Class -> [ClsInst]
classInstances InstEnvs
instEnvs Class
clas)) }
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return []
is_candidate_inst :: Type -> ClsInst -> Bool
is_candidate_inst Type
ty ClsInst
inst
| [Type
other_ty] <- ClsInst -> [Type]
is_tys ClsInst
inst
, Just (TyCon
tc1, [Type]
_) <- HasCallStack => Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty
, Just (TyCon
tc2, [Type]
_) <- HasCallStack => Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
other_ty
= let n1 :: Name
n1 = TyCon -> Name
tyConName TyCon
tc1
n2 :: Name
n2 = TyCon -> Name
tyConName TyCon
tc2
different_names :: Bool
different_names = Name
n1 forall a. Eq a => a -> a -> Bool
/= Name
n2
same_occ_names :: Bool
same_occ_names = Name -> OccName
nameOccName Name
n1 forall a. Eq a => a -> a -> Bool
== Name -> OccName
nameOccName Name
n2
in Bool
different_names Bool -> Bool -> Bool
&& Bool
same_occ_names
| Bool
otherwise = Bool
False
cannot_resolve_msg :: Ct -> [ClsInst] -> SDoc -> SDoc
cannot_resolve_msg :: Ct -> [ClsInst] -> SDoc -> SDoc
cannot_resolve_msg Ct
ct [ClsInst]
candidate_insts SDoc
binds_msg
= [SDoc] -> SDoc
vcat [ SDoc
no_inst_msg
, Int -> SDoc -> SDoc
nest Int
2 SDoc
extra_note
, [SDoc] -> SDoc
vcat ([Implication] -> [SDoc]
pp_givens [Implication]
useful_givens)
, Maybe SDoc
mb_patsyn_prov forall a. Maybe a -> a -> a
`orElse` SDoc
empty
, Bool -> SDoc -> SDoc
ppWhen (Bool
has_ambig_tvs Bool -> Bool -> Bool
&& Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ClsInst]
unifiers Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Implication]
useful_givens))
([SDoc] -> SDoc
vcat [ Bool -> SDoc -> SDoc
ppUnless Bool
lead_with_ambig SDoc
ambig_msg, SDoc
binds_msg, SDoc
potential_msg ])
, Bool -> SDoc -> SDoc
ppWhen (forall a. Maybe a -> Bool
isNothing Maybe SDoc
mb_patsyn_prov) forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
show_fixes (Bool -> Type -> [Implication] -> [SDoc]
ctxtFixes Bool
has_ambig_tvs Type
pred [Implication]
implics
forall a. [a] -> [a] -> [a]
++ [SDoc]
drv_fixes)
, Bool -> SDoc -> SDoc
ppWhen (Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ClsInst]
candidate_insts))
(SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"There are instances for similar types:")
Int
2 ([SDoc] -> SDoc
vcat (forall a b. (a -> b) -> [a] -> [b]
map forall a. Outputable a => a -> SDoc
ppr [ClsInst]
candidate_insts))) ]
where
orig :: CtOrigin
orig = Ct -> CtOrigin
ctOrigin Ct
ct
lead_with_ambig :: Bool
lead_with_ambig = Bool
has_ambig_tvs Bool -> Bool -> Bool
&& Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any TcId -> Bool
isRuntimeUnkSkol [TcId]
ambig_tvs)
Bool -> Bool -> Bool
&& Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ClsInst]
unifiers) Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Implication]
useful_givens
(Bool
has_ambig_tvs, SDoc
ambig_msg) = Bool -> Ct -> (Bool, SDoc)
mkAmbigMsg Bool
lead_with_ambig Ct
ct
ambig_tvs :: [TcId]
ambig_tvs = forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. [a] -> [a] -> [a]
(++) (Ct -> ([TcId], [TcId])
getAmbigTkvs Ct
ct)
no_inst_msg :: SDoc
no_inst_msg
| Bool
lead_with_ambig
= SDoc
ambig_msg SDoc -> SDoc -> SDoc
<+> CtOrigin -> SDoc
pprArising CtOrigin
orig
SDoc -> SDoc -> SDoc
$$ String -> SDoc
text String
"prevents the constraint" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Type -> SDoc
pprParendType Type
pred)
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"from being solved."
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Implication]
useful_givens
= CtOrigin -> SDoc -> SDoc
addArising CtOrigin
orig forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"No instance for"
SDoc -> SDoc -> SDoc
<+> Type -> SDoc
pprParendType Type
pred
| Bool
otherwise
= CtOrigin -> SDoc -> SDoc
addArising CtOrigin
orig forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"Could not deduce"
SDoc -> SDoc -> SDoc
<+> Type -> SDoc
pprParendType Type
pred
potential_msg :: SDoc
potential_msg
= Bool -> SDoc -> SDoc
ppWhen (Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ClsInst]
unifiers) Bool -> Bool -> Bool
&& CtOrigin -> Bool
want_potential CtOrigin
orig) forall a b. (a -> b) -> a -> b
$
forall a. (SDocContext -> a) -> (a -> SDoc) -> SDoc
sdocOption SDocContext -> Bool
sdocPrintPotentialInstances forall a b. (a -> b) -> a -> b
$ \Bool
print_insts ->
(PprStyle -> SDoc) -> SDoc
getPprStyle forall a b. (a -> b) -> a -> b
$ \PprStyle
sty ->
PrintPotentialInstances -> PprStyle -> SDoc -> [ClsInst] -> SDoc
pprPotentials (Bool -> PrintPotentialInstances
PrintPotentialInstances Bool
print_insts) PprStyle
sty SDoc
potential_hdr [ClsInst]
unifiers
potential_hdr :: SDoc
potential_hdr
= [SDoc] -> SDoc
vcat [ Bool -> SDoc -> SDoc
ppWhen Bool
lead_with_ambig forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
"Probable fix: use a type annotation to specify what"
SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => [a] -> SDoc
pprQuotedList [TcId]
ambig_tvs SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"should be."
, String -> SDoc
text String
"These potential instance" SDoc -> SDoc -> SDoc
<> forall a. [a] -> SDoc
plural [ClsInst]
unifiers
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"exist:"]
mb_patsyn_prov :: Maybe SDoc
mb_patsyn_prov :: Maybe SDoc
mb_patsyn_prov
| Bool -> Bool
not Bool
lead_with_ambig
, ProvCtxtOrigin PSB{ psb_def :: forall idL idR. PatSynBind idL idR -> LPat idR
psb_def = L SrcSpanAnnA
_ Pat GhcRn
pat } <- CtOrigin
orig
= forall a. a -> Maybe a
Just ([SDoc] -> SDoc
vcat [ String -> SDoc
text String
"In other words, a successful match on the pattern"
, Int -> SDoc -> SDoc
nest Int
2 forall a b. (a -> b) -> a -> b
$ forall a. Outputable a => a -> SDoc
ppr Pat GhcRn
pat
, String -> SDoc
text String
"does not provide the constraint" SDoc -> SDoc -> SDoc
<+> Type -> SDoc
pprParendType Type
pred ])
| Bool
otherwise = forall a. Maybe a
Nothing
want_potential :: CtOrigin -> Bool
want_potential (TypeEqOrigin {}) = Bool
False
want_potential CtOrigin
_ = Bool
True
extra_note :: SDoc
extra_note | forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Type -> Bool
isFunTy (TyCon -> [Type] -> [Type]
filterOutInvisibleTypes (Class -> TyCon
classTyCon Class
clas) [Type]
tys)
= String -> SDoc
text String
"(maybe you haven't applied a function to enough arguments?)"
| Class -> Name
className Class
clas forall a. Eq a => a -> a -> Bool
== Name
typeableClassName
, [Type
_,Type
ty] <- [Type]
tys
, Just (TyCon
tc,[Type]
_) <- HasCallStack => Type -> Maybe (TyCon, [Type])
tcSplitTyConApp_maybe Type
ty
, Bool -> Bool
not (TyCon -> Bool
isTypeFamilyTyCon TyCon
tc)
= SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"GHC can't yet do polykinded")
Int
2 (String -> SDoc
text String
"Typeable" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
parens (forall a. Outputable a => a -> SDoc
ppr Type
ty SDoc -> SDoc -> SDoc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (HasDebugCallStack => Type -> Type
tcTypeKind Type
ty)))
| Bool
otherwise
= SDoc
empty
drv_fixes :: [SDoc]
drv_fixes = case CtOrigin
orig of
CtOrigin
DerivClauseOrigin -> [Bool -> SDoc
drv_fix Bool
False]
CtOrigin
StandAloneDerivOrigin -> [Bool -> SDoc
drv_fix Bool
True]
DerivOriginDC DataCon
_ Int
_ Bool
standalone -> [Bool -> SDoc
drv_fix Bool
standalone]
DerivOriginCoerce TcId
_ Type
_ Type
_ Bool
standalone -> [Bool -> SDoc
drv_fix Bool
standalone]
CtOrigin
_ -> []
drv_fix :: Bool -> SDoc
drv_fix Bool
standalone_wildcard
| Bool
standalone_wildcard
= String -> SDoc
text String
"fill in the wildcard constraint yourself"
| Bool
otherwise
= SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"use a standalone 'deriving instance' declaration,")
Int
2 (String -> SDoc
text String
"so you can specify the instance context yourself")
overlap_msg :: SDoc
overlap_msg
= ASSERT( not (null matches) )
[SDoc] -> SDoc
vcat [ CtOrigin -> SDoc -> SDoc
addArising CtOrigin
orig (String -> SDoc
text String
"Overlapping instances for"
SDoc -> SDoc -> SDoc
<+> Type -> SDoc
pprType (Class -> [Type] -> Type
mkClassPred Class
clas [Type]
tys))
, Bool -> SDoc -> SDoc
ppUnless (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [SDoc]
matching_givens) forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
sep [String -> SDoc
text String
"Matching givens (or their superclasses):"
, Int -> SDoc -> SDoc
nest Int
2 ([SDoc] -> SDoc
vcat [SDoc]
matching_givens)]
, forall a. (SDocContext -> a) -> (a -> SDoc) -> SDoc
sdocOption SDocContext -> Bool
sdocPrintPotentialInstances forall a b. (a -> b) -> a -> b
$ \Bool
print_insts ->
(PprStyle -> SDoc) -> SDoc
getPprStyle forall a b. (a -> b) -> a -> b
$ \PprStyle
sty ->
PrintPotentialInstances -> PprStyle -> SDoc -> [ClsInst] -> SDoc
pprPotentials (Bool -> PrintPotentialInstances
PrintPotentialInstances Bool
print_insts) PprStyle
sty (String -> SDoc
text String
"Matching instances:") forall a b. (a -> b) -> a -> b
$
[ClsInst]
ispecs forall a. [a] -> [a] -> [a]
++ [ClsInst]
unifiers
, Bool -> SDoc -> SDoc
ppWhen (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [SDoc]
matching_givens Bool -> Bool -> Bool
&& forall a. [a] -> Bool
isSingleton [InstMatch]
matches Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ClsInst]
unifiers) forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
sep [ String -> SDoc
text String
"There exists a (perhaps superclass) match:"
, Int -> SDoc -> SDoc
nest Int
2 ([SDoc] -> SDoc
vcat ([Implication] -> [SDoc]
pp_givens [Implication]
useful_givens))]
, Bool -> SDoc -> SDoc
ppWhen (forall a. [a] -> Bool
isSingleton [InstMatch]
matches) forall a b. (a -> b) -> a -> b
$
SDoc -> SDoc
parens ([SDoc] -> SDoc
vcat [ Bool -> SDoc -> SDoc
ppUnless (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
tyCoVars) forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
"The choice depends on the instantiation of" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (forall a. (a -> SDoc) -> [a] -> SDoc
pprWithCommas forall a. Outputable a => a -> SDoc
ppr [TcId]
tyCoVars)
, Bool -> SDoc -> SDoc
ppUnless (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TyCon]
famTyCons) forall a b. (a -> b) -> a -> b
$
if (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
tyCoVars)
then
String -> SDoc
text String
"The choice depends on the result of evaluating" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (forall a. (a -> SDoc) -> [a] -> SDoc
pprWithCommas forall a. Outputable a => a -> SDoc
ppr [TyCon]
famTyCons)
else
String -> SDoc
text String
"and the result of evaluating" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (forall a. (a -> SDoc) -> [a] -> SDoc
pprWithCommas forall a. Outputable a => a -> SDoc
ppr [TyCon]
famTyCons)
, Bool -> SDoc -> SDoc
ppWhen (forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([SDoc]
matching_givens)) forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"To pick the first instance above, use IncoherentInstances"
, String -> SDoc
text String
"when compiling the other instance declarations"]
])]
where
tyCoVars :: [TcId]
tyCoVars = [Type] -> [TcId]
tyCoVarsOfTypesList [Type]
tys
famTyCons :: [TyCon]
famTyCons = forall a. (a -> Bool) -> [a] -> [a]
filter TyCon -> Bool
isFamilyTyCon forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (forall elt. UniqSet elt -> [elt]
nonDetEltsUniqSet forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type -> UniqSet TyCon
tyConsOfType) [Type]
tys
matching_givens :: [SDoc]
matching_givens = forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Implication -> Maybe SDoc
matchable [Implication]
useful_givens
matchable :: Implication -> Maybe SDoc
matchable implic :: Implication
implic@(Implic { ic_given :: Implication -> [TcId]
ic_given = [TcId]
evvars, ic_info :: Implication -> SkolemInfo
ic_info = SkolemInfo
skol_info })
= case [Type]
ev_vars_matching of
[] -> forall a. Maybe a
Nothing
[Type]
_ -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ SDoc -> Int -> SDoc -> SDoc
hang ([Type] -> SDoc
pprTheta [Type]
ev_vars_matching)
Int
2 ([SDoc] -> SDoc
sep [ String -> SDoc
text String
"bound by" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr SkolemInfo
skol_info
, String -> SDoc
text String
"at" SDoc -> SDoc -> SDoc
<+>
forall a. Outputable a => a -> SDoc
ppr (TcLclEnv -> RealSrcSpan
tcl_loc (Implication -> TcLclEnv
ic_env Implication
implic)) ])
where ev_vars_matching :: [Type]
ev_vars_matching = [ Type
pred
| TcId
ev_var <- [TcId]
evvars
, let pred :: Type
pred = TcId -> Type
evVarPred TcId
ev_var
, forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any Type -> Bool
can_match (Type
pred forall a. a -> [a] -> [a]
: Type -> [Type]
transSuperClasses Type
pred) ]
can_match :: Type -> Bool
can_match Type
pred
= case Type -> Maybe (Class, [Type])
getClassPredTys_maybe Type
pred of
Just (Class
clas', [Type]
tys') -> Class
clas' forall a. Eq a => a -> a -> Bool
== Class
clas
Bool -> Bool -> Bool
&& forall a. Maybe a -> Bool
isJust ([Type] -> [Type] -> Maybe TCvSubst
tcMatchTys [Type]
tys [Type]
tys')
Maybe (Class, [Type])
Nothing -> Bool
False
safe_haskell_msg :: SDoc
safe_haskell_msg
= ASSERT( matches `lengthIs` 1 && not (null unsafe_ispecs) )
[SDoc] -> SDoc
vcat [ CtOrigin -> SDoc -> SDoc
addArising CtOrigin
orig (String -> SDoc
text String
"Unsafe overlapping instances for"
SDoc -> SDoc -> SDoc
<+> Type -> SDoc
pprType (Class -> [Type] -> Type
mkClassPred Class
clas [Type]
tys))
, [SDoc] -> SDoc
sep [String -> SDoc
text String
"The matching instance is:",
Int -> SDoc -> SDoc
nest Int
2 (ClsInst -> SDoc
pprInstance forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
head [ClsInst]
ispecs)]
, [SDoc] -> SDoc
vcat [ String -> SDoc
text String
"It is compiled in a Safe module and as such can only"
, String -> SDoc
text String
"overlap instances from the same module, however it"
, String -> SDoc
text String
"overlaps the following instances from different" SDoc -> SDoc -> SDoc
<+>
String -> SDoc
text String
"modules:"
, Int -> SDoc -> SDoc
nest Int
2 ([SDoc] -> SDoc
vcat [[ClsInst] -> SDoc
pprInstances forall a b. (a -> b) -> a -> b
$ [ClsInst]
unsafe_ispecs])
]
]
ctxtFixes :: Bool -> PredType -> [Implication] -> [SDoc]
ctxtFixes :: Bool -> Type -> [Implication] -> [SDoc]
ctxtFixes Bool
has_ambig_tvs Type
pred [Implication]
implics
| Bool -> Bool
not Bool
has_ambig_tvs
, Type -> Bool
isTyVarClassPred Type
pred
, (SkolemInfo
skol:[SkolemInfo]
skols) <- [Implication] -> Type -> [SkolemInfo]
usefulContext [Implication]
implics Type
pred
, let what :: SDoc
what | forall (t :: * -> *) a. Foldable t => t a -> Bool
null [SkolemInfo]
skols
, SigSkol (PatSynCtxt {}) Type
_ [(Name, TcId)]
_ <- SkolemInfo
skol
= String -> SDoc
text String
"\"required\""
| Bool
otherwise
= SDoc
empty
= [[SDoc] -> SDoc
sep [ String -> SDoc
text String
"add" SDoc -> SDoc -> SDoc
<+> Type -> SDoc
pprParendType Type
pred
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"to the" SDoc -> SDoc -> SDoc
<+> SDoc
what SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"context of"
, Int -> SDoc -> SDoc
nest Int
2 forall a b. (a -> b) -> a -> b
$ SkolemInfo -> SDoc
ppr_skol SkolemInfo
skol SDoc -> SDoc -> SDoc
$$
[SDoc] -> SDoc
vcat [ String -> SDoc
text String
"or" SDoc -> SDoc -> SDoc
<+> SkolemInfo -> SDoc
ppr_skol SkolemInfo
skol
| SkolemInfo
skol <- [SkolemInfo]
skols ] ] ]
| Bool
otherwise = []
where
ppr_skol :: SkolemInfo -> SDoc
ppr_skol (PatSkol (RealDataCon DataCon
dc) HsMatchContext GhcRn
_) = String -> SDoc
text String
"the data constructor" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr DataCon
dc)
ppr_skol (PatSkol (PatSynCon PatSyn
ps) HsMatchContext GhcRn
_) = String -> SDoc
text String
"the pattern synonym" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr PatSyn
ps)
ppr_skol SkolemInfo
skol_info = forall a. Outputable a => a -> SDoc
ppr SkolemInfo
skol_info
discardProvCtxtGivens :: CtOrigin -> [UserGiven] -> [UserGiven]
discardProvCtxtGivens :: CtOrigin -> [Implication] -> [Implication]
discardProvCtxtGivens CtOrigin
orig [Implication]
givens
| ProvCtxtOrigin (PSB {psb_id :: forall idL idR. PatSynBind idL idR -> LIdP idL
psb_id = L SrcSpanAnnN
_ Name
name}) <- CtOrigin
orig
= forall a. (a -> Bool) -> [a] -> [a]
filterOut (Name -> Implication -> Bool
discard Name
name) [Implication]
givens
| Bool
otherwise
= [Implication]
givens
where
discard :: Name -> Implication -> Bool
discard Name
n (Implic { ic_info :: Implication -> SkolemInfo
ic_info = SigSkol (PatSynCtxt Name
n') Type
_ [(Name, TcId)]
_ }) = Name
n forall a. Eq a => a -> a -> Bool
== Name
n'
discard Name
_ Implication
_ = Bool
False
usefulContext :: [Implication] -> PredType -> [SkolemInfo]
usefulContext :: [Implication] -> Type -> [SkolemInfo]
usefulContext [Implication]
implics Type
pred
= [Implication] -> [SkolemInfo]
go [Implication]
implics
where
pred_tvs :: TyCoVarSet
pred_tvs = Type -> TyCoVarSet
tyCoVarsOfType Type
pred
go :: [Implication] -> [SkolemInfo]
go [] = []
go (Implication
ic : [Implication]
ics)
| Implication -> Bool
implausible Implication
ic = [SkolemInfo]
rest
| Bool
otherwise = Implication -> SkolemInfo
ic_info Implication
ic forall a. a -> [a] -> [a]
: [SkolemInfo]
rest
where
rest :: [SkolemInfo]
rest | forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (TcId -> TyCoVarSet -> Bool
`elemVarSet` TyCoVarSet
pred_tvs) (Implication -> [TcId]
ic_skols Implication
ic) = []
| Bool
otherwise = [Implication] -> [SkolemInfo]
go [Implication]
ics
implausible :: Implication -> Bool
implausible Implication
ic
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Implication -> [TcId]
ic_skols Implication
ic) = Bool
True
| SkolemInfo -> Bool
implausible_info (Implication -> SkolemInfo
ic_info Implication
ic) = Bool
True
| Bool
otherwise = Bool
False
implausible_info :: SkolemInfo -> Bool
implausible_info (SigSkol (InfSigCtxt {}) Type
_ [(Name, TcId)]
_) = Bool
True
implausible_info SkolemInfo
_ = Bool
False
show_fixes :: [SDoc] -> SDoc
show_fixes :: [SDoc] -> SDoc
show_fixes [] = SDoc
empty
show_fixes (SDoc
f:[SDoc]
fs) = [SDoc] -> SDoc
sep [ String -> SDoc
text String
"Possible fix:"
, Int -> SDoc -> SDoc
nest Int
2 ([SDoc] -> SDoc
vcat (SDoc
f forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (String -> SDoc
text String
"or" SDoc -> SDoc -> SDoc
<+>) [SDoc]
fs))]
newtype PrintPotentialInstances = PrintPotentialInstances Bool
pprPotentials :: PrintPotentialInstances -> PprStyle -> SDoc -> [ClsInst] -> SDoc
pprPotentials :: PrintPotentialInstances -> PprStyle -> SDoc -> [ClsInst] -> SDoc
pprPotentials (PrintPotentialInstances Bool
show_potentials) PprStyle
sty SDoc
herald [ClsInst]
insts
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ClsInst]
insts
= SDoc
empty
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ClsInst]
show_these
= SDoc -> Int -> SDoc -> SDoc
hang SDoc
herald
Int
2 ([SDoc] -> SDoc
vcat [ SDoc -> SDoc
not_in_scope_msg SDoc
empty
, SDoc
flag_hint ])
| Bool
otherwise
= SDoc -> Int -> SDoc -> SDoc
hang SDoc
herald
Int
2 ([SDoc] -> SDoc
vcat [ [ClsInst] -> SDoc
pprInstances [ClsInst]
show_these
, Bool -> SDoc -> SDoc
ppWhen (Int
n_in_scope_hidden forall a. Ord a => a -> a -> Bool
> Int
0) forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
"...plus"
SDoc -> SDoc -> SDoc
<+> Int -> SDoc -> SDoc
speakNOf Int
n_in_scope_hidden (String -> SDoc
text String
"other")
, SDoc -> SDoc
not_in_scope_msg (String -> SDoc
text String
"...plus")
, SDoc
flag_hint ])
where
n_show :: Int
n_show = Int
3 :: Int
([ClsInst]
in_scope, [ClsInst]
not_in_scope) = forall a. (a -> Bool) -> [a] -> ([a], [a])
partition ClsInst -> Bool
inst_in_scope [ClsInst]
insts
sorted :: [ClsInst]
sorted = forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy ClsInst -> ClsInst -> Ordering
fuzzyClsInstCmp [ClsInst]
in_scope
show_these :: [ClsInst]
show_these | Bool
show_potentials = [ClsInst]
sorted
| Bool
otherwise = forall a. Int -> [a] -> [a]
take Int
n_show [ClsInst]
sorted
n_in_scope_hidden :: Int
n_in_scope_hidden = forall (t :: * -> *) a. Foldable t => t a -> Int
length [ClsInst]
sorted forall a. Num a => a -> a -> a
- forall (t :: * -> *) a. Foldable t => t a -> Int
length [ClsInst]
show_these
inst_in_scope :: ClsInst -> Bool
inst_in_scope :: ClsInst -> Bool
inst_in_scope ClsInst
cls_inst = (Name -> Bool) -> NameSet -> Bool
nameSetAll Name -> Bool
name_in_scope forall a b. (a -> b) -> a -> b
$
[Type] -> NameSet
orphNamesOfTypes (ClsInst -> [Type]
is_tys ClsInst
cls_inst)
name_in_scope :: Name -> Bool
name_in_scope Name
name
| Name -> Bool
isBuiltInSyntax Name
name
= Bool
True
| Just Module
mod <- Name -> Maybe Module
nameModule_maybe Name
name
= QualifyName -> Bool
qual_in_scope (PprStyle -> QueryQualifyName
qualName PprStyle
sty Module
mod (Name -> OccName
nameOccName Name
name))
| Bool
otherwise
= Bool
True
qual_in_scope :: QualifyName -> Bool
qual_in_scope :: QualifyName -> Bool
qual_in_scope QualifyName
NameUnqual = Bool
True
qual_in_scope (NameQual {}) = Bool
True
qual_in_scope QualifyName
_ = Bool
False
not_in_scope_msg :: SDoc -> SDoc
not_in_scope_msg SDoc
herald
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ClsInst]
not_in_scope
= SDoc
empty
| Bool
otherwise
= SDoc -> Int -> SDoc -> SDoc
hang (SDoc
herald SDoc -> SDoc -> SDoc
<+> Int -> SDoc -> SDoc
speakNOf (forall (t :: * -> *) a. Foldable t => t a -> Int
length [ClsInst]
not_in_scope) (String -> SDoc
text String
"instance")
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"involving out-of-scope types")
Int
2 (Bool -> SDoc -> SDoc
ppWhen Bool
show_potentials ([ClsInst] -> SDoc
pprInstances [ClsInst]
not_in_scope))
flag_hint :: SDoc
flag_hint = Bool -> SDoc -> SDoc
ppUnless (Bool
show_potentials Bool -> Bool -> Bool
|| forall a b. [a] -> [b] -> Bool
equalLength [ClsInst]
show_these [ClsInst]
insts) forall a b. (a -> b) -> a -> b
$
String -> SDoc
text String
"(use -fprint-potential-instances to see them all)"
mkAmbigMsg :: Bool
-> Ct -> (Bool, SDoc)
mkAmbigMsg :: Bool -> Ct -> (Bool, SDoc)
mkAmbigMsg Bool
prepend_msg Ct
ct
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
ambig_kvs Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
ambig_tvs = (Bool
False, SDoc
empty)
| Bool
otherwise = (Bool
True, SDoc
msg)
where
([TcId]
ambig_kvs, [TcId]
ambig_tvs) = Ct -> ([TcId], [TcId])
getAmbigTkvs Ct
ct
msg :: SDoc
msg | forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any TcId -> Bool
isRuntimeUnkSkol [TcId]
ambig_kvs
Bool -> Bool -> Bool
|| forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any TcId -> Bool
isRuntimeUnkSkol [TcId]
ambig_tvs
= [SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Cannot resolve unknown runtime type"
SDoc -> SDoc -> SDoc
<> forall a. [a] -> SDoc
plural [TcId]
ambig_tvs SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => [a] -> SDoc
pprQuotedList [TcId]
ambig_tvs
, String -> SDoc
text String
"Use :print or :force to determine these types"]
| Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
ambig_tvs)
= SDoc -> [TcId] -> SDoc
pp_ambig (String -> SDoc
text String
"type") [TcId]
ambig_tvs
| Bool
otherwise
= SDoc -> [TcId] -> SDoc
pp_ambig (String -> SDoc
text String
"kind") [TcId]
ambig_kvs
pp_ambig :: SDoc -> [TcId] -> SDoc
pp_ambig SDoc
what [TcId]
tkvs
| Bool
prepend_msg
= String -> SDoc
text String
"Ambiguous" SDoc -> SDoc -> SDoc
<+> SDoc
what SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"variable"
SDoc -> SDoc -> SDoc
<> forall a. [a] -> SDoc
plural [TcId]
tkvs SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => [a] -> SDoc
pprQuotedList [TcId]
tkvs
| Bool
otherwise
= String -> SDoc
text String
"The" SDoc -> SDoc -> SDoc
<+> SDoc
what SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"variable" SDoc -> SDoc -> SDoc
<> forall a. [a] -> SDoc
plural [TcId]
tkvs
SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => [a] -> SDoc
pprQuotedList [TcId]
tkvs SDoc -> SDoc -> SDoc
<+> forall a. [a] -> SDoc
isOrAre [TcId]
tkvs SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"ambiguous"
pprSkols :: ReportErrCtxt -> [TcTyVar] -> SDoc
pprSkols :: ReportErrCtxt -> [TcId] -> SDoc
pprSkols ReportErrCtxt
ctxt [TcId]
tvs
= [SDoc] -> SDoc
vcat (forall a b. (a -> b) -> [a] -> [b]
map forall {a}.
(Outputable a, NamedThing a) =>
(SkolemInfo, [a]) -> SDoc
pp_one ([Implication] -> [TcId] -> [(SkolemInfo, [TcId])]
getSkolemInfo (ReportErrCtxt -> [Implication]
cec_encl ReportErrCtxt
ctxt) [TcId]
tvs))
where
pp_one :: (SkolemInfo, [a]) -> SDoc
pp_one (SkolemInfo
UnkSkol, [a]
tvs)
= SDoc -> Int -> SDoc -> SDoc
hang (forall a. Outputable a => [a] -> SDoc
pprQuotedList [a]
tvs)
Int
2 (forall {a}. [a] -> String -> String -> SDoc
is_or_are [a]
tvs String
"an" String
"unknown")
pp_one (SkolemInfo
RuntimeUnkSkol, [a]
tvs)
= SDoc -> Int -> SDoc -> SDoc
hang (forall a. Outputable a => [a] -> SDoc
pprQuotedList [a]
tvs)
Int
2 (forall {a}. [a] -> String -> String -> SDoc
is_or_are [a]
tvs String
"an" String
"unknown runtime")
pp_one (SkolemInfo
skol_info, [a]
tvs)
= [SDoc] -> SDoc
vcat [ SDoc -> Int -> SDoc -> SDoc
hang (forall a. Outputable a => [a] -> SDoc
pprQuotedList [a]
tvs)
Int
2 (forall {a}. [a] -> String -> String -> SDoc
is_or_are [a]
tvs String
"a" String
"rigid" SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"bound by")
, Int -> SDoc -> SDoc
nest Int
2 (SkolemInfo -> SDoc
pprSkolInfo SkolemInfo
skol_info)
, Int -> SDoc -> SDoc
nest Int
2 (String -> SDoc
text String
"at" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 SrcSpan -> SrcSpan -> SrcSpan
combineSrcSpans (forall a b. (a -> b) -> [a] -> [b]
map forall a. NamedThing a => a -> SrcSpan
getSrcSpan [a]
tvs))) ]
is_or_are :: [a] -> String -> String -> SDoc
is_or_are [a
_] String
article String
adjective = String -> SDoc
text String
"is" SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
article SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
adjective
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"type variable"
is_or_are [a]
_ String
_ String
adjective = String -> SDoc
text String
"are" SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
adjective
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"type variables"
getAmbigTkvs :: Ct -> ([Var],[Var])
getAmbigTkvs :: Ct -> ([TcId], [TcId])
getAmbigTkvs Ct
ct
= forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (TcId -> TyCoVarSet -> Bool
`elemVarSet` TyCoVarSet
dep_tkv_set) [TcId]
ambig_tkvs
where
tkvs :: [TcId]
tkvs = Ct -> [TcId]
tyCoVarsOfCtList Ct
ct
ambig_tkvs :: [TcId]
ambig_tkvs = forall a. (a -> Bool) -> [a] -> [a]
filter TcId -> Bool
isAmbiguousTyVar [TcId]
tkvs
dep_tkv_set :: TyCoVarSet
dep_tkv_set = [Type] -> TyCoVarSet
tyCoVarsOfTypes (forall a b. (a -> b) -> [a] -> [b]
map TcId -> Type
tyVarKind [TcId]
tkvs)
getSkolemInfo :: [Implication] -> [TcTyVar]
-> [(SkolemInfo, [TcTyVar])]
getSkolemInfo :: [Implication] -> [TcId] -> [(SkolemInfo, [TcId])]
getSkolemInfo [Implication]
_ []
= []
getSkolemInfo [] [TcId]
tvs
| forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all TcId -> Bool
isRuntimeUnkSkol [TcId]
tvs = [(SkolemInfo
RuntimeUnkSkol, [TcId]
tvs)]
| Bool
otherwise = forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"No skolem info:" (forall a. Outputable a => a -> SDoc
ppr [TcId]
tvs)
getSkolemInfo (Implication
implic:[Implication]
implics) [TcId]
tvs
| forall (t :: * -> *) a. Foldable t => t a -> Bool
null [TcId]
tvs_here = [Implication] -> [TcId] -> [(SkolemInfo, [TcId])]
getSkolemInfo [Implication]
implics [TcId]
tvs
| Bool
otherwise = (Implication -> SkolemInfo
ic_info Implication
implic, [TcId]
tvs_here) forall a. a -> [a] -> [a]
: [Implication] -> [TcId] -> [(SkolemInfo, [TcId])]
getSkolemInfo [Implication]
implics [TcId]
tvs_other
where
([TcId]
tvs_here, [TcId]
tvs_other) = forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Implication -> [TcId]
ic_skols Implication
implic) [TcId]
tvs
relevantBindings :: Bool
-> ReportErrCtxt -> Ct
-> TcM (ReportErrCtxt, SDoc, Ct)
relevantBindings :: Bool -> ReportErrCtxt -> Ct -> TcM (ReportErrCtxt, SDoc, Ct)
relevantBindings Bool
want_filtering ReportErrCtxt
ctxt Ct
ct
= do { String -> SDoc -> TcM ()
traceTc String
"relevantBindings" (forall a. Outputable a => a -> SDoc
ppr Ct
ct)
; (TidyEnv
env1, CtOrigin
tidy_orig) <- TidyEnv -> CtOrigin -> TcM (TidyEnv, CtOrigin)
zonkTidyOrigin (ReportErrCtxt -> TidyEnv
cec_tidy ReportErrCtxt
ctxt) (CtLoc -> CtOrigin
ctLocOrigin CtLoc
loc)
; let extra_tvs :: TyCoVarSet
extra_tvs = case CtOrigin
tidy_orig of
KindEqOrigin Type
t1 Type
t2 CtOrigin
_ Maybe TypeOrKind
_ -> [Type] -> TyCoVarSet
tyCoVarsOfTypes [Type
t1,Type
t2]
CtOrigin
_ -> TyCoVarSet
emptyVarSet
ct_fvs :: TyCoVarSet
ct_fvs = Ct -> TyCoVarSet
tyCoVarsOfCt Ct
ct TyCoVarSet -> TyCoVarSet -> TyCoVarSet
`unionVarSet` TyCoVarSet
extra_tvs
loc' :: CtLoc
loc' = CtLoc -> CtOrigin -> CtLoc
setCtLocOrigin CtLoc
loc CtOrigin
tidy_orig
ct' :: Ct
ct' = Ct -> CtLoc -> Ct
setCtLoc Ct
ct CtLoc
loc'
; (TidyEnv
env2, NameEnv Type
lcl_name_cache) <- TidyEnv -> [TcLclEnv] -> TcM (TidyEnv, NameEnv Type)
zonkTidyTcLclEnvs TidyEnv
env1 [TcLclEnv
lcl_env]
; SDoc
doc <- Bool -> TcLclEnv -> NameEnv Type -> TyCoVarSet -> TcM SDoc
relevant_bindings Bool
want_filtering TcLclEnv
lcl_env NameEnv Type
lcl_name_cache TyCoVarSet
ct_fvs
; let ctxt' :: ReportErrCtxt
ctxt' = ReportErrCtxt
ctxt { cec_tidy :: TidyEnv
cec_tidy = TidyEnv
env2 }
; forall (m :: * -> *) a. Monad m => a -> m a
return (ReportErrCtxt
ctxt', SDoc
doc, Ct
ct') }
where
loc :: CtLoc
loc = Ct -> CtLoc
ctLoc Ct
ct
lcl_env :: TcLclEnv
lcl_env = CtLoc -> TcLclEnv
ctLocEnv CtLoc
loc
relevant_bindings :: Bool
-> TcLclEnv
-> NameEnv Type
-> TyCoVarSet
-> TcM SDoc
relevant_bindings :: Bool -> TcLclEnv -> NameEnv Type -> TyCoVarSet -> TcM SDoc
relevant_bindings Bool
want_filtering TcLclEnv
lcl_env NameEnv Type
lcl_name_env TyCoVarSet
ct_tvs
= do { DynFlags
dflags <- forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; String -> SDoc -> TcM ()
traceTc String
"relevant_bindings" forall a b. (a -> b) -> a -> b
$
[SDoc] -> SDoc
vcat [ forall a. Outputable a => a -> SDoc
ppr TyCoVarSet
ct_tvs
, forall a. (a -> SDoc) -> [a] -> SDoc
pprWithCommas forall a. a -> a
id [ forall a. Outputable a => a -> SDoc
ppr TcId
id SDoc -> SDoc -> SDoc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (TcId -> Type
idType TcId
id)
| TcIdBndr TcId
id TopLevelFlag
_ <- TcLclEnv -> TcBinderStack
tcl_bndrs TcLclEnv
lcl_env ]
, forall a. (a -> SDoc) -> [a] -> SDoc
pprWithCommas forall a. a -> a
id
[ forall a. Outputable a => a -> SDoc
ppr Name
id | TcIdBndr_ExpType Name
id ExpType
_ TopLevelFlag
_ <- TcLclEnv -> TcBinderStack
tcl_bndrs TcLclEnv
lcl_env ] ]
; ([SDoc]
docs, Bool
discards)
<- DynFlags
-> Maybe Int
-> TyCoVarSet
-> [SDoc]
-> Bool
-> TcBinderStack
-> TcM ([SDoc], Bool)
go DynFlags
dflags (DynFlags -> Maybe Int
maxRelevantBinds DynFlags
dflags)
TyCoVarSet
emptyVarSet [] Bool
False
(forall a. HasOccName a => [a] -> [a]
removeBindingShadowing forall a b. (a -> b) -> a -> b
$ TcLclEnv -> TcBinderStack
tcl_bndrs TcLclEnv
lcl_env)
; let doc :: SDoc
doc = Bool -> SDoc -> SDoc
ppUnless (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [SDoc]
docs) forall a b. (a -> b) -> a -> b
$
SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Relevant bindings include")
Int
2 ([SDoc] -> SDoc
vcat [SDoc]
docs SDoc -> SDoc -> SDoc
$$ Bool -> SDoc -> SDoc
ppWhen Bool
discards SDoc
discardMsg)
; forall (m :: * -> *) a. Monad m => a -> m a
return SDoc
doc }
where
run_out :: Maybe Int -> Bool
run_out :: Maybe Int -> Bool
run_out Maybe Int
Nothing = Bool
False
run_out (Just Int
n) = Int
n forall a. Ord a => a -> a -> Bool
<= Int
0
dec_max :: Maybe Int -> Maybe Int
dec_max :: Maybe Int -> Maybe Int
dec_max = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Int
n -> Int
n forall a. Num a => a -> a -> a
- Int
1)
go :: DynFlags -> Maybe Int -> TcTyVarSet -> [SDoc]
-> Bool
-> [TcBinder]
-> TcM ([SDoc], Bool)
go :: DynFlags
-> Maybe Int
-> TyCoVarSet
-> [SDoc]
-> Bool
-> TcBinderStack
-> TcM ([SDoc], Bool)
go DynFlags
_ Maybe Int
_ TyCoVarSet
_ [SDoc]
docs Bool
discards []
= forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. [a] -> [a]
reverse [SDoc]
docs, Bool
discards)
go DynFlags
dflags Maybe Int
n_left TyCoVarSet
tvs_seen [SDoc]
docs Bool
discards (TcBinder
tc_bndr : TcBinderStack
tc_bndrs)
= case TcBinder
tc_bndr of
TcTvBndr {} -> TcM ([SDoc], Bool)
discard_it
TcIdBndr TcId
id TopLevelFlag
top_lvl -> Name -> TopLevelFlag -> TcM ([SDoc], Bool)
go2 (TcId -> Name
idName TcId
id) TopLevelFlag
top_lvl
TcIdBndr_ExpType Name
name ExpType
et TopLevelFlag
top_lvl ->
do { Maybe Type
mb_ty <- ExpType -> TcM (Maybe Type)
readExpType_maybe ExpType
et
; case Maybe Type
mb_ty of
Just Type
_ty -> Name -> TopLevelFlag -> TcM ([SDoc], Bool)
go2 Name
name TopLevelFlag
top_lvl
Maybe Type
Nothing -> TcM ([SDoc], Bool)
discard_it
}
where
discard_it :: TcM ([SDoc], Bool)
discard_it = DynFlags
-> Maybe Int
-> TyCoVarSet
-> [SDoc]
-> Bool
-> TcBinderStack
-> TcM ([SDoc], Bool)
go DynFlags
dflags Maybe Int
n_left TyCoVarSet
tvs_seen [SDoc]
docs
Bool
discards TcBinderStack
tc_bndrs
go2 :: Name -> TopLevelFlag -> TcM ([SDoc], Bool)
go2 Name
id_name TopLevelFlag
top_lvl
= do { let tidy_ty :: Type
tidy_ty = case forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv NameEnv Type
lcl_name_env Name
id_name of
Just Type
tty -> Type
tty
Maybe Type
Nothing -> forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"relevant_bindings" (forall a. Outputable a => a -> SDoc
ppr Name
id_name)
; String -> SDoc -> TcM ()
traceTc String
"relevantBindings 1" (forall a. Outputable a => a -> SDoc
ppr Name
id_name SDoc -> SDoc -> SDoc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Type
tidy_ty)
; let id_tvs :: TyCoVarSet
id_tvs = Type -> TyCoVarSet
tyCoVarsOfType Type
tidy_ty
doc :: SDoc
doc = [SDoc] -> SDoc
sep [ forall a. OutputableBndr a => a -> SDoc
pprPrefixOcc Name
id_name SDoc -> SDoc -> SDoc
<+> SDoc
dcolon SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr Type
tidy_ty
, Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc
parens (String -> SDoc
text String
"bound at"
SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr (forall a. NamedThing a => a -> SrcLoc
getSrcLoc Name
id_name)))]
new_seen :: TyCoVarSet
new_seen = TyCoVarSet
tvs_seen TyCoVarSet -> TyCoVarSet -> TyCoVarSet
`unionVarSet` TyCoVarSet
id_tvs
; if (Bool
want_filtering Bool -> Bool -> Bool
&& Bool -> Bool
not (DynFlags -> Bool
hasPprDebug DynFlags
dflags)
Bool -> Bool -> Bool
&& TyCoVarSet
id_tvs TyCoVarSet -> TyCoVarSet -> Bool
`disjointVarSet` TyCoVarSet
ct_tvs)
then TcM ([SDoc], Bool)
discard_it
else if TopLevelFlag -> Bool
isTopLevel TopLevelFlag
top_lvl Bool -> Bool -> Bool
&& Bool -> Bool
not (forall a. Maybe a -> Bool
isNothing Maybe Int
n_left)
then TcM ([SDoc], Bool)
discard_it
else if Maybe Int -> Bool
run_out Maybe Int
n_left Bool -> Bool -> Bool
&& TyCoVarSet
id_tvs TyCoVarSet -> TyCoVarSet -> Bool
`subVarSet` TyCoVarSet
tvs_seen
then DynFlags
-> Maybe Int
-> TyCoVarSet
-> [SDoc]
-> Bool
-> TcBinderStack
-> TcM ([SDoc], Bool)
go DynFlags
dflags Maybe Int
n_left TyCoVarSet
tvs_seen [SDoc]
docs
Bool
True
TcBinderStack
tc_bndrs
else DynFlags
-> Maybe Int
-> TyCoVarSet
-> [SDoc]
-> Bool
-> TcBinderStack
-> TcM ([SDoc], Bool)
go DynFlags
dflags (Maybe Int -> Maybe Int
dec_max Maybe Int
n_left) TyCoVarSet
new_seen
(SDoc
docforall a. a -> [a] -> [a]
:[SDoc]
docs) Bool
discards TcBinderStack
tc_bndrs }
discardMsg :: SDoc
discardMsg :: SDoc
discardMsg = String -> SDoc
text String
"(Some bindings suppressed;" SDoc -> SDoc -> SDoc
<+>
String -> SDoc
text String
"use -fmax-relevant-binds=N or -fno-max-relevant-binds)"
warnDefaulting :: [Ct] -> Type -> TcM ()
warnDefaulting :: [Ct] -> Type -> TcM ()
warnDefaulting [Ct]
wanteds Type
default_ty
= do { Bool
warn_default <- forall gbl lcl. WarningFlag -> TcRnIf gbl lcl Bool
woptM WarningFlag
Opt_WarnTypeDefaults
; TidyEnv
env0 <- TcM TidyEnv
tcInitTidyEnv
; let tidy_env :: TidyEnv
tidy_env = TidyEnv -> [TcId] -> TidyEnv
tidyFreeTyCoVars TidyEnv
env0 forall a b. (a -> b) -> a -> b
$
Cts -> [TcId]
tyCoVarsOfCtsList (forall a. [a] -> Bag a
listToBag [Ct]
wanteds)
tidy_wanteds :: [Ct]
tidy_wanteds = forall a b. (a -> b) -> [a] -> [b]
map (TidyEnv -> Ct -> Ct
tidyCt TidyEnv
tidy_env) [Ct]
wanteds
(CtLoc
loc, SDoc
ppr_wanteds) = [Ct] -> (CtLoc, SDoc)
pprWithArising [Ct]
tidy_wanteds
warn_msg :: SDoc
warn_msg =
SDoc -> Int -> SDoc -> SDoc
hang ([SDoc] -> SDoc
hsep [ String -> SDoc
text String
"Defaulting the following"
, String -> SDoc
text String
"constraint" SDoc -> SDoc -> SDoc
<> forall a. [a] -> SDoc
plural [Ct]
tidy_wanteds
, String -> SDoc
text String
"to type"
, SDoc -> SDoc
quotes (forall a. Outputable a => a -> SDoc
ppr Type
default_ty) ])
Int
2
SDoc
ppr_wanteds
; forall a. CtLoc -> TcM a -> TcM a
setCtLocM CtLoc
loc forall a b. (a -> b) -> a -> b
$ WarnReason -> Bool -> SDoc -> TcM ()
warnTc (WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnTypeDefaults) Bool
warn_default SDoc
warn_msg }
solverDepthErrorTcS :: CtLoc -> TcType -> TcM a
solverDepthErrorTcS :: forall a. CtLoc -> Type -> TcM a
solverDepthErrorTcS CtLoc
loc Type
ty
= forall a. CtLoc -> TcM a -> TcM a
setCtLocM CtLoc
loc forall a b. (a -> b) -> a -> b
$
do { Type
ty <- Type -> TcM Type
zonkTcType Type
ty
; TidyEnv
env0 <- TcM TidyEnv
tcInitTidyEnv
; let tidy_env :: TidyEnv
tidy_env = TidyEnv -> [TcId] -> TidyEnv
tidyFreeTyCoVars TidyEnv
env0 (Type -> [TcId]
tyCoVarsOfTypeList Type
ty)
tidy_ty :: Type
tidy_ty = TidyEnv -> Type -> Type
tidyType TidyEnv
tidy_env Type
ty
msg :: SDoc
msg
= [SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Reduction stack overflow; size =" SDoc -> SDoc -> SDoc
<+> forall a. Outputable a => a -> SDoc
ppr SubGoalDepth
depth
, SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"When simplifying the following type:")
Int
2 (forall a. Outputable a => a -> SDoc
ppr Type
tidy_ty)
, SDoc
note ]
; forall a. (TidyEnv, SDoc) -> TcM a
failWithTcM (TidyEnv
tidy_env, SDoc
msg) }
where
depth :: SubGoalDepth
depth = CtLoc -> SubGoalDepth
ctLocDepth CtLoc
loc
note :: SDoc
note = [SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"Use -freduction-depth=0 to disable this check"
, String -> SDoc
text String
"(any upper bound you could choose might fail unpredictably with"
, String -> SDoc
text String
" minor updates to GHC, so disabling the check is recommended if"
, String -> SDoc
text String
" you're sure that type checking should terminate)" ]