2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1998
4 \section[CoreLint]{A ``lint'' pass to check for Core correctness}
13 #include "HsVersions.h"
16 import CoreFVs ( idFreeVars )
17 import CoreUtils ( findDefault, exprOkForSpeculation, coreBindsSize, mkPiType )
18 import Unify ( coreRefineTys )
20 import Literal ( literalType )
21 import DataCon ( dataConRepType, isVanillaDataCon, dataConTyCon, dataConWorkId )
22 import TysWiredIn ( tupleCon )
23 import Var ( Var, Id, TyVar, idType, tyVarKind, mustHaveLocalBinding )
25 import Name ( getSrcLoc )
27 import ErrUtils ( dumpIfSet_core, ghcExit, Message, showPass,
28 mkLocMessage, debugTraceMsg )
29 import SrcLoc ( SrcLoc, noSrcLoc, mkSrcSpan )
30 import Type ( Type, tyVarsOfType, coreEqType,
31 splitFunTy_maybe, mkTyVarTys,
32 splitForAllTy_maybe, splitTyConApp_maybe,
33 isUnLiftedType, typeKind,
34 isUnboxedTupleType, isSubKind,
35 substTyWith, emptyTvSubst, extendTvInScope,
36 TvSubst, TvSubstEnv, setTvSubstEnv, substTy,
37 extendTvSubst, composeTvSubst, isInScope,
38 getTvSubstEnv, getTvInScope )
39 import TyCon ( isPrimTyCon )
40 import BasicTypes ( RecFlag(..), Boxity(..), isNonRec )
45 import Util ( notNull )
52 %************************************************************************
56 %************************************************************************
58 @showPass@ and @endPass@ don't really belong here, but it makes a convenient
59 place for them. They print out stuff before and after core passes,
60 and do Core Lint when necessary.
63 endPass :: DynFlags -> String -> DynFlag -> [CoreBind] -> IO [CoreBind]
64 endPass dflags pass_name dump_flag binds
66 -- Report result size if required
67 -- This has the side effect of forcing the intermediate to be evaluated
68 debugTraceMsg dflags $
69 " Result size = " ++ show (coreBindsSize binds)
71 -- Report verbosely, if required
72 dumpIfSet_core dflags dump_flag pass_name (pprCoreBindings binds)
75 lintCoreBindings dflags pass_name binds
81 %************************************************************************
83 \subsection[lintCoreBindings]{@lintCoreBindings@: Top-level interface}
85 %************************************************************************
87 Checks that a set of core bindings is well-formed. The PprStyle and String
88 just control what we print in the event of an error. The Bool value
89 indicates whether we have done any specialisation yet (in which case we do
94 (b) Out-of-scope type variables
95 (c) Out-of-scope local variables
98 If we have done specialisation the we check that there are
99 (a) No top-level bindings of primitive (unboxed type)
104 -- Things are *not* OK if:
106 -- * Unsaturated type app before specialisation has been done;
108 -- * Oversaturated type app after specialisation (eta reduction
109 -- may well be happening...);
112 lintCoreBindings :: DynFlags -> String -> [CoreBind] -> IO ()
114 lintCoreBindings dflags whoDunnit binds
115 | not (dopt Opt_DoCoreLinting dflags)
118 lintCoreBindings dflags whoDunnit binds
119 = case (initL (lint_binds binds)) of
120 Nothing -> showPass dflags ("Core Linted result of " ++ whoDunnit)
121 Just bad_news -> printDump (display bad_news) >>
124 -- Put all the top-level binders in scope at the start
125 -- This is because transformation rules can bring something
126 -- into use 'unexpectedly'
127 lint_binds binds = addInScopeVars (bindersOfBinds binds) $
130 lint_bind (Rec prs) = mapM_ (lintSingleBinding Recursive) prs
131 lint_bind (NonRec bndr rhs) = lintSingleBinding NonRecursive (bndr,rhs)
134 = vcat [ text ("*** Core Lint Errors: in result of " ++ whoDunnit ++ " ***"),
136 ptext SLIT("*** Offending Program ***"),
137 pprCoreBindings binds,
138 ptext SLIT("*** End of Offense ***")
142 %************************************************************************
144 \subsection[lintUnfolding]{lintUnfolding}
146 %************************************************************************
148 We use this to check all unfoldings that come in from interfaces
149 (it is very painful to catch errors otherwise):
152 lintUnfolding :: SrcLoc
153 -> [Var] -- Treat these as in scope
155 -> Maybe Message -- Nothing => OK
157 lintUnfolding locn vars expr
158 = initL (addLoc (ImportedUnfolding locn) $
159 addInScopeVars vars $
163 %************************************************************************
165 \subsection[lintCoreBinding]{lintCoreBinding}
167 %************************************************************************
169 Check a core binding, returning the list of variables bound.
172 lintSingleBinding rec_flag (binder,rhs)
173 = addLoc (RhsOf binder) $
175 do { ty <- lintCoreExpr rhs
176 ; lintBinder binder -- Check match to RHS type
177 ; binder_ty <- applySubst binder_ty
178 ; checkTys binder_ty ty (mkRhsMsg binder ty)
179 -- Check (not isUnLiftedType) (also checks for bogus unboxed tuples)
180 ; checkL (not (isUnLiftedType binder_ty)
181 || (isNonRec rec_flag && exprOkForSpeculation rhs))
182 (mkRhsPrimMsg binder rhs)
183 -- Check whether binder's specialisations contain any out-of-scope variables
184 ; mapM_ (checkBndrIdInScope binder) bndr_vars }
186 -- We should check the unfolding, if any, but this is tricky because
187 -- the unfolding is a SimplifiableCoreExpr. Give up for now.
189 binder_ty = idType binder
190 bndr_vars = varSetElems (idFreeVars binder)
193 %************************************************************************
195 \subsection[lintCoreExpr]{lintCoreExpr}
197 %************************************************************************
201 lintCoreExpr :: CoreExpr -> LintM Type
202 -- The returned type has the substitution from the monad
203 -- already applied to it:
204 -- lintCoreExpr e subst = exprType (subst e)
206 lintCoreExpr (Var var)
207 = do { checkIdInScope var
208 ; applySubst (idType var) }
210 lintCoreExpr (Lit lit)
211 = return (literalType lit)
213 lintCoreExpr (Note (Coerce to_ty from_ty) expr)
214 = do { expr_ty <- lintCoreExpr expr
215 ; to_ty <- lintTy to_ty
216 ; from_ty <- lintTy from_ty
217 ; checkTys from_ty expr_ty (mkCoerceErr from_ty expr_ty)
220 lintCoreExpr (Note other_note expr)
223 lintCoreExpr (Let (NonRec bndr rhs) body)
224 = do { lintSingleBinding NonRecursive (bndr,rhs)
225 ; addLoc (BodyOfLetRec [bndr])
226 (addInScopeVars [bndr] (lintCoreExpr body)) }
228 lintCoreExpr (Let (Rec pairs) body)
229 = addInScopeVars bndrs $
230 do { mapM (lintSingleBinding Recursive) pairs
231 ; addLoc (BodyOfLetRec bndrs) (lintCoreExpr body) }
233 bndrs = map fst pairs
235 lintCoreExpr (App fun (Type ty))
236 -- This is like 'let' for types
237 -- It's needed when dealing with desugarer output for GADTs. Consider
238 -- data T = forall a. T a (a->Int) Bool
240 -- f (T x f True) = <e1>
241 -- f (T y g False) = <e2>
242 -- After desugaring we get
244 -- T a (x::a) (f::a->Int) (b:Bool) ->
247 -- False -> (/\b. let y=x; g=f in <e2>) a
248 -- And for a reason I now forget, the ...<e2>... can mention a; so
249 -- we want Lint to know that b=a. Ugh.
251 -- I tried quite hard to make the necessity for this go away, by changing the
252 -- desugarer, but the fundamental problem is this:
254 -- T a (x::a) (y::Int) -> let fail::a = ...
255 -- in (/\b. ...(case ... of
259 -- Now the inner case look as though it has incompatible branches.
262 go (App fun (Type ty)) tys
263 = do { go fun (ty:tys) }
264 go (Lam tv body) (ty:tys)
265 = do { checkL (isTyVar tv) (mkKindErrMsg tv ty) -- Not quite accurate
268 -- Now extend the substitution so we
269 -- take advantage of it in the body
270 ; addInScopeVars [tv] $
271 extendSubstL tv ty' $
274 = do { fun_ty <- lintCoreExpr fun
275 ; lintCoreArgs fun_ty (map Type tys) }
277 lintCoreExpr e@(App fun arg)
278 = do { ty <- lintCoreExpr fun
279 ; addLoc (AnExpr e) $
282 lintCoreExpr (Lam var expr)
283 = addLoc (LambdaBodyOf var) $
285 ; ty <- addInScopeVars [var] $
287 ; applySubst (mkPiType var ty) }
288 -- The applySubst is needed to apply the subst to var
290 lintCoreExpr e@(Case scrut var alt_ty alts) =
291 -- Check the scrutinee
292 do { scrut_ty <- lintCoreExpr scrut
293 ; alt_ty <- lintTy alt_ty
294 ; var_ty <- lintTy (idType var)
295 -- Don't use lintId on var, because unboxed tuple is legitimate
297 ; checkTys var_ty scrut_ty (mkScrutMsg var scrut_ty)
299 -- If the binder is an unboxed tuple type, don't put it in scope
300 ; let vars = if (isUnboxedTupleType (idType var)) then [] else [var]
301 ; addInScopeVars vars $
302 do { -- Check the alternatives
303 checkCaseAlts e scrut_ty alts
304 ; mapM (lintCoreAlt scrut_ty alt_ty) alts
307 lintCoreExpr e@(Type ty)
308 = addErrL (mkStrangeTyMsg e)
311 %************************************************************************
313 \subsection[lintCoreArgs]{lintCoreArgs}
315 %************************************************************************
317 The basic version of these functions checks that the argument is a
318 subtype of the required type, as one would expect.
321 lintCoreArgs :: Type -> [CoreArg] -> LintM Type
322 lintCoreArg :: Type -> CoreArg -> LintM Type
323 -- First argument has already had substitution applied to it
327 lintCoreArgs ty [] = return ty
328 lintCoreArgs ty (a : args) =
329 do { res <- lintCoreArg ty a
330 ; lintCoreArgs res args }
332 lintCoreArg ty a@(Type arg_ty) =
333 do { arg_ty <- lintTy arg_ty
334 ; lintTyApp ty arg_ty }
336 lintCoreArg fun_ty arg =
337 -- Make sure function type matches argument
338 do { arg_ty <- lintCoreExpr arg
339 ; let err = mkAppMsg fun_ty arg_ty
340 ; case splitFunTy_maybe fun_ty of
342 do { checkTys arg arg_ty err
348 -- Both args have had substitution applied
350 = case splitForAllTy_maybe ty of
351 Nothing -> addErrL (mkTyAppMsg ty arg_ty)
354 -> do { checkL (isTyVar tyvar) (mkTyAppMsg ty arg_ty)
355 ; checkKinds tyvar arg_ty
356 ; return (substTyWith [tyvar] [arg_ty] body) }
358 lintTyApps fun_ty [] = return fun_ty
360 lintTyApps fun_ty (arg_ty : arg_tys) =
361 do { fun_ty' <- lintTyApp fun_ty arg_ty
362 ; lintTyApps fun_ty' arg_tys }
364 checkKinds tyvar arg_ty
365 -- Arg type might be boxed for a function with an uncommitted
366 -- tyvar; notably this is used so that we can give
367 -- error :: forall a:*. String -> a
368 -- and then apply it to both boxed and unboxed types.
369 = checkL (argty_kind `isSubKind` tyvar_kind)
370 (mkKindErrMsg tyvar arg_ty)
372 tyvar_kind = tyVarKind tyvar
373 argty_kind = typeKind arg_ty
377 %************************************************************************
379 \subsection[lintCoreAlts]{lintCoreAlts}
381 %************************************************************************
384 checkCaseAlts :: CoreExpr -> Type -> [CoreAlt] -> LintM ()
385 -- a) Check that the alts are non-empty
386 -- b1) Check that the DEFAULT comes first, if it exists
387 -- b2) Check that the others are in increasing order
388 -- c) Check that there's a default for infinite types
389 -- NB: Algebraic cases are not necessarily exhaustive, because
390 -- the simplifer correctly eliminates case that can't
393 checkCaseAlts e ty []
394 = addErrL (mkNullAltsMsg e)
396 checkCaseAlts e ty alts =
397 do { checkL (all non_deflt con_alts) (mkNonDefltMsg e)
398 ; checkL (increasing_tag con_alts) (mkNonIncreasingAltsMsg e)
399 ; checkL (isJust maybe_deflt || not is_infinite_ty)
400 (nonExhaustiveAltsMsg e) }
402 (con_alts, maybe_deflt) = findDefault alts
404 -- Check that successive alternatives have increasing tags
405 increasing_tag (alt1 : rest@( alt2 : _)) = alt1 `ltAlt` alt2 && increasing_tag rest
406 increasing_tag other = True
408 non_deflt (DEFAULT, _, _) = False
411 is_infinite_ty = case splitTyConApp_maybe ty of
413 Just (tycon, tycon_arg_tys) -> isPrimTyCon tycon
417 checkAltExpr :: CoreExpr -> Type -> LintM ()
419 = do { actual_ty <- lintCoreExpr expr
420 ; ty' <- applySubst ty
421 ; checkTys actual_ty ty' (mkCaseAltMsg expr actual_ty ty') }
423 lintCoreAlt :: Type -- Type of scrutinee; a fixed point of
425 -> Type -- Type of the alternative
429 lintCoreAlt scrut_ty alt_ty alt@(DEFAULT, args, rhs) =
430 do { checkL (null args) (mkDefaultArgsMsg args)
431 ; checkAltExpr rhs alt_ty }
433 lintCoreAlt scrut_ty alt_ty alt@(LitAlt lit, args, rhs) =
434 do { checkL (null args) (mkDefaultArgsMsg args)
435 ; checkTys lit_ty scrut_ty
436 (mkBadPatMsg lit_ty scrut_ty)
437 ; checkAltExpr rhs alt_ty }
439 lit_ty = literalType lit
441 lintCoreAlt scrut_ty alt_ty alt@(DataAlt con, args, rhs)
442 | Just (tycon, tycon_arg_tys) <- splitTyConApp_maybe scrut_ty,
443 tycon == dataConTyCon con
444 = addLoc (CaseAlt alt) $
445 addInScopeVars args $ -- Put the args in scope before lintBinder,
446 -- because the Ids mention the type variables
447 if isVanillaDataCon con then
448 do { mapM lintBinder args
449 -- FIX! Add check that all args are Ids.
451 -- Scrutinee type must be a tycon applicn; checked by caller
452 -- This code is remarkably compact considering what it does!
453 -- NB: args must be in scope here so that the lintCoreArgs line works.
454 -- NB: relies on existential type args coming *after* ordinary type args
456 ; con_type <- lintTyApps (dataConRepType con) tycon_arg_tys
457 -- Can just map Var as we know that this is a vanilla datacon
458 ; con_result_ty <- lintCoreArgs con_type (map Var args)
459 ; checkTys con_result_ty scrut_ty (mkBadPatMsg con_result_ty scrut_ty)
461 ; checkAltExpr rhs alt_ty }
464 do { let (tvs,ids) = span isTyVar args
465 ; subst <- getTvSubst
466 ; let in_scope = getTvInScope subst
467 subst_env = getTvSubstEnv subst
468 ; case coreRefineTys in_scope con tvs scrut_ty of {
469 Nothing -> return () ; -- Alternative is dead code
470 Just (refine, _) -> updateTvSubstEnv (composeTvSubst in_scope refine subst_env) $
471 do { tvs' <- mapM lintTy (mkTyVarTys tvs)
472 ; con_type <- lintTyApps (dataConRepType con) tvs'
473 ; mapM lintBinder ids -- Lint Ids in the refined world
474 ; lintCoreArgs con_type (map Var ids)
475 ; checkAltExpr rhs alt_ty
478 | otherwise -- Scrut-ty is wrong shape
479 = addErrL (mkBadAltMsg scrut_ty alt)
482 %************************************************************************
484 \subsection[lint-types]{Types}
486 %************************************************************************
489 lintBinder :: Var -> LintM ()
490 lintBinder var | isId var = lintId var >> return ()
491 | otherwise = return ()
493 lintId :: Var -> LintM Type
494 -- ToDo: lint its rules
496 = do { checkL (not (isUnboxedTupleType (idType id)))
497 (mkUnboxedTupleMsg id)
498 -- No variable can be bound to an unboxed tuple.
499 ; lintTy (idType id) }
501 lintTy :: Type -> LintM Type
502 -- Check the type, and apply the substitution to it
503 -- ToDo: check the kind structure of the type
505 = do { ty' <- applySubst ty
506 ; mapM_ checkIdInScope (varSetElems (tyVarsOfType ty'))
511 %************************************************************************
513 \subsection[lint-monad]{The Lint monad}
515 %************************************************************************
520 [LintLocInfo] -> -- Locations
521 TvSubst -> -- Current type substitution; we also use this
522 -- to keep track of all the variables in scope,
523 -- both Ids and TyVars
524 Bag Message -> -- Error messages so far
525 (Maybe a, Bag Message) } -- Result and error messages (if any)
527 instance Monad LintM where
528 return x = LintM (\ loc subst errs -> (Just x, errs))
529 fail err = LintM (\ loc subst errs -> (Nothing, addErr subst errs (text err) loc))
530 m >>= k = LintM (\ loc subst errs ->
531 let (res, errs') = unLintM m loc subst errs in
533 Just r -> unLintM (k r) loc subst errs'
534 Nothing -> (Nothing, errs'))
537 = RhsOf Id -- The variable bound
538 | LambdaBodyOf Id -- The lambda-binder
539 | BodyOfLetRec [Id] -- One of the binders
540 | CaseAlt CoreAlt -- Pattern of a case alternative
541 | AnExpr CoreExpr -- Some expression
542 | ImportedUnfolding SrcLoc -- Some imported unfolding (ToDo: say which)
547 initL :: LintM a -> Maybe Message {- errors -}
549 = case unLintM m [] emptyTvSubst emptyBag of
550 (_, errs) | isEmptyBag errs -> Nothing
551 | otherwise -> Just (vcat (punctuate (text "") (bagToList errs)))
555 checkL :: Bool -> Message -> LintM ()
556 checkL True msg = return ()
557 checkL False msg = addErrL msg
559 addErrL :: Message -> LintM a
560 addErrL msg = LintM (\ loc subst errs -> (Nothing, addErr subst errs msg loc))
562 addErr :: TvSubst -> Bag Message -> Message -> [LintLocInfo] -> Bag Message
563 addErr subst errs_so_far msg locs
564 = ASSERT( notNull locs )
565 errs_so_far `snocBag` mk_msg msg
567 (loc, cxt1) = dumpLoc (head locs)
568 cxts = [snd (dumpLoc loc) | loc <- locs]
569 context | opt_PprStyle_Debug = vcat (reverse cxts) $$ cxt1 $$
570 ptext SLIT("Substitution:") <+> ppr subst
573 mk_msg msg = mkLocMessage (mkSrcSpan loc loc) (context $$ msg)
575 addLoc :: LintLocInfo -> LintM a -> LintM a
577 LintM (\ loc subst errs -> unLintM m (extra_loc:loc) subst errs)
579 addInScopeVars :: [Var] -> LintM a -> LintM a
580 addInScopeVars vars m =
581 LintM (\ loc subst errs -> unLintM m loc (extendTvInScope subst vars) errs)
583 updateTvSubstEnv :: TvSubstEnv -> LintM a -> LintM a
584 updateTvSubstEnv substenv m =
585 LintM (\ loc subst errs -> unLintM m loc (setTvSubstEnv subst substenv) errs)
587 getTvSubst :: LintM TvSubst
588 getTvSubst = LintM (\ loc subst errs -> (Just subst, errs))
590 applySubst :: Type -> LintM Type
591 applySubst ty = do { subst <- getTvSubst; return (substTy subst ty) }
593 extendSubstL :: TyVar -> Type -> LintM a -> LintM a
595 = LintM (\ loc subst errs -> unLintM m loc (extendTvSubst subst tv ty) errs)
599 checkIdInScope :: Var -> LintM ()
601 = do { checkL (not (id == oneTupleDataConId))
602 (ptext SLIT("Illegal one-tuple"))
603 ; checkInScope (ptext SLIT("is out of scope")) id }
605 oneTupleDataConId :: Id -- Should not happen
606 oneTupleDataConId = dataConWorkId (tupleCon Boxed 1)
608 checkBndrIdInScope :: Var -> Var -> LintM ()
609 checkBndrIdInScope binder id
610 = checkInScope msg id
612 msg = ptext SLIT("is out of scope inside info for") <+>
615 checkInScope :: SDoc -> Var -> LintM ()
616 checkInScope loc_msg var =
617 do { subst <- getTvSubst
618 ; checkL (not (mustHaveLocalBinding var) || (var `isInScope` subst))
619 (hsep [ppr var, loc_msg]) }
621 checkTys :: Type -> Type -> Message -> LintM ()
622 -- check ty2 is subtype of ty1 (ie, has same structure but usage
623 -- annotations need only be consistent, not equal)
624 -- Assumes ty1,ty2 are have alrady had the substitution applied
625 checkTys ty1 ty2 msg = checkL (ty1 `coreEqType` ty2) msg
628 %************************************************************************
630 \subsection{Error messages}
632 %************************************************************************
636 = (getSrcLoc v, brackets (ptext SLIT("RHS of") <+> pp_binders [v]))
638 dumpLoc (LambdaBodyOf b)
639 = (getSrcLoc b, brackets (ptext SLIT("in body of lambda with binder") <+> pp_binder b))
641 dumpLoc (BodyOfLetRec [])
642 = (noSrcLoc, brackets (ptext SLIT("In body of a letrec with no binders")))
644 dumpLoc (BodyOfLetRec bs@(_:_))
645 = ( getSrcLoc (head bs), brackets (ptext SLIT("in body of letrec with binders") <+> pp_binders bs))
648 = (noSrcLoc, text "In the expression:" <+> ppr e)
650 dumpLoc (CaseAlt (con, args, rhs))
651 = (noSrcLoc, text "In a case alternative:" <+> parens (ppr con <+> ppr args))
653 dumpLoc (ImportedUnfolding locn)
654 = (locn, brackets (ptext SLIT("in an imported unfolding")))
656 pp_binders :: [Var] -> SDoc
657 pp_binders bs = sep (punctuate comma (map pp_binder bs))
659 pp_binder :: Var -> SDoc
660 pp_binder b | isId b = hsep [ppr b, dcolon, ppr (idType b)]
661 | isTyVar b = hsep [ppr b, dcolon, ppr (tyVarKind b)]
665 ------------------------------------------------------
666 -- Messages for case expressions
668 mkNullAltsMsg :: CoreExpr -> Message
670 = hang (text "Case expression with no alternatives:")
673 mkDefaultArgsMsg :: [Var] -> Message
674 mkDefaultArgsMsg args
675 = hang (text "DEFAULT case with binders")
678 mkCaseAltMsg :: CoreExpr -> Type -> Type -> Message
679 mkCaseAltMsg e ty1 ty2
680 = hang (text "Type of case alternatives not the same as the annotation on case:")
681 4 (vcat [ppr ty1, ppr ty2, ppr e])
683 mkScrutMsg :: Id -> Type -> Message
684 mkScrutMsg var scrut_ty
685 = vcat [text "Result binder in case doesn't match scrutinee:" <+> ppr var,
686 text "Result binder type:" <+> ppr (idType var),
687 text "Scrutinee type:" <+> ppr scrut_ty]
691 = hang (text "Case expression with DEFAULT not at the beginnning") 4 (ppr e)
692 mkNonIncreasingAltsMsg e
693 = hang (text "Case expression with badly-ordered alternatives") 4 (ppr e)
695 nonExhaustiveAltsMsg :: CoreExpr -> Message
696 nonExhaustiveAltsMsg e
697 = hang (text "Case expression with non-exhaustive alternatives") 4 (ppr e)
699 mkBadPatMsg :: Type -> Type -> Message
700 mkBadPatMsg con_result_ty scrut_ty
702 text "In a case alternative, pattern result type doesn't match scrutinee type:",
703 text "Pattern result type:" <+> ppr con_result_ty,
704 text "Scrutinee type:" <+> ppr scrut_ty
707 mkBadAltMsg :: Type -> CoreAlt -> Message
708 mkBadAltMsg scrut_ty alt
709 = vcat [ text "Data alternative when scrutinee is not a tycon application",
710 text "Scrutinee type:" <+> ppr scrut_ty,
711 text "Alternative:" <+> pprCoreAlt alt ]
713 ------------------------------------------------------
714 -- Other error messages
716 mkAppMsg :: Type -> Type -> Message
718 = vcat [ptext SLIT("Argument value doesn't match argument type:"),
719 hang (ptext SLIT("Fun type:")) 4 (ppr fun),
720 hang (ptext SLIT("Arg type:")) 4 (ppr arg)]
722 mkKindErrMsg :: TyVar -> Type -> Message
723 mkKindErrMsg tyvar arg_ty
724 = vcat [ptext SLIT("Kinds don't match in type application:"),
725 hang (ptext SLIT("Type variable:"))
726 4 (ppr tyvar <+> dcolon <+> ppr (tyVarKind tyvar)),
727 hang (ptext SLIT("Arg type:"))
728 4 (ppr arg_ty <+> dcolon <+> ppr (typeKind arg_ty))]
730 mkTyAppMsg :: Type -> Type -> Message
732 = vcat [text "Illegal type application:",
733 hang (ptext SLIT("Exp type:"))
734 4 (ppr ty <+> dcolon <+> ppr (typeKind ty)),
735 hang (ptext SLIT("Arg type:"))
736 4 (ppr arg_ty <+> dcolon <+> ppr (typeKind arg_ty))]
738 mkRhsMsg :: Id -> Type -> Message
741 [hsep [ptext SLIT("The type of this binder doesn't match the type of its RHS:"),
743 hsep [ptext SLIT("Binder's type:"), ppr (idType binder)],
744 hsep [ptext SLIT("Rhs type:"), ppr ty]]
746 mkRhsPrimMsg :: Id -> CoreExpr -> Message
747 mkRhsPrimMsg binder rhs
748 = vcat [hsep [ptext SLIT("The type of this binder is primitive:"),
750 hsep [ptext SLIT("Binder's type:"), ppr (idType binder)]
753 mkUnboxedTupleMsg :: Id -> Message
754 mkUnboxedTupleMsg binder
755 = vcat [hsep [ptext SLIT("A variable has unboxed tuple type:"), ppr binder],
756 hsep [ptext SLIT("Binder's type:"), ppr (idType binder)]]
758 mkCoerceErr from_ty expr_ty
759 = vcat [ptext SLIT("From-type of Coerce differs from type of enclosed expression"),
760 ptext SLIT("From-type:") <+> ppr from_ty,
761 ptext SLIT("Type of enclosed expr:") <+> ppr expr_ty
765 = ptext SLIT("Type where expression expected:") <+> ppr e