2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1996
4 \section[CoreLint]{A ``lint'' pass to check for Core correctness}
7 #include "HsVersions.h"
19 import Kind ( hasMoreBoxityInfo, Kind{-instance-} )
20 import Literal ( literalType, Literal{-instance-} )
21 import Id ( idType, isBottomingId, dataConRepType,
22 dataConArgTys, GenId{-instances-},
23 emptyIdSet, mkIdSet, intersectIdSets,
24 unionIdSets, elementOfIdSet, SYN_IE(IdSet)
26 import Maybes ( catMaybes )
27 import Name ( isLocallyDefined, getSrcLoc, Name{-instance NamedThing-} )
28 import Outputable ( Outputable(..){-instance * []-} )
30 import PprStyle ( PprStyle(..) )
31 import PprType ( GenType, GenTyVar, TyCon )
33 import PrimOp ( primOpType, PrimOp(..) )
34 import PrimRep ( PrimRep(..) )
35 import SrcLoc ( SrcLoc )
36 import Type ( mkFunTy,getFunTy_maybe,mkForAllTy,mkForAllTys,getForAllTy_maybe,
37 getFunTyExpandingDicts_maybe,
38 getForAllTyExpandingDicts_maybe,
39 isPrimType,typeKind,instantiateTy,splitSigmaTy,
40 mkForAllUsageTy,getForAllUsageTy,instantiateUsage,
41 maybeAppDataTyConExpandingDicts, eqTy
42 -- ,expandTy -- ToDo:rm
44 import TyCon ( isPrimTyCon )
45 import TyVar ( tyVarKind, GenTyVar{-instances-} )
46 import Unique ( Unique )
47 import Usage ( GenUsage, SYN_IE(Usage) )
48 import Util ( zipEqual, pprTrace, pprPanic, assertPanic, panic )
50 infixr 9 `thenL`, `seqL`, `thenMaybeL`, `seqMaybeL`
53 %************************************************************************
55 \subsection[lintCoreBindings]{@lintCoreBindings@: Top-level interface}
57 %************************************************************************
59 Checks that a set of core bindings is well-formed. The PprStyle and String
60 just control what we print in the event of an error. The Bool value
61 indicates whether we have done any specialisation yet (in which case we do
66 (b) Out-of-scope type variables
67 (c) Out-of-scope local variables
70 If we have done specialisation the we check that there are
71 (a) No top-level bindings of primitive (unboxed type)
76 -- Things are *not* OK if:
78 -- * Unsaturated type app before specialisation has been done;
80 -- * Oversaturated type app after specialisation (eta reduction
81 -- may well be happening...);
83 -- Note: checkTyApp is usually followed by a call to checkSpecTyApp.
88 :: PprStyle -> String -> Bool -> [CoreBinding] -> [CoreBinding]
90 lintCoreBindings sty whoDunnit spec_done binds
91 = case (initL (lint_binds binds) spec_done) of
94 pprPanic "" (ppAboves [
95 ppStr ("*** Core Lint Errors: in " ++ whoDunnit ++ " ***"),
97 ppPStr SLIT("*** Offending Program ***"),
98 ppAboves (map (pprCoreBinding sty) binds),
99 ppPStr SLIT("*** End of Offense ***")
102 lint_binds [] = returnL ()
103 lint_binds (bind:binds)
104 = lintCoreBinding bind `thenL` \binders ->
105 addInScopeVars binders (lint_binds binds)
108 %************************************************************************
110 \subsection[lintUnfolding]{lintUnfolding}
112 %************************************************************************
114 We use this to check all unfoldings that come in from interfaces
115 (it is very painful to catch errors otherwise):
118 lintUnfolding :: SrcLoc -> CoreExpr -> Maybe CoreExpr
120 lintUnfolding locn expr
122 (initL (addLoc (ImportedUnfolding locn) (lintCoreExpr expr))
123 True{-pretend spec done-})
127 pprTrace "WARNING: Discarded bad unfolding from interface:\n"
128 (ppAboves [msg PprForUser,
129 ppPStr SLIT("*** Bad unfolding ***"),
131 ppPStr SLIT("*** End unfolding ***")])
135 %************************************************************************
137 \subsection[lintCoreBinding]{lintCoreBinding}
139 %************************************************************************
141 Check a core binding, returning the list of variables bound.
144 lintCoreBinding :: CoreBinding -> LintM [Id]
146 lintCoreBinding (NonRec binder rhs)
147 = lintSingleBinding (binder,rhs) `seqL` returnL [binder]
149 lintCoreBinding (Rec pairs)
150 = addInScopeVars binders (
151 mapL lintSingleBinding pairs `seqL` returnL binders
154 binders = [b | (b,_) <- pairs]
156 lintSingleBinding (binder,rhs)
157 = addLoc (RhsOf binder) (
162 -- Check match to RHS type
164 Nothing -> returnL ()
165 Just ty -> checkTys (idType binder) ty (mkRhsMsg binder ty))
168 -- Check (not isPrimType)
169 checkIfSpecDoneL (not (isPrimType (idType binder)))
170 (mkRhsPrimMsg binder rhs)
172 -- We should check the unfolding, if any, but this is tricky because
173 -- the unfolding is a SimplifiableCoreExpr. Give up for now.
177 %************************************************************************
179 \subsection[lintCoreExpr]{lintCoreExpr}
181 %************************************************************************
184 lintCoreExpr :: CoreExpr -> LintM (Maybe Type) -- Nothing if error found
186 lintCoreExpr (Var var) = checkInScope var `seqL` returnL (Just (idType var))
187 lintCoreExpr (Lit lit) = returnL (Just (literalType lit))
188 lintCoreExpr (SCC _ expr) = lintCoreExpr expr
189 lintCoreExpr (Coerce _ ty expr)
190 = lintCoreExpr expr `seqL` returnL (Just ty)
192 lintCoreExpr (Let binds body)
193 = lintCoreBinding binds `thenL` \binders ->
194 if (null binders) then
195 lintCoreExpr body -- Can't add a new source location
197 addLoc (BodyOfLetRec binders)
198 (addInScopeVars binders (lintCoreExpr body))
200 lintCoreExpr e@(Con con args)
201 = lintCoreArgs {-False-} e (dataConRepType con) args
202 -- Note: we don't check for primitive types in these arguments
204 lintCoreExpr e@(Prim op args)
205 = lintCoreArgs {-True-} e (primOpType op) args
206 -- Note: we do check for primitive types in these arguments
208 lintCoreExpr e@(App fun@(Var v) arg) | isBottomingId v
209 = lintCoreExpr fun `thenMaybeL` \ ty -> lintCoreArg {-False-} e ty arg
210 -- Note: we don't check for primitive types in argument to 'error'
212 lintCoreExpr e@(App fun arg)
213 = lintCoreExpr fun `thenMaybeL` \ty -> lintCoreArg {-True-} e ty arg
214 -- Note: we do check for primitive types in this argument
216 lintCoreExpr (Lam (ValBinder var) expr)
217 = addLoc (LambdaBodyOf var)
218 (addInScopeVars [var]
219 (lintCoreExpr expr `thenMaybeL` \ty ->
220 returnL (Just (mkFunTy (idType var) ty))))
222 lintCoreExpr (Lam (TyBinder tyvar) expr)
223 = lintCoreExpr expr `thenMaybeL` \ty ->
224 returnL (Just(mkForAllTy tyvar ty))
225 -- ToDo: Should add in-scope type variable at this point
227 lintCoreExpr e@(Case scrut alts)
228 = lintCoreExpr scrut `thenMaybeL` \ty ->
232 %************************************************************************
234 \subsection[lintCoreArgs]{lintCoreArgs}
236 %************************************************************************
238 The boolean argument indicates whether we should flag type
239 applications to primitive types as being errors.
242 lintCoreArgs :: {-Bool ->-} CoreExpr -> Type -> [CoreArg] -> LintM (Maybe Type)
244 lintCoreArgs _ ty [] = returnL (Just ty)
245 lintCoreArgs e ty (a : args)
246 = lintCoreArg e ty a `thenMaybeL` \ res ->
247 lintCoreArgs e res args
250 %************************************************************************
252 \subsection[lintCoreArg]{lintCoreArg}
254 %************************************************************************
257 lintCoreArg :: {-Bool ->-} CoreExpr -> Type -> CoreArg -> LintM (Maybe Type)
259 lintCoreArg e ty (LitArg lit)
260 = -- Make sure function type matches argument
261 case (getFunTyExpandingDicts_maybe False{-no peeking in newtypes-} ty) of
262 Just (arg,res) | (lit_ty `eqTy` arg) -> returnL(Just res)
263 _ -> addErrL (mkAppMsg ty lit_ty e) `seqL` returnL Nothing
265 lit_ty = literalType lit
267 lintCoreArg e ty (VarArg v)
268 = -- Make sure variable is bound
269 checkInScope v `seqL`
270 -- Make sure function type matches argument
271 case (getFunTyExpandingDicts_maybe False{-as above-} ty) of
272 Just (arg,res) | (var_ty `eqTy` arg) -> returnL(Just res)
273 _ -> addErrL (mkAppMsg ty var_ty e) `seqL` returnL Nothing
277 lintCoreArg e ty a@(TyArg arg_ty)
278 = -- ToDo: Check that ty is well-kinded and has no unbound tyvars
279 case (getForAllTyExpandingDicts_maybe ty) of
280 Nothing -> addErrL (mkTyAppMsg SLIT("Illegal") ty arg_ty e) `seqL` returnL Nothing
284 tyvar_kind = tyVarKind tyvar
285 argty_kind = typeKind arg_ty
287 if argty_kind `hasMoreBoxityInfo` tyvar_kind
288 -- Arg type might be boxed for a function with an uncommitted
289 -- tyvar; notably this is used so that we can give
290 -- error :: forall a:*. String -> a
291 -- and then apply it to both boxed and unboxed types.
293 returnL(Just(instantiateTy [(tyvar,arg_ty)] body))
295 pprTrace "lintCoreArg:kinds:" (ppCat [ppr PprDebug tyvar_kind, ppr PprDebug argty_kind]) $
296 addErrL (mkTyAppMsg SLIT("Kinds not right in") ty arg_ty e) `seqL` returnL Nothing
298 lintCoreArg e ty (UsageArg u)
299 = -- ToDo: Check that usage has no unbound usage variables
300 case (getForAllUsageTy ty) of
301 Just (uvar,bounds,body) ->
302 -- ToDo: Check argument satisfies bounds
303 returnL(Just(panic "lintCoreArg:instantiateUsage uvar u body"))
304 _ -> addErrL (mkUsageAppMsg ty u e) `seqL` returnL Nothing
307 %************************************************************************
309 \subsection[lintCoreAlts]{lintCoreAlts}
311 %************************************************************************
314 lintCoreAlts :: CoreCaseAlts
315 -> Type -- Type of scrutinee
316 -- -> TyCon -- TyCon pinned on the case
317 -> LintM (Maybe Type) -- Type of alternatives
319 lintCoreAlts whole_alts@(AlgAlts alts deflt) ty --tycon
320 = -- Check tycon is not a primitive tycon
321 -- addErrIfL (isPrimTyCon tycon) (mkCasePrimMsg tycon)
323 -- Check we are scrutinising a proper datatype
325 -- addErrIfL (not (tyConFamilySize tycon >= 1)) (mkCaseAbstractMsg tycon)
328 `thenL` \maybe_deflt_ty ->
329 mapL (lintAlgAlt ty {-tycon-}) alts
330 `thenL` \maybe_alt_tys ->
331 -- Check the result types
332 case catMaybes (maybe_deflt_ty : maybe_alt_tys) of
333 [] -> returnL Nothing
335 (first_ty:tys) -> mapL check tys `seqL`
336 returnL (Just first_ty)
338 check ty = checkTys first_ty ty (mkCaseAltMsg whole_alts)
340 lintCoreAlts whole_alts@(PrimAlts alts deflt) ty --tycon
341 = -- Check tycon is a primitive tycon
342 -- addErrIfL (not (isPrimTyCon tycon)) (mkCaseNotPrimMsg tycon)
344 mapL (lintPrimAlt ty) alts
345 `thenL` \maybe_alt_tys ->
347 `thenL` \maybe_deflt_ty ->
348 -- Check the result types
349 case catMaybes (maybe_deflt_ty : maybe_alt_tys) of
350 [] -> returnL Nothing
352 (first_ty:tys) -> mapL check tys `seqL`
353 returnL (Just first_ty)
355 check ty = checkTys first_ty ty (mkCaseAltMsg whole_alts)
357 lintAlgAlt scrut_ty {-tycon-ToDo: use it!-} (con,args,rhs)
358 = (case maybeAppDataTyConExpandingDicts scrut_ty of
360 addErrL (mkAlgAltMsg1 scrut_ty)
361 Just (tycon, tys_applied, cons) ->
363 arg_tys = dataConArgTys con tys_applied
365 checkL (con `elem` cons) (mkAlgAltMsg2 scrut_ty con) `seqL`
366 checkL (length arg_tys == length args) (mkAlgAltMsg3 con args)
368 mapL check (zipEqual "lintAlgAlt" arg_tys args) `seqL`
371 addInScopeVars args (
375 check (ty, arg) = checkTys ty (idType arg) (mkAlgAltMsg4 ty arg)
377 -- elem: yes, the elem-list here can sometimes be long-ish,
378 -- but as it's use-once, probably not worth doing anything different
379 -- We give it its own copy, so it isn't overloaded.
381 elem x (y:ys) = x==y || elem x ys
383 lintPrimAlt ty alt@(lit,rhs)
384 = checkTys (literalType lit) ty (mkPrimAltMsg alt) `seqL`
387 lintDeflt NoDefault _ = returnL Nothing
388 lintDeflt deflt@(BindDefault binder rhs) ty
389 = checkTys (idType binder) ty (mkDefltMsg deflt) `seqL`
390 addInScopeVars [binder] (lintCoreExpr rhs)
393 %************************************************************************
395 \subsection[lint-monad]{The Lint monad}
397 %************************************************************************
400 type LintM a = Bool -- True <=> specialisation has been done
401 -> [LintLocInfo] -- Locations
402 -> IdSet -- Local vars in scope
403 -> Bag ErrMsg -- Error messages so far
404 -> (a, Bag ErrMsg) -- Result and error messages (if any)
406 type ErrMsg = PprStyle -> Pretty
409 = RhsOf Id -- The variable bound
410 | LambdaBodyOf Id -- The lambda-binder
411 | BodyOfLetRec [Id] -- One of the binders
412 | ImportedUnfolding SrcLoc -- Some imported unfolding (ToDo: say which)
414 instance Outputable LintLocInfo where
416 = ppBesides [ppr sty (getSrcLoc v), ppPStr SLIT(": [RHS of "), pp_binders sty [v], ppChar ']']
418 ppr sty (LambdaBodyOf b)
419 = ppBesides [ppr sty (getSrcLoc b),
420 ppPStr SLIT(": [in body of lambda with binder "), pp_binder sty b, ppChar ']']
422 ppr sty (BodyOfLetRec bs)
423 = ppBesides [ppr sty (getSrcLoc (head bs)),
424 ppPStr SLIT(": [in body of letrec with binders "), pp_binders sty bs, ppChar ']']
426 ppr sty (ImportedUnfolding locn)
427 = ppBeside (ppr sty locn) (ppPStr SLIT(": [in an imported unfolding]"))
429 pp_binders :: PprStyle -> [Id] -> Pretty
430 pp_binders sty bs = ppInterleave ppComma (map (pp_binder sty) bs)
432 pp_binder :: PprStyle -> Id -> Pretty
433 pp_binder sty b = ppCat [ppr sty b, ppStr "::", ppr sty (idType b)]
437 initL :: LintM a -> Bool -> Maybe ErrMsg
439 = case (m spec_done [] emptyIdSet emptyBag) of { (_, errs) ->
440 if isEmptyBag errs then
444 ppAboves [ msg sty | msg <- bagToList errs ]
448 returnL :: a -> LintM a
449 returnL r spec loc scope errs = (r, errs)
451 thenL :: LintM a -> (a -> LintM b) -> LintM b
452 thenL m k spec loc scope errs
453 = case m spec loc scope errs of
454 (r, errs') -> k r spec loc scope errs'
456 seqL :: LintM a -> LintM b -> LintM b
457 seqL m k spec loc scope errs
458 = case m spec loc scope errs of
459 (_, errs') -> k spec loc scope errs'
461 thenMaybeL :: LintM (Maybe a) -> (a -> LintM (Maybe b)) -> LintM (Maybe b)
462 thenMaybeL m k spec loc scope errs
463 = case m spec loc scope errs of
464 (Nothing, errs2) -> (Nothing, errs2)
465 (Just r, errs2) -> k r spec loc scope errs2
467 seqMaybeL :: LintM (Maybe a) -> LintM (Maybe b) -> LintM (Maybe b)
468 seqMaybeL m k spec loc scope errs
469 = case m spec loc scope errs of
470 (Nothing, errs2) -> (Nothing, errs2)
471 (Just _, errs2) -> k spec loc scope errs2
473 mapL :: (a -> LintM b) -> [a] -> LintM [b]
474 mapL f [] = returnL []
477 mapL f xs `thenL` \ rs ->
480 mapMaybeL :: (a -> LintM (Maybe b)) -> [a] -> LintM (Maybe [b])
481 -- Returns Nothing if anything fails
482 mapMaybeL f [] = returnL (Just [])
484 = f x `thenMaybeL` \ r ->
485 mapMaybeL f xs `thenMaybeL` \ rs ->
486 returnL (Just (r:rs))
490 checkL :: Bool -> ErrMsg -> LintM ()
491 checkL True msg spec loc scope errs = ((), errs)
492 checkL False msg spec loc scope errs = ((), addErr errs msg loc)
494 checkIfSpecDoneL :: Bool -> ErrMsg -> LintM ()
495 checkIfSpecDoneL True msg spec loc scope errs = ((), errs)
496 checkIfSpecDoneL False msg True loc scope errs = ((), addErr errs msg loc)
497 checkIfSpecDoneL False msg False loc scope errs = ((), errs)
500 = if pred then addErrL spec else returnL ()
502 addErrL :: ErrMsg -> LintM ()
503 addErrL msg spec loc scope errs = ((), addErr errs msg loc)
505 addErr :: Bag ErrMsg -> ErrMsg -> [LintLocInfo] -> Bag ErrMsg
507 addErr errs_so_far msg locs
508 = ASSERT (not (null locs))
509 errs_so_far `snocBag` ( \ sty ->
510 ppHang (ppr sty (head locs)) 4 (msg sty)
513 addLoc :: LintLocInfo -> LintM a -> LintM a
514 addLoc extra_loc m spec loc scope errs
515 = m spec (extra_loc:loc) scope errs
517 addInScopeVars :: [Id] -> LintM a -> LintM a
518 addInScopeVars ids m spec loc scope errs
519 = -- We check if these "new" ids are already
520 -- in scope, i.e., we have *shadowing* going on.
521 -- For now, it's just a "trace"; we may make
522 -- a real error out of it...
524 new_set = mkIdSet ids
526 -- shadowed = scope `intersectIdSets` new_set
528 -- After adding -fliberate-case, Simon decided he likes shadowed
529 -- names after all. WDP 94/07
530 -- (if isEmptyUniqSet shadowed
532 -- else pprTrace "Shadowed vars:" (ppr PprDebug (uniqSetToList shadowed))) (
533 m spec loc (scope `unionIdSets` new_set) errs
538 checkInScope :: Id -> LintM ()
539 checkInScope id spec loc scope errs
543 if isLocallyDefined id_name && not (id `elementOfIdSet` scope) then
544 ((),addErr errs (\sty -> ppCat [ppr sty id, ppPStr SLIT("is out of scope")]) loc)
548 checkTys :: Type -> Type -> ErrMsg -> LintM ()
549 checkTys ty1 ty2 msg spec loc scope errs
550 = if ty1 `eqTy` ty2 then ((), errs) else ((), addErr errs msg loc)
554 mkCaseAltMsg :: CoreCaseAlts -> ErrMsg
555 mkCaseAltMsg alts sty
556 = ppAbove (ppPStr SLIT("Type of case alternatives not the same:"))
559 mkCaseDataConMsg :: CoreExpr -> ErrMsg
560 mkCaseDataConMsg expr sty
561 = ppAbove (ppPStr SLIT("A case scrutinee not of data constructor type:"))
564 mkCaseNotPrimMsg :: TyCon -> ErrMsg
565 mkCaseNotPrimMsg tycon sty
566 = ppAbove (ppPStr SLIT("A primitive case on a non-primitive type:"))
569 mkCasePrimMsg :: TyCon -> ErrMsg
570 mkCasePrimMsg tycon sty
571 = ppAbove (ppPStr SLIT("An algebraic case on a primitive type:"))
574 mkCaseAbstractMsg :: TyCon -> ErrMsg
575 mkCaseAbstractMsg tycon sty
576 = ppAbove (ppPStr SLIT("An algebraic case on some weird type:"))
579 mkDefltMsg :: CoreCaseDefault -> ErrMsg
581 = ppAbove (ppPStr SLIT("Binder in case default doesn't match type of scrutinee:"))
584 mkAppMsg :: Type -> Type -> CoreExpr -> ErrMsg
585 mkAppMsg fun arg expr sty
586 = ppAboves [ppPStr SLIT("Argument value doesn't match argument type:"),
587 ppHang (ppPStr SLIT("Fun type:")) 4 (ppr sty fun),
588 ppHang (ppPStr SLIT("Arg type:")) 4 (ppr sty arg),
589 ppHang (ppPStr SLIT("Expression:")) 4 (pp_expr sty expr)]
591 mkTyAppMsg :: FAST_STRING -> Type -> Type -> CoreExpr -> ErrMsg
592 mkTyAppMsg msg ty arg expr sty
593 = ppAboves [ppCat [ppPStr msg, ppPStr SLIT("type application:")],
594 ppHang (ppPStr SLIT("Exp type:")) 4 (ppr sty ty),
595 ppHang (ppPStr SLIT("Arg type:")) 4 (ppr sty arg),
596 ppHang (ppPStr SLIT("Expression:")) 4 (pp_expr sty expr)]
598 mkUsageAppMsg :: Type -> Usage -> CoreExpr -> ErrMsg
599 mkUsageAppMsg ty u expr sty
600 = ppAboves [ppPStr SLIT("Illegal usage application:"),
601 ppHang (ppPStr SLIT("Exp type:")) 4 (ppr sty ty),
602 ppHang (ppPStr SLIT("Usage exp:")) 4 (ppr sty u),
603 ppHang (ppPStr SLIT("Expression:")) 4 (pp_expr sty expr)]
605 mkAlgAltMsg1 :: Type -> ErrMsg
607 = ppAbove (ppStr "In some case statement, type of scrutinee is not a data type:")
609 -- (ppAbove (ppr sty ty) (ppr sty (expandTy ty))) -- ToDo: rm
611 mkAlgAltMsg2 :: Type -> Id -> ErrMsg
612 mkAlgAltMsg2 ty con sty
614 ppStr "In some algebraic case alternative, constructor is not a constructor of scrutinee type:",
619 mkAlgAltMsg3 :: Id -> [Id] -> ErrMsg
620 mkAlgAltMsg3 con alts sty
622 ppStr "In some algebraic case alternative, number of arguments doesn't match constructor:",
627 mkAlgAltMsg4 :: Type -> Id -> ErrMsg
628 mkAlgAltMsg4 ty arg sty
630 ppStr "In some algebraic case alternative, type of argument doesn't match data constructor:",
635 mkPrimAltMsg :: (Literal, CoreExpr) -> ErrMsg
638 (ppStr "In a primitive case alternative, type of literal doesn't match type of scrutinee:")
641 mkRhsMsg :: Id -> Type -> ErrMsg
642 mkRhsMsg binder ty sty
644 [ppCat [ppPStr SLIT("The type of this binder doesn't match the type of its RHS:"),
646 ppCat [ppPStr SLIT("Binder's type:"), ppr sty (idType binder)],
647 ppCat [ppPStr SLIT("Rhs type:"), ppr sty ty]]
649 mkRhsPrimMsg :: Id -> CoreExpr -> ErrMsg
650 mkRhsPrimMsg binder rhs sty
651 = ppAboves [ppCat [ppPStr SLIT("The type of this binder is primitive:"),
653 ppCat [ppPStr SLIT("Binder's type:"), ppr sty (idType binder)]
656 mkSpecTyAppMsg :: CoreArg -> ErrMsg
657 mkSpecTyAppMsg arg sty
659 (ppPStr SLIT("Unboxed types in a type application (after specialisation):"))
662 pp_expr :: PprStyle -> CoreExpr -> Pretty
664 = pprCoreExpr sty (pprBigCoreBinder sty) (pprTypedCoreBinder sty) (pprTypedCoreBinder sty) expr