[project @ 1996-04-09 10:27:46 by partain]
[ghc-hetmet.git] / ghc / compiler / coreSyn / CoreLint.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1995
3 %
4 \section[CoreLint]{A ``lint'' pass to check for Core correctness}
5
6 \begin{code}
7 #include "HsVersions.h"
8
9 module CoreLint (
10         lintCoreBindings,
11         lintUnfolding
12     ) where
13
14 import Ubiq
15
16 import CoreSyn
17
18 import Bag
19 import Kind             ( Kind{-instance-} )
20 import Literal          ( literalType, Literal{-instance-} )
21 import Id               ( idType, isBottomingId,
22                           dataConArgTys, GenId{-instances-}
23                         )
24 import Maybes           ( catMaybes )
25 import Name             ( isLocallyDefined, getSrcLoc )
26 import Outputable       ( Outputable(..){-instance * []-} )
27 import PprCore
28 import PprStyle         ( PprStyle(..) )
29 import PprType          ( GenType, GenTyVar, TyCon )
30 import Pretty
31 import PrimOp           ( primOpType, PrimOp(..) )
32 import PrimRep          ( PrimRep(..) )
33 import SrcLoc           ( SrcLoc )
34 import Type             ( mkFunTy,getFunTy_maybe,mkForAllTy,getForAllTy_maybe,
35                           isPrimType,getTypeKind,instantiateTy,
36                           mkForAllUsageTy,getForAllUsageTy,instantiateUsage,
37                           maybeAppDataTyCon, eqTy
38                         )
39 import TyCon            ( isPrimTyCon, tyConFamilySize )
40 import TyVar            ( getTyVarKind, GenTyVar{-instances-} )
41 import UniqSet          ( emptyUniqSet, mkUniqSet, intersectUniqSets,
42                           unionUniqSets, elementOfUniqSet, UniqSet(..)
43                         )
44 import Unique           ( Unique )
45 import Usage            ( GenUsage )
46 import Util             ( zipEqual, pprTrace, pprPanic, assertPanic, panic )
47
48 infixr 9 `thenL`, `seqL`, `thenMaybeL`, `seqMaybeL`
49 \end{code}
50
51 %************************************************************************
52 %*                                                                      *
53 \subsection[lintCoreBindings]{@lintCoreBindings@: Top-level interface}
54 %*                                                                      *
55 %************************************************************************
56
57 Checks that a set of core bindings is well-formed.  The PprStyle and String
58 just control what we print in the event of an error.  The Bool value
59 indicates whether we have done any specialisation yet (in which case we do
60 some extra checks).
61
62 We check for
63         (a) type errors
64         (b) Out-of-scope type variables
65         (c) Out-of-scope local variables
66         (d) Ill-kinded types
67
68 If we have done specialisation the we check that there are
69         (a) No top-level bindings of primitive (unboxed type)
70
71 Outstanding issues:
72
73     --
74     -- Things are *not* OK if:
75     --
76     -- * Unsaturated type app before specialisation has been done;
77     --
78     -- * Oversaturated type app after specialisation (eta reduction
79     --   may well be happening...);
80     --
81     -- Note: checkTyApp is usually followed by a call to checkSpecTyApp.
82     --
83
84 \begin{code}
85 lintCoreBindings
86         :: PprStyle -> String -> Bool -> [CoreBinding] -> [CoreBinding]
87
88 lintCoreBindings sty whoDunnit spec_done binds
89   = case (initL (lint_binds binds) spec_done) of
90       Nothing  -> binds
91       Just msg ->
92         pprPanic "" (ppAboves [
93           ppStr ("*** Core Lint Errors: in " ++ whoDunnit ++ " ***"),
94           msg sty,
95           ppStr "*** Offending Program ***",
96           ppAboves (map (pprCoreBinding sty) binds),
97           ppStr "*** End of Offense ***"
98         ])
99   where
100     lint_binds [] = returnL ()
101     lint_binds (bind:binds)
102       = lintCoreBinding bind `thenL` \binders ->
103         addInScopeVars binders (lint_binds binds)
104 \end{code}
105
106 %************************************************************************
107 %*                                                                      *
108 \subsection[lintUnfolding]{lintUnfolding}
109 %*                                                                      *
110 %************************************************************************
111
112 We use this to check all unfoldings that come in from interfaces
113 (it is very painful to catch errors otherwise):
114
115 \begin{code}
116 lintUnfolding :: SrcLoc -> CoreExpr -> Maybe CoreExpr
117
118 lintUnfolding locn expr
119   = case
120       (initL (addLoc (ImportedUnfolding locn) (lintCoreExpr expr))
121        True{-pretend spec done-})
122     of
123       Nothing  -> Just expr
124       Just msg ->
125         pprTrace "WARNING: Discarded bad unfolding from interface:\n"
126         (ppAboves [msg PprForUser,
127                    ppStr "*** Bad unfolding ***",
128                    ppr PprDebug expr,
129                    ppStr "*** End unfolding ***"])
130         Nothing
131 \end{code}
132
133 %************************************************************************
134 %*                                                                      *
135 \subsection[lintCoreBinding]{lintCoreBinding}
136 %*                                                                      *
137 %************************************************************************
138
139 Check a core binding, returning the list of variables bound.
140
141 \begin{code}
142 lintCoreBinding :: CoreBinding -> LintM [Id]
143
144 lintCoreBinding (NonRec binder rhs)
145   = lintSingleBinding (binder,rhs) `seqL` returnL [binder]
146
147 lintCoreBinding (Rec pairs)
148   = addInScopeVars binders (
149       mapL lintSingleBinding pairs `seqL` returnL binders
150     )
151   where
152     binders = [b | (b,_) <- pairs]
153
154 lintSingleBinding (binder,rhs)
155   = addLoc (RhsOf binder) (
156         -- Check the rhs
157         lintCoreExpr rhs
158
159         `thenL` \maybe_ty ->
160         -- Check match to RHS type
161         (case maybe_ty of
162           Nothing -> returnL ()
163           Just ty -> checkTys (idType binder) ty (mkRhsMsg binder ty))
164
165         `seqL`
166         -- Check (not isPrimType)
167         checkIfSpecDoneL (not (isPrimType (idType binder)))
168           (mkRhsPrimMsg binder rhs)
169
170         -- We should check the unfolding, if any, but this is tricky because
171         -- the unfolding is a SimplifiableCoreExpr. Give up for now.
172     )
173 \end{code}
174
175 %************************************************************************
176 %*                                                                      *
177 \subsection[lintCoreExpr]{lintCoreExpr}
178 %*                                                                      *
179 %************************************************************************
180
181 \begin{code}
182 lintCoreExpr :: CoreExpr -> LintM (Maybe Type)  -- Nothing if error found
183
184 lintCoreExpr (Var var) = checkInScope var `seqL` returnL (Just (idType var))
185 lintCoreExpr (Lit lit) = returnL (Just (literalType lit))
186 lintCoreExpr (SCC _ expr) = lintCoreExpr expr
187
188 lintCoreExpr (Let binds body)
189   = lintCoreBinding binds `thenL` \binders ->
190     if (null binders) then
191         lintCoreExpr body  -- Can't add a new source location
192     else
193       addLoc (BodyOfLetRec binders)
194         (addInScopeVars binders (lintCoreExpr body))
195
196 lintCoreExpr e@(Con con args)
197   = lintCoreArgs False e (idType con) args
198     -- Note: we don't check for primitive types in these arguments
199
200 lintCoreExpr e@(Prim op args)
201   = lintCoreArgs True e (primOpType op) args
202     -- Note: we do check for primitive types in these arguments
203
204 lintCoreExpr e@(App fun@(Var v) arg) | isBottomingId v
205   = lintCoreExpr fun `thenMaybeL` \ ty -> lintCoreArg False e ty arg
206     -- Note: we don't check for primitive types in argument to 'error'
207
208 lintCoreExpr e@(App fun arg)
209   = lintCoreExpr fun `thenMaybeL` \ty -> lintCoreArg True e ty arg
210     -- Note: we do check for primitive types in this argument
211
212 lintCoreExpr (Lam (ValBinder var) expr)
213   = addLoc (LambdaBodyOf var)
214       (addInScopeVars [var]
215         (lintCoreExpr expr `thenMaybeL` \ty ->
216          returnL (Just (mkFunTy (idType var) ty))))
217
218 lintCoreExpr (Lam (TyBinder tyvar) expr)
219   = lintCoreExpr expr `thenMaybeL` \ty ->
220     returnL (Just(mkForAllTy tyvar ty))
221     -- TODO: Should add in-scope type variable at this point
222
223 lintCoreExpr e@(Case scrut alts)
224  = lintCoreExpr scrut `thenMaybeL` \ty ->
225    -- Check that it is a data type
226    case maybeAppDataTyCon ty of
227      Nothing -> addErrL (mkCaseDataConMsg e) `seqL` returnL Nothing
228      Just(tycon, _, _) -> lintCoreAlts alts ty tycon
229 \end{code}
230
231 %************************************************************************
232 %*                                                                      *
233 \subsection[lintCoreArgs]{lintCoreArgs}
234 %*                                                                      *
235 %************************************************************************
236
237 The boolean argument indicates whether we should flag type
238 applications to primitive types as being errors.
239
240 \begin{code}
241 lintCoreArgs :: Bool -> CoreExpr -> Type -> [CoreArg] -> LintM (Maybe Type)
242
243 lintCoreArgs _          _ ty [] = returnL (Just ty)
244 lintCoreArgs checkTyApp e ty (a : args)
245   = lintCoreArg  checkTyApp e ty  a `thenMaybeL` \ res ->
246     lintCoreArgs checkTyApp e res args
247 \end{code}
248
249 %************************************************************************
250 %*                                                                      *
251 \subsection[lintCoreArg]{lintCoreArg}
252 %*                                                                      *
253 %************************************************************************
254
255 \begin{code}
256 lintCoreArg :: Bool -> CoreExpr -> Type -> CoreArg -> LintM (Maybe Type)
257
258 lintCoreArg _ e ty (LitArg lit)
259   = -- Make sure function type matches argument
260     case (getFunTy_maybe ty) of
261       Just (arg,res) | (literalType lit `eqTy` arg) -> returnL(Just res)
262       _ -> addErrL (mkAppMsg ty (literalType lit) e) `seqL` returnL Nothing
263
264 lintCoreArg _ e ty (VarArg v)
265   = -- Make sure variable is bound
266     checkInScope v `seqL`
267     -- Make sure function type matches argument
268     case (getFunTy_maybe ty) of
269       Just (arg,res) | (idType v `eqTy` arg) -> returnL(Just res)
270       _ -> addErrL (mkAppMsg ty (idType v) e) `seqL` returnL Nothing
271
272 lintCoreArg checkTyApp e ty a@(TyArg arg_ty)
273   = -- TODO: Check that ty is well-kinded and has no unbound tyvars
274     checkIfSpecDoneL (not (isPrimType arg_ty)) (mkSpecTyAppMsg a)
275     `seqL`
276     case (getForAllTy_maybe ty) of
277       Just (tyvar,body) | (getTyVarKind tyvar == getTypeKind arg_ty) ->
278         returnL(Just(instantiateTy [(tyvar,arg_ty)] body))
279       _ -> addErrL (mkTyAppMsg ty arg_ty e) `seqL` returnL Nothing
280         
281 lintCoreArg _ e ty (UsageArg u)
282   = -- TODO: Check that usage has no unbound usage variables
283     case (getForAllUsageTy ty) of
284       Just (uvar,bounds,body) ->
285         -- TODO Check argument satisfies bounds
286         returnL(Just(panic "lintCoreArg:instantiateUsage uvar u body"))
287       _ -> addErrL (mkUsageAppMsg ty u e) `seqL` returnL Nothing
288 \end{code}
289
290 %************************************************************************
291 %*                                                                      *
292 \subsection[lintCoreAlts]{lintCoreAlts}
293 %*                                                                      *
294 %************************************************************************
295
296 \begin{code}
297 lintCoreAlts :: CoreCaseAlts
298              -> Type                    -- Type of scrutinee
299              -> TyCon                   -- TyCon pinned on the case
300              -> LintM (Maybe Type)      -- Type of alternatives
301
302 lintCoreAlts whole_alts@(AlgAlts alts deflt) ty tycon
303   = -- Check tycon is not a primitive tycon
304     addErrIfL (isPrimTyCon tycon) (mkCasePrimMsg tycon)
305     `seqL`
306     -- Check we are scrutinising a proper datatype
307     -- (ToDo: robustify)
308     addErrIfL (not (tyConFamilySize tycon >= 1)) (mkCaseAbstractMsg tycon)
309     `seqL`
310     lintDeflt deflt ty
311     `thenL` \maybe_deflt_ty ->
312     mapL (lintAlgAlt ty tycon) alts
313     `thenL` \maybe_alt_tys ->
314     -- Check the result types
315     case catMaybes (maybe_deflt_ty : maybe_alt_tys) of
316       []             -> returnL Nothing
317
318       (first_ty:tys) -> mapL check tys  `seqL`
319                         returnL (Just first_ty)
320         where
321           check ty = checkTys first_ty ty (mkCaseAltMsg whole_alts)
322
323 lintCoreAlts whole_alts@(PrimAlts alts deflt) ty tycon
324   = -- Check tycon is a primitive tycon
325     addErrIfL (not (isPrimTyCon tycon)) (mkCaseNotPrimMsg tycon)
326     `seqL`
327     mapL (lintPrimAlt ty) alts
328     `thenL` \maybe_alt_tys ->
329     lintDeflt deflt ty
330     `thenL` \maybe_deflt_ty ->
331     -- Check the result types
332     case catMaybes (maybe_deflt_ty : maybe_alt_tys) of
333       []             -> returnL Nothing
334
335       (first_ty:tys) -> mapL check tys  `seqL`
336                         returnL (Just first_ty)
337         where
338           check ty = checkTys first_ty ty (mkCaseAltMsg whole_alts)
339
340 lintAlgAlt scrut_ty tycon{-ToDo: use it!-} (con,args,rhs)
341   = (case maybeAppDataTyCon scrut_ty of
342       Nothing ->
343          addErrL (mkAlgAltMsg1 scrut_ty)
344       Just (tycon, tys_applied, cons) ->
345          let
346            arg_tys = dataConArgTys con tys_applied
347          in
348          checkL (con `elem` cons) (mkAlgAltMsg2 scrut_ty con) `seqL`
349          checkL (length arg_tys == length args) (mkAlgAltMsg3 con args)
350                                                                  `seqL`
351          mapL check (arg_tys `zipEqual` args)                    `seqL`
352          returnL ()
353     )                                                            `seqL`
354     addInScopeVars args         (
355          lintCoreExpr rhs
356     )
357   where
358     check (ty, arg) = checkTys ty (idType arg) (mkAlgAltMsg4 ty arg)
359
360     -- elem: yes, the elem-list here can sometimes be long-ish,
361     -- but as it's use-once, probably not worth doing anything different
362     -- We give it its own copy, so it isn't overloaded.
363     elem _ []       = False
364     elem x (y:ys)   = x==y || elem x ys
365
366 lintPrimAlt ty alt@(lit,rhs)
367  = checkTys (literalType lit) ty (mkPrimAltMsg alt) `seqL`
368    lintCoreExpr rhs
369
370 lintDeflt NoDefault _ = returnL Nothing
371 lintDeflt deflt@(BindDefault binder rhs) ty
372   = checkTys (idType binder) ty (mkDefltMsg deflt) `seqL`
373     addInScopeVars [binder] (lintCoreExpr rhs)
374 \end{code}
375
376 %************************************************************************
377 %*                                                                      *
378 \subsection[lint-monad]{The Lint monad}
379 %*                                                                      *
380 %************************************************************************
381
382 \begin{code}
383 type LintM a = Bool             -- True <=> specialisation has been done
384             -> [LintLocInfo]    -- Locations
385             -> UniqSet Id       -- Local vars in scope
386             -> Bag ErrMsg       -- Error messages so far
387             -> (a, Bag ErrMsg)  -- Result and error messages (if any)
388
389 type ErrMsg = PprStyle -> Pretty
390
391 data LintLocInfo
392   = RhsOf Id            -- The variable bound
393   | LambdaBodyOf Id     -- The lambda-binder
394   | BodyOfLetRec [Id]   -- One of the binders
395   | ImportedUnfolding SrcLoc -- Some imported unfolding (ToDo: say which)
396
397 instance Outputable LintLocInfo where
398     ppr sty (RhsOf v)
399       = ppBesides [ppr sty (getSrcLoc v), ppStr ": [RHS of ", pp_binders sty [v], ppStr "]"]
400
401     ppr sty (LambdaBodyOf b)
402       = ppBesides [ppr sty (getSrcLoc b),
403                 ppStr ": [in body of lambda with binder ", pp_binder sty b, ppStr "]"]
404
405     ppr sty (BodyOfLetRec bs)
406       = ppBesides [ppr sty (getSrcLoc (head bs)),
407                 ppStr ": [in body of letrec with binders ", pp_binders sty bs, ppStr "]"]
408
409     ppr sty (ImportedUnfolding locn)
410       = ppBeside (ppr sty locn) (ppStr ": [in an imported unfolding]")
411
412 pp_binders :: PprStyle -> [Id] -> Pretty
413 pp_binders sty bs = ppInterleave ppComma (map (pp_binder sty) bs)
414
415 pp_binder :: PprStyle -> Id -> Pretty
416 pp_binder sty b = ppCat [ppr sty b, ppStr "::", ppr sty (idType b)]
417 \end{code}
418
419 \begin{code}
420 initL :: LintM a -> Bool -> Maybe ErrMsg
421 initL m spec_done
422   = case (m spec_done [] emptyUniqSet emptyBag) of { (_, errs) ->
423     if isEmptyBag errs then
424         Nothing
425     else
426         Just ( \ sty ->
427           ppAboves [ msg sty | msg <- bagToList errs ]
428         )
429     }
430
431 returnL :: a -> LintM a
432 returnL r spec loc scope errs = (r, errs)
433
434 thenL :: LintM a -> (a -> LintM b) -> LintM b
435 thenL m k spec loc scope errs
436   = case m spec loc scope errs of
437       (r, errs') -> k r spec loc scope errs'
438
439 seqL :: LintM a -> LintM b -> LintM b
440 seqL m k spec loc scope errs
441   = case m spec loc scope errs of
442       (_, errs') -> k spec loc scope errs'
443
444 thenMaybeL :: LintM (Maybe a) -> (a -> LintM (Maybe b)) -> LintM (Maybe b)
445 thenMaybeL m k spec loc scope errs
446   = case m spec loc scope errs of
447       (Nothing, errs2) -> (Nothing, errs2)
448       (Just r,  errs2) -> k r spec loc scope errs2
449
450 seqMaybeL :: LintM (Maybe a) -> LintM (Maybe b) -> LintM (Maybe b)
451 seqMaybeL m k spec loc scope errs
452   = case m spec loc scope errs of
453       (Nothing, errs2) -> (Nothing, errs2)
454       (Just _,  errs2) -> k spec loc scope errs2
455
456 mapL :: (a -> LintM b) -> [a] -> LintM [b]
457 mapL f [] = returnL []
458 mapL f (x:xs)
459   = f x         `thenL` \ r ->
460     mapL f xs   `thenL` \ rs ->
461     returnL (r:rs)
462
463 mapMaybeL :: (a -> LintM (Maybe b)) -> [a] -> LintM (Maybe [b])
464         -- Returns Nothing if anything fails
465 mapMaybeL f [] = returnL (Just [])
466 mapMaybeL f (x:xs)
467   = f x             `thenMaybeL` \ r ->
468     mapMaybeL f xs  `thenMaybeL` \ rs ->
469     returnL (Just (r:rs))
470 \end{code}
471
472 \begin{code}
473 checkL :: Bool -> ErrMsg -> LintM ()
474 checkL True  msg spec loc scope errs = ((), errs)
475 checkL False msg spec loc scope errs = ((), addErr errs msg loc)
476
477 checkIfSpecDoneL :: Bool -> ErrMsg -> LintM ()
478 checkIfSpecDoneL True  msg spec  loc scope errs = ((), errs)
479 checkIfSpecDoneL False msg True  loc scope errs = ((), addErr errs msg loc)
480 checkIfSpecDoneL False msg False loc scope errs = ((), errs)
481
482 addErrIfL pred spec
483   = if pred then addErrL spec else returnL ()
484
485 addErrL :: ErrMsg -> LintM ()
486 addErrL msg spec loc scope errs = ((), addErr errs msg loc)
487
488 addErr :: Bag ErrMsg -> ErrMsg -> [LintLocInfo] -> Bag ErrMsg
489
490 addErr errs_so_far msg locs
491   = ASSERT (not (null locs))
492     errs_so_far `snocBag` ( \ sty ->
493     ppHang (ppr sty (head locs)) 4 (msg sty)
494     )
495
496 addLoc :: LintLocInfo -> LintM a -> LintM a
497 addLoc extra_loc m spec loc scope errs
498   = m spec (extra_loc:loc) scope errs
499
500 addInScopeVars :: [Id] -> LintM a -> LintM a
501 addInScopeVars ids m spec loc scope errs
502   = -- We check if these "new" ids are already
503     -- in scope, i.e., we have *shadowing* going on.
504     -- For now, it's just a "trace"; we may make
505     -- a real error out of it...
506     let
507         new_set = mkUniqSet ids
508
509         shadowed = scope `intersectUniqSets` new_set
510     in
511 --  After adding -fliberate-case, Simon decided he likes shadowed
512 --  names after all.  WDP 94/07
513 --  (if isEmptyUniqSet shadowed
514 --  then id
515 --  else pprTrace "Shadowed vars:" (ppr PprDebug (uniqSetToList shadowed))) (
516     m spec loc (scope `unionUniqSets` new_set) errs
517 --  )
518 \end{code}
519
520 \begin{code}
521 checkInScope :: Id -> LintM ()
522 checkInScope id spec loc scope errs
523   = if isLocallyDefined id && not (id `elementOfUniqSet` scope) then
524       ((),addErr errs (\sty -> ppCat [ppr sty id,ppStr "is out of scope"]) loc)
525     else
526       ((),errs)
527
528 checkTys :: Type -> Type -> ErrMsg -> LintM ()
529 checkTys ty1 ty2 msg spec loc scope errs
530   = if ty1 `eqTy` ty2 then ((), errs) else ((), addErr errs msg loc)
531 \end{code}
532
533 \begin{code}
534 mkCaseAltMsg :: CoreCaseAlts -> ErrMsg
535 mkCaseAltMsg alts sty
536   = ppAbove (ppStr "Type of case alternatives not the same:")
537             (ppr sty alts)
538
539 mkCaseDataConMsg :: CoreExpr -> ErrMsg
540 mkCaseDataConMsg expr sty
541   = ppAbove (ppStr "A case scrutinee not of data constructor type:")
542             (pp_expr sty expr)
543
544 mkCaseNotPrimMsg :: TyCon -> ErrMsg
545 mkCaseNotPrimMsg tycon sty
546   = ppAbove (ppStr "A primitive case on a non-primitive type:")
547             (ppr sty tycon)
548
549 mkCasePrimMsg :: TyCon -> ErrMsg
550 mkCasePrimMsg tycon sty
551   = ppAbove (ppStr "An algebraic case on a primitive type:")
552             (ppr sty tycon)
553
554 mkCaseAbstractMsg :: TyCon -> ErrMsg
555 mkCaseAbstractMsg tycon sty
556   = ppAbove (ppStr "An algebraic case on some weird type:")
557             (ppr sty tycon)
558
559 mkDefltMsg :: CoreCaseDefault -> ErrMsg
560 mkDefltMsg deflt sty
561   = ppAbove (ppStr "Binder in case default doesn't match type of scrutinee:")
562             (ppr sty deflt)
563
564 mkAppMsg :: Type -> Type -> CoreExpr -> ErrMsg
565 mkAppMsg fun arg expr sty
566   = ppAboves [ppStr "Argument values doesn't match argument type:",
567               ppHang (ppStr "Fun type:") 4 (ppr sty fun),
568               ppHang (ppStr "Arg type:") 4 (ppr sty arg),
569               ppHang (ppStr "Expression:") 4 (pp_expr sty expr)]
570
571 mkTyAppMsg :: Type -> Type -> CoreExpr -> ErrMsg
572 mkTyAppMsg ty arg expr sty
573   = ppAboves [ppStr "Illegal type application:",
574               ppHang (ppStr "Exp type:")   4 (ppr sty ty),
575               ppHang (ppStr "Arg type:")   4 (ppr sty arg),
576               ppHang (ppStr "Expression:") 4 (pp_expr sty expr)]
577
578 mkUsageAppMsg :: Type -> Usage -> CoreExpr -> ErrMsg
579 mkUsageAppMsg ty u expr sty
580   = ppAboves [ppStr "Illegal usage application:",
581               ppHang (ppStr "Exp type:") 4 (ppr sty ty),
582               ppHang (ppStr "Usage exp:") 4 (ppr sty u),
583               ppHang (ppStr "Expression:") 4 (pp_expr sty expr)]
584
585 mkAlgAltMsg1 :: Type -> ErrMsg
586 mkAlgAltMsg1 ty sty
587   = ppAbove (ppStr "In some case statement, type of scrutinee is not a data type:")
588             (ppr sty ty)
589
590 mkAlgAltMsg2 :: Type -> Id -> ErrMsg
591 mkAlgAltMsg2 ty con sty
592   = ppAboves [
593         ppStr "In some algebraic case alternative, constructor is not a constructor of scrutinee type:",
594         ppr sty ty,
595         ppr sty con
596     ]
597
598 mkAlgAltMsg3 :: Id -> [Id] -> ErrMsg
599 mkAlgAltMsg3 con alts sty
600   = ppAboves [
601         ppStr "In some algebraic case alternative, number of arguments doesn't match constructor:",
602         ppr sty con,
603         ppr sty alts
604     ]
605
606 mkAlgAltMsg4 :: Type -> Id -> ErrMsg
607 mkAlgAltMsg4 ty arg sty
608   = ppAboves [
609         ppStr "In some algebraic case alternative, type of argument doesn't match data constructor:",
610         ppr sty ty,
611         ppr sty arg
612     ]
613
614 mkPrimAltMsg :: (Literal, CoreExpr) -> ErrMsg
615 mkPrimAltMsg alt sty
616   = ppAbove
617     (ppStr "In a primitive case alternative, type of literal doesn't match type of scrutinee:")
618             (ppr sty alt)
619
620 mkRhsMsg :: Id -> Type -> ErrMsg
621 mkRhsMsg binder ty sty
622   = ppAboves
623     [ppCat [ppStr "The type of this binder doesn't match the type of its RHS:",
624             ppr sty binder],
625      ppCat [ppStr "Binder's type:", ppr sty (idType binder)],
626      ppCat [ppStr "Rhs type:", ppr sty ty]]
627
628 mkRhsPrimMsg :: Id -> CoreExpr -> ErrMsg
629 mkRhsPrimMsg binder rhs sty
630   = ppAboves [ppCat [ppStr "The type of this binder is primitive:",
631                      ppr sty binder],
632               ppCat [ppStr "Binder's type:", ppr sty (idType binder)]
633              ]
634
635 mkSpecTyAppMsg :: CoreArg -> ErrMsg
636 mkSpecTyAppMsg arg sty
637   = ppAbove
638       (ppStr "Unboxed types in a type application (after specialisation):")
639       (ppr sty arg)
640
641 pp_expr :: PprStyle -> CoreExpr -> Pretty
642 pp_expr sty expr
643   = pprCoreExpr sty (pprBigCoreBinder sty) (pprTypedCoreBinder sty) (pprTypedCoreBinder sty) expr
644 \end{code}