2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[TcType]{Types used in the typechecker}
6 This module provides the Type interface for front-end parts of the
9 * treat "source types" as opaque:
10 newtypes, and predicates are meaningful.
11 * look through usage types
13 The "tc" prefix is for "typechechecker", because the type checker
14 is the principal client.
18 --------------------------------
20 TcType, TcSigmaType, TcRhoType, TcTauType, TcPredType, TcThetaType,
21 TcTyVar, TcTyVarSet, TcKind,
23 BoxyTyVar, BoxySigmaType, BoxyRhoType, BoxyThetaType, BoxyType,
25 --------------------------------
27 UserTypeCtxt(..), pprUserTypeCtxt,
28 TcTyVarDetails(..), BoxInfo(..), pprTcTyVarDetails,
29 MetaDetails(Flexi, Indirect), SkolemInfo(..), pprSkolTvBinding, pprSkolInfo,
30 isImmutableTyVar, isSkolemTyVar, isMetaTyVar, isBoxyTyVar, isSigTyVar, isExistentialTyVar,
34 --------------------------------
38 --------------------------------
40 -- These are important because they do not look through newtypes
42 tcSplitForAllTys, tcSplitPhiTy,
43 tcSplitFunTy_maybe, tcSplitFunTys, tcFunArgTy, tcFunResultTy, tcSplitFunTysN,
44 tcSplitTyConApp, tcSplitTyConApp_maybe, tcTyConAppTyCon, tcTyConAppArgs,
45 tcSplitAppTy_maybe, tcSplitAppTy, tcSplitAppTys, repSplitAppTy_maybe,
46 tcValidInstHeadTy, tcGetTyVar_maybe, tcGetTyVar,
47 tcSplitSigmaTy, tcMultiSplitSigmaTy,
49 ---------------------------------
51 -- Again, newtypes are opaque
52 tcEqType, tcEqTypes, tcEqPred, tcCmpType, tcCmpTypes, tcCmpPred, tcEqTypeX,
54 isSigmaTy, isOverloadedTy, isRigidTy, isBoxyTy,
55 isDoubleTy, isFloatTy, isIntTy, isStringTy,
56 isIntegerTy, isBoolTy, isUnitTy,
57 isTauTy, isTauTyCon, tcIsTyVarTy, tcIsForAllTy,
59 ---------------------------------
60 -- Misc type manipulators
61 deNoteType, classesOfTheta,
62 tyClsNamesOfType, tyClsNamesOfDFunHead,
65 ---------------------------------
67 getClassPredTys_maybe, getClassPredTys,
68 isClassPred, isTyVarClassPred, isEqPred,
69 mkDictTy, tcSplitPredTy_maybe,
70 isPredTy, isDictTy, tcSplitDFunTy, tcSplitDFunHead, predTyUnique,
71 mkClassPred, isInheritablePred, isLinearPred, isIPPred, mkPredName,
72 dataConsStupidTheta, isRefineableTy,
74 ---------------------------------
75 -- Foreign import and export
76 isFFIArgumentTy, -- :: DynFlags -> Safety -> Type -> Bool
77 isFFIImportResultTy, -- :: DynFlags -> Type -> Bool
78 isFFIExportResultTy, -- :: Type -> Bool
79 isFFIExternalTy, -- :: Type -> Bool
80 isFFIDynArgumentTy, -- :: Type -> Bool
81 isFFIDynResultTy, -- :: Type -> Bool
82 isFFILabelTy, -- :: Type -> Bool
83 isFFIDotnetTy, -- :: DynFlags -> Type -> Bool
84 isFFIDotnetObjTy, -- :: Type -> Bool
85 isFFITy, -- :: Type -> Bool
86 tcSplitIOType_maybe, -- :: Type -> Maybe Type
87 toDNType, -- :: Type -> DNType
89 --------------------------------
90 -- Rexported from Type
91 Kind, -- Stuff to do with kinds is insensitive to pre/post Tc
92 unliftedTypeKind, liftedTypeKind, argTypeKind,
93 openTypeKind, mkArrowKind, mkArrowKinds,
94 isLiftedTypeKind, isUnliftedTypeKind, isSubOpenTypeKind,
95 isSubArgTypeKind, isSubKind, defaultKind,
96 kindVarRef, mkKindVar,
98 Type, PredType(..), ThetaType,
99 mkForAllTy, mkForAllTys,
100 mkFunTy, mkFunTys, zipFunTys,
101 mkTyConApp, mkAppTy, mkAppTys, applyTy, applyTys,
102 mkTyVarTy, mkTyVarTys, mkTyConTy, mkPredTy, mkPredTys,
104 -- Type substitutions
105 TvSubst(..), -- Representation visible to a few friends
106 TvSubstEnv, emptyTvSubst, substEqSpec,
107 mkOpenTvSubst, zipOpenTvSubst, zipTopTvSubst, mkTopTvSubst, notElemTvSubst,
108 getTvSubstEnv, setTvSubstEnv, getTvInScope, extendTvInScope, lookupTyVar,
109 extendTvSubst, extendTvSubstList, isInScope, mkTvSubst, zipTyEnv,
110 substTy, substTys, substTyWith, substTheta, substTyVar, substTyVarBndr,
112 isUnLiftedType, -- Source types are always lifted
113 isUnboxedTupleType, -- Ditto
116 tidyTopType, tidyType, tidyPred, tidyTypes, tidyFreeTyVars, tidyOpenType, tidyOpenTypes,
117 tidyTyVarBndr, tidyOpenTyVar, tidyOpenTyVars, tidySkolemTyVar,
120 tyVarsOfType, tyVarsOfTypes, tyVarsOfPred, tyVarsOfTheta,
121 tcTyVarsOfType, tcTyVarsOfTypes, exactTyVarsOfType, exactTyVarsOfTypes,
123 pprKind, pprParendKind,
124 pprType, pprParendType, pprTyThingCategory,
125 pprPred, pprTheta, pprThetaArrow, pprClassPred
129 #include "HsVersions.h"
132 import TypeRep ( Type(..), funTyCon, Kind ) -- friend
134 import Type ( -- Re-exports
135 tyVarsOfType, tyVarsOfTypes, tyVarsOfPred,
136 tyVarsOfTheta, Kind, PredType(..), KindVar,
137 ThetaType, isUnliftedTypeKind, unliftedTypeKind,
139 liftedTypeKind, openTypeKind, mkArrowKind,
140 tySuperKind, isLiftedTypeKind,
141 mkArrowKinds, mkForAllTy, mkForAllTys,
142 defaultKind, isSubArgTypeKind, isSubOpenTypeKind,
143 mkFunTy, mkFunTys, zipFunTys,
145 mkAppTys, applyTy, applyTys,
146 mkTyVarTy, mkTyVarTys, mkTyConTy, mkPredTy,
147 mkPredTys, isUnLiftedType,
148 isUnboxedTupleType, isPrimitiveType,
150 tidyTopType, tidyType, tidyPred, tidyTypes,
151 tidyFreeTyVars, tidyOpenType, tidyOpenTypes,
152 tidyTyVarBndr, tidyOpenTyVar,
153 tidyOpenTyVars, tidyKind,
156 tcEqType, tcEqTypes, tcCmpType, tcCmpTypes,
157 tcEqPred, tcCmpPred, tcEqTypeX, eqKind,
160 TvSubstEnv, emptyTvSubst, mkTvSubst, zipTyEnv,
161 mkOpenTvSubst, zipOpenTvSubst, zipTopTvSubst, mkTopTvSubst,
162 getTvSubstEnv, setTvSubstEnv, getTvInScope, extendTvInScope,
163 extendTvSubst, extendTvSubstList, isInScope, notElemTvSubst,
164 substTy, substTys, substTyWith, substTheta,
165 substTyVar, substTyVarBndr, substPred, lookupTyVar,
167 typeKind, repType, coreView, repSplitAppTy_maybe,
168 pprKind, pprParendKind,
169 pprType, pprParendType, pprTyThingCategory,
170 pprPred, pprTheta, pprThetaArrow, pprClassPred
172 import TyCon ( TyCon, isUnLiftedTyCon, isSynTyCon, synTyConDefn, tyConUnique )
173 import DataCon ( DataCon, dataConStupidTheta, dataConResTys )
174 import Class ( Class )
175 import Var ( TyVar, Id, isTcTyVar, mkTcTyVar, tyVarName, tyVarKind, tcTyVarDetails )
176 import ForeignCall ( Safety, DNType(..) )
177 import Unify ( tcMatchTys )
181 import DynFlags ( DynFlags, DynFlag( Opt_GlasgowExts ), dopt )
182 import Name ( Name, NamedThing(..), mkInternalName, getSrcLoc, mkSystemName )
184 import VarEnv ( TidyEnv )
185 import OccName ( OccName, mkDictOcc, mkOccName, tvName )
186 import PrelNames -- Lots (e.g. in isFFIArgumentTy)
187 import TysWiredIn ( unitTyCon, charTyCon, listTyCon )
188 import BasicTypes ( IPName(..), Arity, ipNameName )
189 import SrcLoc ( SrcLoc, SrcSpan )
190 import Util ( snocView, equalLength )
191 import Maybes ( maybeToBool, expectJust, mapCatMaybes )
192 import ListSetOps ( hasNoDups )
193 import List ( nubBy )
199 %************************************************************************
203 %************************************************************************
205 The type checker divides the generic Type world into the
206 following more structured beasts:
208 sigma ::= forall tyvars. phi
209 -- A sigma type is a qualified type
211 -- Note that even if 'tyvars' is empty, theta
212 -- may not be: e.g. (?x::Int) => Int
214 -- Note that 'sigma' is in prenex form:
215 -- all the foralls are at the front.
216 -- A 'phi' type has no foralls to the right of
224 -- A 'tau' type has no quantification anywhere
225 -- Note that the args of a type constructor must be taus
227 | tycon tau_1 .. tau_n
231 -- In all cases, a (saturated) type synonym application is legal,
232 -- provided it expands to the required form.
235 type TcTyVar = TyVar -- Used only during type inference
236 type TcType = Type -- A TcType can have mutable type variables
237 -- Invariant on ForAllTy in TcTypes:
239 -- a cannot occur inside a MutTyVar in T; that is,
240 -- T is "flattened" before quantifying over a
242 -- These types do not have boxy type variables in them
243 type TcPredType = PredType
244 type TcThetaType = ThetaType
245 type TcSigmaType = TcType
246 type TcRhoType = TcType
247 type TcTauType = TcType
249 type TcTyVarSet = TyVarSet
251 -- These types may have boxy type variables in them
252 type BoxyTyVar = TcTyVar
253 type BoxyRhoType = TcType
254 type BoxyThetaType = TcThetaType
255 type BoxySigmaType = TcType
256 type BoxyType = TcType
260 %************************************************************************
262 \subsection{TyVarDetails}
264 %************************************************************************
266 TyVarDetails gives extra info about type variables, used during type
267 checking. It's attached to mutable type variables only.
268 It's knot-tied back to Var.lhs. There is no reason in principle
269 why Var.lhs shouldn't actually have the definition, but it "belongs" here.
272 Note [Signature skolems]
273 ~~~~~~~~~~~~~~~~~~~~~~~~
278 (x,y,z) = ([y,z], z, head x)
280 Here, x and y have type sigs, which go into the environment. We used to
281 instantiate their types with skolem constants, and push those types into
282 the RHS, so we'd typecheck the RHS with type
284 where a*, b* are skolem constants, and c is an ordinary meta type varible.
286 The trouble is that the occurrences of z in the RHS force a* and b* to
287 be the *same*, so we can't make them into skolem constants that don't unify
288 with each other. Alas.
290 One solution would be insist that in the above defn the programmer uses
291 the same type variable in both type signatures. But that takes explanation.
293 The alternative (currently implemented) is to have a special kind of skolem
294 constant, SigTv, which can unify with other SigTvs. These are *not* treated
295 as righd for the purposes of GADTs. And they are used *only* for pattern
296 bindings and mutually recursive function bindings. See the function
297 TcBinds.tcInstSig, and its use_skols parameter.
301 -- A TyVarDetails is inside a TyVar
303 = SkolemTv SkolemInfo -- A skolem constant
305 | MetaTv BoxInfo (IORef MetaDetails)
308 = BoxTv -- The contents is a (non-boxy) sigma-type
309 -- That is, this MetaTv is a "box"
311 | TauTv -- The contents is a (non-boxy) tau-type
312 -- That is, this MetaTv is an ordinary unification variable
314 | SigTv SkolemInfo -- A variant of TauTv, except that it should not be
315 -- unified with a type, only with a type variable
316 -- SigTvs are only distinguished to improve error messages
317 -- see Note [Signature skolems]
318 -- The MetaDetails, if filled in, will
319 -- always be another SigTv or a SkolemTv
322 -- A TauTv is always filled in with a tau-type, which
323 -- never contains any BoxTvs, nor any ForAlls
325 -- However, a BoxTv can contain a type that contains further BoxTvs
326 -- Notably, when typechecking an explicit list, say [e1,e2], with
327 -- expected type being a box b1, we fill in b1 with (List b2), where
328 -- b2 is another (currently empty) box.
331 = Flexi -- Flexi type variables unify to become
334 | Indirect TcType -- INVARIANT:
335 -- For a BoxTv, this type must be non-boxy
336 -- For a TauTv, this type must be a tau-type
339 = SigSkol UserTypeCtxt -- A skolem that is created by instantiating
340 -- a programmer-supplied type signature
341 -- Location of the binding site is on the TyVar
343 -- The rest are for non-scoped skolems
344 | ClsSkol Class -- Bound at a class decl
345 | InstSkol Id -- Bound at an instance decl
346 | PatSkol DataCon -- An existential type variable bound by a pattern for
347 SrcSpan -- a data constructor with an existential type. E.g.
348 -- data T = forall a. Eq a => MkT a
350 -- The pattern MkT x will allocate an existential type
352 | ArrowSkol SrcSpan -- An arrow form (see TcArrows)
354 | GenSkol [TcTyVar] -- Bound when doing a subsumption check for
355 TcType -- (forall tvs. ty)
358 | UnkSkol -- Unhelpful info (until I improve it)
360 -------------------------------------
361 -- UserTypeCtxt describes the places where a
362 -- programmer-written type signature can occur
364 = FunSigCtxt Name -- Function type signature
365 -- Also used for types in SPECIALISE pragmas
366 | ExprSigCtxt -- Expression type signature
367 | ConArgCtxt Name -- Data constructor argument
368 | TySynCtxt Name -- RHS of a type synonym decl
369 | GenPatCtxt -- Pattern in generic decl
370 -- f{| a+b |} (Inl x) = ...
371 | LamPatSigCtxt -- Type sig in lambda pattern
373 | BindPatSigCtxt -- Type sig in pattern binding pattern
375 | ResSigCtxt -- Result type sig
377 | ForSigCtxt Name -- Foreign inport or export signature
378 | RuleSigCtxt Name -- Signature on a forall'd variable in a RULE
379 | DefaultDeclCtxt -- Types in a default declaration
380 | SpecInstCtxt -- SPECIALISE instance pragma
382 -- Notes re TySynCtxt
383 -- We allow type synonyms that aren't types; e.g. type List = []
385 -- If the RHS mentions tyvars that aren't in scope, we'll
386 -- quantify over them:
387 -- e.g. type T = a->a
388 -- will become type T = forall a. a->a
390 -- With gla-exts that's right, but for H98 we should complain.
392 ---------------------------------
395 mkKindName :: Unique -> Name
396 mkKindName unique = mkSystemName unique kind_var_occ
398 kindVarRef :: KindVar -> IORef MetaDetails
400 case tcTyVarDetails tc of
401 MetaTv TauTv ref -> ref
402 other -> pprPanic "kindVarRef" (ppr tc)
404 mkKindVar :: Unique -> IORef MetaDetails -> KindVar
406 = mkTcTyVar (mkKindName u)
407 tySuperKind -- not sure this is right,
408 -- do we need kind vars for
412 kind_var_occ :: OccName -- Just one for all KindVars
413 -- They may be jiggled by tidying
414 kind_var_occ = mkOccName tvName "k"
418 %************************************************************************
422 %************************************************************************
425 pprTcTyVarDetails :: TcTyVarDetails -> SDoc
427 pprTcTyVarDetails (SkolemTv _) = ptext SLIT("sk")
428 pprTcTyVarDetails (MetaTv BoxTv _) = ptext SLIT("box")
429 pprTcTyVarDetails (MetaTv TauTv _) = ptext SLIT("tau")
430 pprTcTyVarDetails (MetaTv (SigTv _) _) = ptext SLIT("sig")
432 pprUserTypeCtxt :: UserTypeCtxt -> SDoc
433 pprUserTypeCtxt (FunSigCtxt n) = ptext SLIT("the type signature for") <+> quotes (ppr n)
434 pprUserTypeCtxt ExprSigCtxt = ptext SLIT("an expression type signature")
435 pprUserTypeCtxt (ConArgCtxt c) = ptext SLIT("the type of the constructor") <+> quotes (ppr c)
436 pprUserTypeCtxt (TySynCtxt c) = ptext SLIT("the RHS of the type synonym") <+> quotes (ppr c)
437 pprUserTypeCtxt GenPatCtxt = ptext SLIT("the type pattern of a generic definition")
438 pprUserTypeCtxt LamPatSigCtxt = ptext SLIT("a pattern type signature")
439 pprUserTypeCtxt BindPatSigCtxt = ptext SLIT("a pattern type signature")
440 pprUserTypeCtxt ResSigCtxt = ptext SLIT("a result type signature")
441 pprUserTypeCtxt (ForSigCtxt n) = ptext SLIT("the foreign declaration for") <+> quotes (ppr n)
442 pprUserTypeCtxt (RuleSigCtxt n) = ptext SLIT("the type signature for") <+> quotes (ppr n)
443 pprUserTypeCtxt DefaultDeclCtxt = ptext SLIT("a type in a `default' declaration")
444 pprUserTypeCtxt SpecInstCtxt = ptext SLIT("a SPECIALISE instance pragma")
447 --------------------------------
448 tidySkolemTyVar :: TidyEnv -> TcTyVar -> (TidyEnv, TcTyVar)
449 -- Tidy the type inside a GenSkol, preparatory to printing it
450 tidySkolemTyVar env tv
451 = ASSERT( isSkolemTyVar tv || isSigTyVar tv )
452 (env1, mkTcTyVar (tyVarName tv) (tyVarKind tv) info1)
454 (env1, info1) = case tcTyVarDetails tv of
455 SkolemTv info -> (env1, SkolemTv info')
457 (env1, info') = tidy_skol_info env info
458 MetaTv (SigTv info) box -> (env1, MetaTv (SigTv info') box)
460 (env1, info') = tidy_skol_info env info
463 tidy_skol_info env (GenSkol tvs ty loc) = (env2, GenSkol tvs1 ty1 loc)
465 (env1, tvs1) = tidyOpenTyVars env tvs
466 (env2, ty1) = tidyOpenType env1 ty
467 tidy_skol_info env info = (env, info)
469 pprSkolTvBinding :: TcTyVar -> SDoc
470 -- Print info about the binding of a skolem tyvar,
471 -- or nothing if we don't have anything useful to say
473 = ppr_details (tcTyVarDetails tv)
475 ppr_details (MetaTv TauTv _) = quotes (ppr tv) <+> ptext SLIT("is a meta type variable")
476 ppr_details (MetaTv BoxTv _) = quotes (ppr tv) <+> ptext SLIT("is a boxy type variable")
477 ppr_details (MetaTv (SigTv info) _) = ppr_skol info
478 ppr_details (SkolemTv info) = ppr_skol info
480 ppr_skol UnkSkol = empty -- Unhelpful; omit
481 ppr_skol (SigSkol ctxt) = sep [quotes (ppr tv) <+> ptext SLIT("is bound by") <+> pprUserTypeCtxt ctxt,
482 nest 2 (ptext SLIT("at") <+> ppr (getSrcLoc tv))]
483 ppr_skol info = quotes (ppr tv) <+> pprSkolInfo info
485 pprSkolInfo :: SkolemInfo -> SDoc
486 pprSkolInfo (SigSkol ctxt) = ptext SLIT("is bound by") <+> pprUserTypeCtxt ctxt
487 pprSkolInfo (ClsSkol cls) = ptext SLIT("is bound by the class declaration for") <+> quotes (ppr cls)
488 pprSkolInfo (InstSkol df) = ptext SLIT("is bound by the instance declaration at") <+> ppr (getSrcLoc df)
489 pprSkolInfo (ArrowSkol loc) = ptext SLIT("is bound by the arrow form at") <+> ppr loc
490 pprSkolInfo (PatSkol dc loc) = sep [ptext SLIT("is bound by the pattern for") <+> quotes (ppr dc),
491 nest 2 (ptext SLIT("at") <+> ppr loc)]
492 pprSkolInfo (GenSkol tvs ty loc) = sep [sep [ptext SLIT("is bound by the polymorphic type"),
493 nest 2 (quotes (ppr (mkForAllTys tvs ty)))],
494 nest 2 (ptext SLIT("at") <+> ppr loc)]
496 -- For type variables the others are dealt with by pprSkolTvBinding.
497 -- For Insts, these cases should not happen
498 pprSkolInfo UnkSkol = panic "UnkSkol"
500 instance Outputable MetaDetails where
501 ppr Flexi = ptext SLIT("Flexi")
502 ppr (Indirect ty) = ptext SLIT("Indirect") <+> ppr ty
506 %************************************************************************
510 %************************************************************************
513 isImmutableTyVar, isSkolemTyVar, isExistentialTyVar, isBoxyTyVar, isMetaTyVar :: TyVar -> Bool
515 | isTcTyVar tv = isSkolemTyVar tv
519 = ASSERT( isTcTyVar tv )
520 case tcTyVarDetails tv of
524 isExistentialTyVar tv -- Existential type variable, bound by a pattern
525 = ASSERT( isTcTyVar tv )
526 case tcTyVarDetails tv of
527 SkolemTv (PatSkol _ _) -> True
531 = ASSERT2( isTcTyVar tv, ppr tv )
532 case tcTyVarDetails tv of
537 = ASSERT( isTcTyVar tv )
538 case tcTyVarDetails tv of
539 MetaTv BoxTv _ -> True
543 = ASSERT( isTcTyVar tv )
544 case tcTyVarDetails tv of
545 MetaTv (SigTv _) _ -> True
548 metaTvRef :: TyVar -> IORef MetaDetails
550 = ASSERT( isTcTyVar tv )
551 case tcTyVarDetails tv of
553 other -> pprPanic "metaTvRef" (ppr tv)
555 isFlexi, isIndirect :: MetaDetails -> Bool
557 isFlexi other = False
559 isIndirect (Indirect _) = True
560 isIndirect other = False
564 %************************************************************************
566 \subsection{Tau, sigma and rho}
568 %************************************************************************
571 mkSigmaTy :: [TyVar] -> [PredType] -> Type -> Type
572 mkSigmaTy tyvars theta tau = mkForAllTys tyvars (mkPhiTy theta tau)
574 mkPhiTy :: [PredType] -> Type -> Type
575 mkPhiTy theta ty = foldr (\p r -> FunTy (mkPredTy p) r) ty theta
578 @isTauTy@ tests for nested for-alls. It should not be called on a boxy type.
581 isTauTy :: Type -> Bool
582 isTauTy ty | Just ty' <- tcView ty = isTauTy ty'
583 isTauTy (TyVarTy tv) = ASSERT( not (isTcTyVar tv && isBoxyTyVar tv) )
585 isTauTy (TyConApp tc tys) = all isTauTy tys && isTauTyCon tc
586 isTauTy (AppTy a b) = isTauTy a && isTauTy b
587 isTauTy (FunTy a b) = isTauTy a && isTauTy b
588 isTauTy (PredTy p) = True -- Don't look through source types
589 isTauTy other = False
592 isTauTyCon :: TyCon -> Bool
593 -- Returns False for type synonyms whose expansion is a polytype
594 isTauTyCon tc | isSynTyCon tc = isTauTy (snd (synTyConDefn tc))
598 isBoxyTy :: TcType -> Bool
599 isBoxyTy ty = any isBoxyTyVar (varSetElems (tcTyVarsOfType ty))
601 isRigidTy :: TcType -> Bool
602 -- A type is rigid if it has no meta type variables in it
603 isRigidTy ty = all isSkolemTyVar (varSetElems (tcTyVarsOfType ty))
605 isRefineableTy :: TcType -> Bool
606 -- A type should have type refinements applied to it if it has
607 -- free type variables, and they are all rigid
608 isRefineableTy ty = not (null tc_tvs) && all isSkolemTyVar tc_tvs
610 tc_tvs = varSetElems (tcTyVarsOfType ty)
613 getDFunTyKey :: Type -> OccName -- Get some string from a type, to be used to
614 -- construct a dictionary function name
615 getDFunTyKey ty | Just ty' <- tcView ty = getDFunTyKey ty'
616 getDFunTyKey (TyVarTy tv) = getOccName tv
617 getDFunTyKey (TyConApp tc _) = getOccName tc
618 getDFunTyKey (AppTy fun _) = getDFunTyKey fun
619 getDFunTyKey (FunTy arg _) = getOccName funTyCon
620 getDFunTyKey (ForAllTy _ t) = getDFunTyKey t
621 getDFunTyKey ty = pprPanic "getDFunTyKey" (pprType ty)
622 -- PredTy shouldn't happen
626 %************************************************************************
628 \subsection{Expanding and splitting}
630 %************************************************************************
632 These tcSplit functions are like their non-Tc analogues, but
633 a) they do not look through newtypes
634 b) they do not look through PredTys
635 c) [future] they ignore usage-type annotations
637 However, they are non-monadic and do not follow through mutable type
638 variables. It's up to you to make sure this doesn't matter.
641 tcSplitForAllTys :: Type -> ([TyVar], Type)
642 tcSplitForAllTys ty = split ty ty []
644 split orig_ty ty tvs | Just ty' <- tcView ty = split orig_ty ty' tvs
645 split orig_ty (ForAllTy tv ty) tvs = split ty ty (tv:tvs)
646 split orig_ty t tvs = (reverse tvs, orig_ty)
648 tcIsForAllTy ty | Just ty' <- tcView ty = tcIsForAllTy ty'
649 tcIsForAllTy (ForAllTy tv ty) = True
650 tcIsForAllTy t = False
652 tcSplitPhiTy :: Type -> (ThetaType, Type)
653 tcSplitPhiTy ty = split ty ty []
655 split orig_ty ty tvs | Just ty' <- tcView ty = split orig_ty ty' tvs
656 split orig_ty (FunTy arg res) ts
657 | Just p <- tcSplitPredTy_maybe arg = split res res (p:ts)
658 split orig_ty ty ts = (reverse ts, orig_ty)
660 tcSplitSigmaTy :: Type -> ([TyVar], ThetaType, Type)
661 tcSplitSigmaTy ty = case tcSplitForAllTys ty of
662 (tvs, rho) -> case tcSplitPhiTy rho of
663 (theta, tau) -> (tvs, theta, tau)
665 -----------------------
668 -> ( [([TyVar], ThetaType)], -- forall as.C => forall bs.D
669 TcSigmaType) -- The rest of the type
671 -- We need a loop here because we are now prepared to entertain
673 -- f:: forall a. Eq a => forall b. Baz b => tau
674 -- We want to instantiate this to
675 -- f2::tau {f2 = f1 b (Baz b), f1 = f a (Eq a)}
677 tcMultiSplitSigmaTy sigma
678 = case (tcSplitSigmaTy sigma) of
679 ([],[],ty) -> ([], sigma)
680 (tvs, theta, ty) -> case tcMultiSplitSigmaTy ty of
681 (pairs, rest) -> ((tvs,theta):pairs, rest)
683 -----------------------
684 tcTyConAppTyCon :: Type -> TyCon
685 tcTyConAppTyCon ty = fst (tcSplitTyConApp ty)
687 tcTyConAppArgs :: Type -> [Type]
688 tcTyConAppArgs ty = snd (tcSplitTyConApp ty)
690 tcSplitTyConApp :: Type -> (TyCon, [Type])
691 tcSplitTyConApp ty = case tcSplitTyConApp_maybe ty of
693 Nothing -> pprPanic "tcSplitTyConApp" (pprType ty)
695 tcSplitTyConApp_maybe :: Type -> Maybe (TyCon, [Type])
696 tcSplitTyConApp_maybe ty | Just ty' <- tcView ty = tcSplitTyConApp_maybe ty'
697 tcSplitTyConApp_maybe (TyConApp tc tys) = Just (tc, tys)
698 tcSplitTyConApp_maybe (FunTy arg res) = Just (funTyCon, [arg,res])
699 -- Newtypes are opaque, so they may be split
700 -- However, predicates are not treated
701 -- as tycon applications by the type checker
702 tcSplitTyConApp_maybe other = Nothing
704 -----------------------
705 tcSplitFunTys :: Type -> ([Type], Type)
706 tcSplitFunTys ty = case tcSplitFunTy_maybe ty of
708 Just (arg,res) -> (arg:args, res')
710 (args,res') = tcSplitFunTys res
712 tcSplitFunTy_maybe :: Type -> Maybe (Type, Type)
713 tcSplitFunTy_maybe ty | Just ty' <- tcView ty = tcSplitFunTy_maybe ty'
714 tcSplitFunTy_maybe (FunTy arg res) = Just (arg, res)
715 tcSplitFunTy_maybe other = Nothing
719 -> Arity -- N: Number of desired args
720 -> ([TcSigmaType], -- Arg types (N or fewer)
721 TcSigmaType) -- The rest of the type
723 tcSplitFunTysN ty n_args
726 | Just (arg,res) <- tcSplitFunTy_maybe ty
727 = case tcSplitFunTysN res (n_args - 1) of
728 (args, res) -> (arg:args, res)
732 tcSplitFunTy ty = expectJust "tcSplitFunTy" (tcSplitFunTy_maybe ty)
733 tcFunArgTy ty = fst (tcSplitFunTy ty)
734 tcFunResultTy ty = snd (tcSplitFunTy ty)
736 -----------------------
737 tcSplitAppTy_maybe :: Type -> Maybe (Type, Type)
738 tcSplitAppTy_maybe ty | Just ty' <- tcView ty = tcSplitAppTy_maybe ty'
739 tcSplitAppTy_maybe ty = repSplitAppTy_maybe ty
741 tcSplitAppTy :: Type -> (Type, Type)
742 tcSplitAppTy ty = case tcSplitAppTy_maybe ty of
744 Nothing -> pprPanic "tcSplitAppTy" (pprType ty)
746 tcSplitAppTys :: Type -> (Type, [Type])
750 go ty args = case tcSplitAppTy_maybe ty of
751 Just (ty', arg) -> go ty' (arg:args)
754 -----------------------
755 tcGetTyVar_maybe :: Type -> Maybe TyVar
756 tcGetTyVar_maybe ty | Just ty' <- tcView ty = tcGetTyVar_maybe ty'
757 tcGetTyVar_maybe (TyVarTy tv) = Just tv
758 tcGetTyVar_maybe other = Nothing
760 tcGetTyVar :: String -> Type -> TyVar
761 tcGetTyVar msg ty = expectJust msg (tcGetTyVar_maybe ty)
763 tcIsTyVarTy :: Type -> Bool
764 tcIsTyVarTy ty = maybeToBool (tcGetTyVar_maybe ty)
766 -----------------------
767 tcSplitDFunTy :: Type -> ([TyVar], [PredType], Class, [Type])
768 -- Split the type of a dictionary function
770 = case tcSplitSigmaTy ty of { (tvs, theta, tau) ->
771 case tcSplitDFunHead tau of { (clas, tys) ->
772 (tvs, theta, clas, tys) }}
774 tcSplitDFunHead :: Type -> (Class, [Type])
776 = case tcSplitPredTy_maybe tau of
777 Just (ClassP clas tys) -> (clas, tys)
778 other -> panic "tcSplitDFunHead"
780 tcValidInstHeadTy :: Type -> Bool
781 -- Used in Haskell-98 mode, for the argument types of an instance head
782 -- These must not be type synonyms, but everywhere else type synonyms
783 -- are transparent, so we need a special function here
786 NoteTy _ ty -> tcValidInstHeadTy ty
787 TyConApp tc tys -> not (isSynTyCon tc) && ok tys
788 FunTy arg res -> ok [arg, res]
791 -- Check that all the types are type variables,
792 -- and that each is distinct
793 ok tys = equalLength tvs tys && hasNoDups tvs
795 tvs = mapCatMaybes get_tv tys
797 get_tv (NoteTy _ ty) = get_tv ty -- Again, do not look
798 get_tv (TyVarTy tv) = Just tv -- through synonyms
799 get_tv other = Nothing
804 %************************************************************************
806 \subsection{Predicate types}
808 %************************************************************************
811 tcSplitPredTy_maybe :: Type -> Maybe PredType
812 -- Returns Just for predicates only
813 tcSplitPredTy_maybe ty | Just ty' <- tcView ty = tcSplitPredTy_maybe ty'
814 tcSplitPredTy_maybe (PredTy p) = Just p
815 tcSplitPredTy_maybe other = Nothing
817 predTyUnique :: PredType -> Unique
818 predTyUnique (IParam n _) = getUnique (ipNameName n)
819 predTyUnique (ClassP clas tys) = getUnique clas
821 mkPredName :: Unique -> SrcLoc -> PredType -> Name
822 mkPredName uniq loc (ClassP cls tys) = mkInternalName uniq (mkDictOcc (getOccName cls)) loc
823 mkPredName uniq loc (IParam ip ty) = mkInternalName uniq (getOccName (ipNameName ip)) loc
827 --------------------- Dictionary types ---------------------------------
830 mkClassPred clas tys = ClassP clas tys
832 isClassPred :: PredType -> Bool
833 isClassPred (ClassP clas tys) = True
834 isClassPred other = False
836 isTyVarClassPred (ClassP clas tys) = all tcIsTyVarTy tys
837 isTyVarClassPred other = False
839 getClassPredTys_maybe :: PredType -> Maybe (Class, [Type])
840 getClassPredTys_maybe (ClassP clas tys) = Just (clas, tys)
841 getClassPredTys_maybe _ = Nothing
843 getClassPredTys :: PredType -> (Class, [Type])
844 getClassPredTys (ClassP clas tys) = (clas, tys)
845 getClassPredTys other = panic "getClassPredTys"
847 isEqPred :: PredType -> Bool
848 isEqPred (EqPred {}) = True
851 mkDictTy :: Class -> [Type] -> Type
852 mkDictTy clas tys = mkPredTy (ClassP clas tys)
854 isDictTy :: Type -> Bool
855 isDictTy ty | Just ty' <- tcView ty = isDictTy ty'
856 isDictTy (PredTy p) = isClassPred p
857 isDictTy other = False
860 --------------------- Implicit parameters ---------------------------------
863 isIPPred :: PredType -> Bool
864 isIPPred (IParam _ _) = True
865 isIPPred other = False
867 isInheritablePred :: PredType -> Bool
868 -- Can be inherited by a context. For example, consider
869 -- f x = let g y = (?v, y+x)
870 -- in (g 3 with ?v = 8,
872 -- The point is that g's type must be quantifed over ?v:
873 -- g :: (?v :: a) => a -> a
874 -- but it doesn't need to be quantified over the Num a dictionary
875 -- which can be free in g's rhs, and shared by both calls to g
876 isInheritablePred (ClassP _ _) = True
877 isInheritablePred other = False
879 isLinearPred :: TcPredType -> Bool
880 isLinearPred (IParam (Linear n) _) = True
881 isLinearPred other = False
884 --------------------- Equality predicates ---------------------------------
886 substEqSpec :: TvSubst -> [(TyVar,Type)] -> [(TcType,TcType)]
887 substEqSpec subst eq_spec = [ (substTyVar subst tv, substTy subst ty)
888 | (tv,ty) <- eq_spec]
891 --------------------- The stupid theta (sigh) ---------------------------------
894 dataConsStupidTheta :: [DataCon] -> ThetaType
895 -- Union the stupid thetas from all the specified constructors (non-empty)
896 -- All the constructors should have the same result type, modulo alpha conversion
897 -- The resulting ThetaType uses type variables from the *first* constructor in the list
899 -- It's here because it's used in MkId.mkRecordSelId, and in TcExpr
900 dataConsStupidTheta (con1:cons)
901 = nubBy tcEqPred all_preds
903 all_preds = dataConStupidTheta con1 ++ other_stupids
904 res_tys1 = dataConResTys con1
905 tvs1 = tyVarsOfTypes res_tys1
906 other_stupids = [ substPred subst pred
908 , let Just subst = tcMatchTys tvs1 res_tys1 (dataConResTys con)
909 , pred <- dataConStupidTheta con ]
910 dataConsStupidTheta [] = panic "dataConsStupidTheta"
914 %************************************************************************
916 \subsection{Predicates}
918 %************************************************************************
920 isSigmaTy returns true of any qualified type. It doesn't *necessarily* have
922 f :: (?x::Int) => Int -> Int
925 isSigmaTy :: Type -> Bool
926 isSigmaTy ty | Just ty' <- tcView ty = isSigmaTy ty'
927 isSigmaTy (ForAllTy tyvar ty) = True
928 isSigmaTy (FunTy a b) = isPredTy a
931 isOverloadedTy :: Type -> Bool
932 isOverloadedTy ty | Just ty' <- tcView ty = isOverloadedTy ty'
933 isOverloadedTy (ForAllTy tyvar ty) = isOverloadedTy ty
934 isOverloadedTy (FunTy a b) = isPredTy a
935 isOverloadedTy _ = False
937 isPredTy :: Type -> Bool -- Belongs in TcType because it does
938 -- not look through newtypes, or predtypes (of course)
939 isPredTy ty | Just ty' <- tcView ty = isPredTy ty'
940 isPredTy (PredTy sty) = True
945 isFloatTy = is_tc floatTyConKey
946 isDoubleTy = is_tc doubleTyConKey
947 isIntegerTy = is_tc integerTyConKey
948 isIntTy = is_tc intTyConKey
949 isBoolTy = is_tc boolTyConKey
950 isUnitTy = is_tc unitTyConKey
952 is_tc :: Unique -> Type -> Bool
953 -- Newtypes are opaque to this
954 is_tc uniq ty = case tcSplitTyConApp_maybe ty of
955 Just (tc, _) -> uniq == getUnique tc
960 %************************************************************************
964 %************************************************************************
967 deNoteType :: Type -> Type
968 -- Remove all *outermost* type synonyms and other notes
969 deNoteType ty | Just ty' <- tcView ty = deNoteType ty'
974 tcTyVarsOfType :: Type -> TcTyVarSet
975 -- Just the *TcTyVars* free in the type
976 -- (Types.tyVarsOfTypes finds all free TyVars)
977 tcTyVarsOfType (TyVarTy tv) = if isTcTyVar tv then unitVarSet tv
979 tcTyVarsOfType (TyConApp tycon tys) = tcTyVarsOfTypes tys
980 tcTyVarsOfType (NoteTy _ ty) = tcTyVarsOfType ty
981 tcTyVarsOfType (PredTy sty) = tcTyVarsOfPred sty
982 tcTyVarsOfType (FunTy arg res) = tcTyVarsOfType arg `unionVarSet` tcTyVarsOfType res
983 tcTyVarsOfType (AppTy fun arg) = tcTyVarsOfType fun `unionVarSet` tcTyVarsOfType arg
984 tcTyVarsOfType (ForAllTy tyvar ty) = tcTyVarsOfType ty `delVarSet` tyvar
985 -- We do sometimes quantify over skolem TcTyVars
987 tcTyVarsOfTypes :: [Type] -> TyVarSet
988 tcTyVarsOfTypes tys = foldr (unionVarSet.tcTyVarsOfType) emptyVarSet tys
990 tcTyVarsOfPred :: PredType -> TyVarSet
991 tcTyVarsOfPred (IParam _ ty) = tcTyVarsOfType ty
992 tcTyVarsOfPred (ClassP _ tys) = tcTyVarsOfTypes tys
995 Note [Silly type synonym]
996 ~~~~~~~~~~~~~~~~~~~~~~~~~
999 What are the free tyvars of (T x)? Empty, of course!
1000 Here's the example that Ralf Laemmel showed me:
1001 foo :: (forall a. C u a -> C u a) -> u
1002 mappend :: Monoid u => u -> u -> u
1004 bar :: Monoid u => u
1005 bar = foo (\t -> t `mappend` t)
1006 We have to generalise at the arg to f, and we don't
1007 want to capture the constraint (Monad (C u a)) because
1008 it appears to mention a. Pretty silly, but it was useful to him.
1010 exactTyVarsOfType is used by the type checker to figure out exactly
1011 which type variables are mentioned in a type. It's also used in the
1012 smart-app checking code --- see TcExpr.tcIdApp
1015 exactTyVarsOfType :: TcType -> TyVarSet
1016 -- Find the free type variables (of any kind)
1017 -- but *expand* type synonyms. See Note [Silly type synonym] above.
1018 exactTyVarsOfType ty
1021 go ty | Just ty' <- tcView ty = go ty' -- This is the key line
1022 go (TyVarTy tv) = unitVarSet tv
1023 go (TyConApp tycon tys) = exactTyVarsOfTypes tys
1024 go (PredTy ty) = go_pred ty
1025 go (FunTy arg res) = go arg `unionVarSet` go res
1026 go (AppTy fun arg) = go fun `unionVarSet` go arg
1027 go (ForAllTy tyvar ty) = delVarSet (go ty) tyvar
1029 go_pred (IParam _ ty) = go ty
1030 go_pred (ClassP _ tys) = exactTyVarsOfTypes tys
1032 exactTyVarsOfTypes :: [TcType] -> TyVarSet
1033 exactTyVarsOfTypes tys = foldr (unionVarSet . exactTyVarsOfType) emptyVarSet tys
1036 Find the free tycons and classes of a type. This is used in the front
1037 end of the compiler.
1040 tyClsNamesOfType :: Type -> NameSet
1041 tyClsNamesOfType (TyVarTy tv) = emptyNameSet
1042 tyClsNamesOfType (TyConApp tycon tys) = unitNameSet (getName tycon) `unionNameSets` tyClsNamesOfTypes tys
1043 tyClsNamesOfType (NoteTy _ ty2) = tyClsNamesOfType ty2
1044 tyClsNamesOfType (PredTy (IParam n ty)) = tyClsNamesOfType ty
1045 tyClsNamesOfType (PredTy (ClassP cl tys)) = unitNameSet (getName cl) `unionNameSets` tyClsNamesOfTypes tys
1046 tyClsNamesOfType (FunTy arg res) = tyClsNamesOfType arg `unionNameSets` tyClsNamesOfType res
1047 tyClsNamesOfType (AppTy fun arg) = tyClsNamesOfType fun `unionNameSets` tyClsNamesOfType arg
1048 tyClsNamesOfType (ForAllTy tyvar ty) = tyClsNamesOfType ty
1050 tyClsNamesOfTypes tys = foldr (unionNameSets . tyClsNamesOfType) emptyNameSet tys
1052 tyClsNamesOfDFunHead :: Type -> NameSet
1053 -- Find the free type constructors and classes
1054 -- of the head of the dfun instance type
1055 -- The 'dfun_head_type' is because of
1056 -- instance Foo a => Baz T where ...
1057 -- The decl is an orphan if Baz and T are both not locally defined,
1058 -- even if Foo *is* locally defined
1059 tyClsNamesOfDFunHead dfun_ty
1060 = case tcSplitSigmaTy dfun_ty of
1061 (tvs,_,head_ty) -> tyClsNamesOfType head_ty
1063 classesOfTheta :: ThetaType -> [Class]
1064 -- Looks just for ClassP things; maybe it should check
1065 classesOfTheta preds = [ c | ClassP c _ <- preds ]
1069 %************************************************************************
1071 \subsection[TysWiredIn-ext-type]{External types}
1073 %************************************************************************
1075 The compiler's foreign function interface supports the passing of a
1076 restricted set of types as arguments and results (the restricting factor
1080 tcSplitIOType_maybe :: Type -> Maybe (TyCon, Type)
1081 -- (isIOType t) returns (Just (IO,t')) if t is of the form (IO t'), or
1082 -- some newtype wrapping thereof
1083 -- returns Nothing otherwise
1084 tcSplitIOType_maybe ty
1085 | Just (io_tycon, [io_res_ty]) <- tcSplitTyConApp_maybe ty,
1086 -- This split absolutely has to be a tcSplit, because we must
1087 -- see the IO type; and it's a newtype which is transparent to splitTyConApp.
1088 io_tycon `hasKey` ioTyConKey
1089 = Just (io_tycon, io_res_ty)
1091 | Just ty' <- coreView ty -- Look through non-recursive newtypes
1092 = tcSplitIOType_maybe ty'
1097 isFFITy :: Type -> Bool
1098 -- True for any TyCon that can possibly be an arg or result of an FFI call
1099 isFFITy ty = checkRepTyCon legalFFITyCon ty
1101 isFFIArgumentTy :: DynFlags -> Safety -> Type -> Bool
1102 -- Checks for valid argument type for a 'foreign import'
1103 isFFIArgumentTy dflags safety ty
1104 = checkRepTyCon (legalOutgoingTyCon dflags safety) ty
1106 isFFIExternalTy :: Type -> Bool
1107 -- Types that are allowed as arguments of a 'foreign export'
1108 isFFIExternalTy ty = checkRepTyCon legalFEArgTyCon ty
1110 isFFIImportResultTy :: DynFlags -> Type -> Bool
1111 isFFIImportResultTy dflags ty
1112 = checkRepTyCon (legalFIResultTyCon dflags) ty
1114 isFFIExportResultTy :: Type -> Bool
1115 isFFIExportResultTy ty = checkRepTyCon legalFEResultTyCon ty
1117 isFFIDynArgumentTy :: Type -> Bool
1118 -- The argument type of a foreign import dynamic must be Ptr, FunPtr, Addr,
1119 -- or a newtype of either.
1120 isFFIDynArgumentTy = checkRepTyConKey [ptrTyConKey, funPtrTyConKey]
1122 isFFIDynResultTy :: Type -> Bool
1123 -- The result type of a foreign export dynamic must be Ptr, FunPtr, Addr,
1124 -- or a newtype of either.
1125 isFFIDynResultTy = checkRepTyConKey [ptrTyConKey, funPtrTyConKey]
1127 isFFILabelTy :: Type -> Bool
1128 -- The type of a foreign label must be Ptr, FunPtr, Addr,
1129 -- or a newtype of either.
1130 isFFILabelTy = checkRepTyConKey [ptrTyConKey, funPtrTyConKey]
1132 isFFIDotnetTy :: DynFlags -> Type -> Bool
1133 isFFIDotnetTy dflags ty
1134 = checkRepTyCon (\ tc -> (legalFIResultTyCon dflags tc ||
1135 isFFIDotnetObjTy ty || isStringTy ty)) ty
1137 -- Support String as an argument or result from a .NET FFI call.
1139 case tcSplitTyConApp_maybe (repType ty) of
1141 | tc == listTyCon ->
1142 case tcSplitTyConApp_maybe (repType arg_ty) of
1143 Just (cc,[]) -> cc == charTyCon
1147 -- Support String as an argument or result from a .NET FFI call.
1148 isFFIDotnetObjTy ty =
1150 (_, t_ty) = tcSplitForAllTys ty
1152 case tcSplitTyConApp_maybe (repType t_ty) of
1153 Just (tc, [arg_ty]) | getName tc == objectTyConName -> True
1156 toDNType :: Type -> DNType
1158 | isStringTy ty = DNString
1159 | isFFIDotnetObjTy ty = DNObject
1160 | Just (tc,argTys) <- tcSplitTyConApp_maybe ty
1161 = case lookup (getUnique tc) dn_assoc of
1164 | tc `hasKey` ioTyConKey -> toDNType (head argTys)
1165 | otherwise -> pprPanic ("toDNType: unsupported .NET type")
1166 (pprType ty <+> parens (hcat (map pprType argTys)) <+> ppr tc)
1167 | otherwise = panic "toDNType" -- Is this right?
1169 dn_assoc :: [ (Unique, DNType) ]
1170 dn_assoc = [ (unitTyConKey, DNUnit)
1171 , (intTyConKey, DNInt)
1172 , (int8TyConKey, DNInt8)
1173 , (int16TyConKey, DNInt16)
1174 , (int32TyConKey, DNInt32)
1175 , (int64TyConKey, DNInt64)
1176 , (wordTyConKey, DNInt)
1177 , (word8TyConKey, DNWord8)
1178 , (word16TyConKey, DNWord16)
1179 , (word32TyConKey, DNWord32)
1180 , (word64TyConKey, DNWord64)
1181 , (floatTyConKey, DNFloat)
1182 , (doubleTyConKey, DNDouble)
1183 , (ptrTyConKey, DNPtr)
1184 , (funPtrTyConKey, DNPtr)
1185 , (charTyConKey, DNChar)
1186 , (boolTyConKey, DNBool)
1189 checkRepTyCon :: (TyCon -> Bool) -> Type -> Bool
1190 -- Look through newtypes
1191 -- Non-recursive ones are transparent to splitTyConApp,
1192 -- but recursive ones aren't. Manuel had:
1193 -- newtype T = MkT (Ptr T)
1194 -- and wanted it to work...
1195 checkRepTyCon check_tc ty
1196 | Just (tc,_) <- splitTyConApp_maybe (repType ty) = check_tc tc
1199 checkRepTyConKey :: [Unique] -> Type -> Bool
1200 -- Like checkRepTyCon, but just looks at the TyCon key
1201 checkRepTyConKey keys
1202 = checkRepTyCon (\tc -> tyConUnique tc `elem` keys)
1205 ----------------------------------------------
1206 These chaps do the work; they are not exported
1207 ----------------------------------------------
1210 legalFEArgTyCon :: TyCon -> Bool
1212 -- It's illegal to make foreign exports that take unboxed
1213 -- arguments. The RTS API currently can't invoke such things. --SDM 7/2000
1214 = boxedMarshalableTyCon tc
1216 legalFIResultTyCon :: DynFlags -> TyCon -> Bool
1217 legalFIResultTyCon dflags tc
1218 | tc == unitTyCon = True
1219 | otherwise = marshalableTyCon dflags tc
1221 legalFEResultTyCon :: TyCon -> Bool
1222 legalFEResultTyCon tc
1223 | tc == unitTyCon = True
1224 | otherwise = boxedMarshalableTyCon tc
1226 legalOutgoingTyCon :: DynFlags -> Safety -> TyCon -> Bool
1227 -- Checks validity of types going from Haskell -> external world
1228 legalOutgoingTyCon dflags safety tc
1229 = marshalableTyCon dflags tc
1231 legalFFITyCon :: TyCon -> Bool
1232 -- True for any TyCon that can possibly be an arg or result of an FFI call
1234 = isUnLiftedTyCon tc || boxedMarshalableTyCon tc || tc == unitTyCon
1236 marshalableTyCon dflags tc
1237 = (dopt Opt_GlasgowExts dflags && isUnLiftedTyCon tc)
1238 || boxedMarshalableTyCon tc
1240 boxedMarshalableTyCon tc
1241 = getUnique tc `elem` [ intTyConKey, int8TyConKey, int16TyConKey
1242 , int32TyConKey, int64TyConKey
1243 , wordTyConKey, word8TyConKey, word16TyConKey
1244 , word32TyConKey, word64TyConKey
1245 , floatTyConKey, doubleTyConKey
1246 , ptrTyConKey, funPtrTyConKey