ghc-9.8.0.20230929: The GHC API
Safe HaskellNone
LanguageHaskell2010

GHC.Tc.Utils.TcMType

Description

Monadic type operations

This module contains monadic operations over types that contain mutable type variables.

Synopsis

Documentation

type TcTyVar = Var Source #

Type variable that might be a metavariable

newNamedFlexiTyVar :: FastString -> Kind -> TcM TcTyVar Source #

Create a new flexi ty var with a specific name

newOpenFlexiTyVarTy :: TcM TcType Source #

Create a tyvar that can be a lifted or unlifted type. Returns alpha :: TYPE kappa, where both alpha and kappa are fresh

newConcreteTyVar :: HasDebugCallStack => ConcreteTvOrigin -> FastString -> TcKind -> TcM TcTyVar Source #

Create a new metavariable, of the given kind, which can only be unified with a concrete type.

Invariant: the kind must be concrete, as per Note [ConcreteTv]. This is checked with an assertion.

writeMetaTyVar Source #

Arguments

:: HasDebugCallStack 
=> TcTyVar

the type varfiable to write to

-> TcType

the type to write into the mutable reference

-> ZonkM () 

Write into a currently-empty MetaTyVar.

Works with both type and kind variables.

writeMetaTyVarRef Source #

Arguments

:: HasDebugCallStack 
=> TcTyVar

for debug assertions only;

-> TcRef MetaDetails

ref cell must be for the same tyvar

-> TcType

the type to write to the mutable reference

-> ZonkM () 

Write into the MetaDetails mutable references of a MetaTv.

newWantedWithLoc :: CtLoc -> PredType -> TcM CtEvidence Source #

Create a new Wanted constraint with the given CtLoc.

newWanted :: CtOrigin -> Maybe TypeOrKind -> PredType -> TcM CtEvidence Source #

Create a new Wanted constraint with the given CtOrigin, and location information taken from the TcM environment.

newWanteds :: CtOrigin -> ThetaType -> TcM [CtEvidence] Source #

Create new Wanted constraints with the given CtOrigin, and location information taken from the TcM environment.

emitWanted :: CtOrigin -> TcPredType -> TcM EvTerm Source #

Emits a new Wanted. Deals with both equalities and non-equalities.

emitWantedEq :: CtOrigin -> TypeOrKind -> Role -> TcType -> TcType -> TcM Coercion Source #

Emits a new equality constraint

emitWantedEvVar :: CtOrigin -> TcPredType -> TcM EvVar Source #

Creates a new EvVar and immediately emits it as a Wanted. No equality predicates here.

newNoTcEvBinds :: TcM EvBindsVar Source #

Creates an EvBindsVar incapable of holding any bindings. It still tracks covar usages (see comments on ebv_tcvs in GHC.Tc.Types.Evidence), thus must be made monadically

emitNewExprHole :: RdrName -> Type -> TcM HoleExprRef Source #

Emit a new wanted expression hole

fillCoercionHole :: CoercionHole -> Coercion -> TcM () Source #

Put a value in a coercion hole

isFilledCoercionHole :: CoercionHole -> TcM Bool Source #

Is a coercion hole filled in?

unpackCoercionHole :: CoercionHole -> TcM Coercion Source #

Retrieve the contents of a coercion hole. Panics if the hole is unfilled

unpackCoercionHole_maybe :: CoercionHole -> TcM (Maybe Coercion) Source #

Retrieve the contents of a coercion hole, if it is filled

checkCoercionHole :: CoVar -> Coercion -> ZonkM Coercion Source #

Check that a coercion is appropriate for filling a hole. (The hole itself is needed only for printing.) Always returns the checked coercion, but this return value is necessary so that the input coercion is forced only when the output is forced.

newImplication :: TcM Implication Source #

Create a new Implication with as many sensible defaults for its fields as possible. Note that the ic_tclvl, ic_binds, and ic_info fields do not have sensible defaults, so they are initialized with lazy thunks that will panic if forced, so one should take care to initialize these fields after creation.

This is monadic to look up the TcLclEnv, which is used to initialize ic_env, and to set the -Winaccessible-code flag. See Note [Avoid -Winaccessible-code when deriving] in GHC.Tc.TyCl.Instance.

data ExpType Source #

An expected type to check against during type-checking. See Note [ExpType] in GHC.Tc.Utils.TcMType, where you'll also find manipulators.

Constructors

Check TcType 
Infer !InferResult 

Instances

Instances details
Outputable ExpType Source # 
Instance details

Defined in GHC.Tc.Utils.TcType

Methods

ppr :: ExpType -> SDoc Source #

mkCheckExpType :: TcType -> ExpType Source #

Make an ExpType suitable for checking.

tcInfer :: (ExpSigmaType -> TcM a) -> TcM (a, TcSigmaType) Source #

Infer a type using a fresh ExpType See also Note [ExpType] in GHC.Tc.Utils.TcMType

Use tcInferFRR if you require the type to have a fixed runtime representation.

tcInferFRR :: FixedRuntimeRepContext -> (ExpSigmaTypeFRR -> TcM a) -> TcM (a, TcSigmaTypeFRR) Source #

Like tcInfer, except it ensures that the resulting type has a syntactically fixed RuntimeRep as per Note [Fixed RuntimeRep] in GHC.Tc.Utils.Concrete.

readExpType :: MonadIO m => ExpType -> m TcType Source #

Extract a type out of an ExpType. Otherwise, panics.

readExpType_maybe :: MonadIO m => ExpType -> m (Maybe TcType) Source #

Extract a type out of an ExpType, if one exists. But one should always exist. Unless you're quite sure you know what you're doing.

readScaledExpType :: MonadIO m => Scaled ExpType -> m (Scaled Type) Source #

Same as readExpType, but for Scaled ExpTypes

expTypeToType :: ExpType -> TcM TcType Source #

Extracts the expected type if there is one, or generates a new TauTv if there isn't.

checkingExpType_maybe :: ExpType -> Maybe TcType Source #

Returns the expected type when in checking mode.

checkingExpType :: String -> ExpType -> TcType Source #

Returns the expected type when in checking mode. Panics if in inference mode.

tcCheckUsage :: Name -> Mult -> TcM a -> TcM (a, HsWrapper) Source #

tcCheckUsage name mult thing_inside runs thing_inside, checks that the usage of name is a submultiplicity of mult, and removes name from the usage environment. See also Note [Wrapper returned from tcSubMult] in GHC.Tc.Utils.Unify, which applies to the wrapper returned from this function.

defaultTyVar :: DefaultingStrategy -> TcTyVar -> TcM Bool Source #

Default a type variable using the given defaulting strategy.

See Note [Type variable defaulting options] in GHC.Types.Basic.

doNotQuantifyTyVars Source #

Arguments

:: CandidatesQTvs 
-> (TidyEnv -> ZonkM (TidyEnv, UninferrableTyVarCtx))

like "the class context (D a b, E foogle)"

-> TcM () 

candidateQTyVarsOfType :: TcType -> TcM CandidatesQTvs Source #

Gathers free variables to use as quantification candidates (in quantifyTyVars). This might output the same var in both sets, if it's used in both a type and a kind. The variables to quantify must have a TcLevel strictly greater than the ambient level. (See Wrinkle in Note [Naughty quantification candidates]) See Note [CandidatesQTvs determinism and order] See Note [Dependent type variables]

candidateQTyVarsOfKind :: TcKind -> TcM CandidatesQTvs Source #

Like candidateQTyVarsOfType, but consider every free variable to be dependent. This is appropriate when generalizing a *kind*, instead of a type. (That way, -XNoPolyKinds will default the variables to Type.)

candidateQTyVarsOfTypes :: [Type] -> TcM CandidatesQTvs Source #

Like candidateQTyVarsOfType, but over a list of types The variables to quantify must have a TcLevel strictly greater than the ambient level. (See Wrinkle in Note [Naughty quantification candidates])

checkTypeHasFixedRuntimeRep :: FixedRuntimeRepProvenance -> Type -> TcM () Source #

Check that the specified type has a fixed runtime representation.

If it isn't, throw a representation-polymorphism error appropriate for the context (as specified by the FixedRuntimeRepProvenance).

Unlike the other representation polymorphism checks, which can emit new Wanted constraints to be solved by the constraint solver, this function does not emit any constraints: it has enough information to immediately make a decision.

See (1) in Note [Representation polymorphism checking] in GHC.Tc.Utils.Concrete

Other HsSyn functions

mkHsApp :: forall (id :: Pass). LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id) Source #

mkHsAppTy :: forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p) -> LHsType (GhcPass p) Source #

mkHsCaseAlt :: forall (p :: Pass) body. (Anno (GRHS (GhcPass p) (LocatedA (body (GhcPass p)))) ~ SrcAnn NoEpAnns, Anno (Match (GhcPass p) (LocatedA (body (GhcPass p)))) ~ SrcSpanAnnA) => LPat (GhcPass p) -> LocatedA (body (GhcPass p)) -> LMatch (GhcPass p) (LocatedA (body (GhcPass p))) Source #

A simple case alternative with a single pattern, no binds, no guards; pre-typechecking

conLikeResTy :: ConLike -> [Type] -> Type Source #

Returns the type of the whole pattern