2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[DsUtils]{Utilities for desugaring}
6 This module exports some utility functions of no great interest.
10 CanItFail(..), EquationInfo(..), MatchResult(..),
17 cantFailMatchResult, extractMatchResult,
19 adjustMatchResult, adjustMatchResultDs,
20 mkCoLetsMatchResult, mkGuardedMatchResult,
21 mkCoPrimCaseMatchResult, mkCoAlgCaseMatchResult,
23 mkErrorAppDs, mkNilExpr, mkConsExpr,
25 mkSelectorBinds, mkTupleExpr, mkTupleSelector,
30 #include "HsVersions.h"
32 import {-# SOURCE #-} Match ( matchSimply )
34 import HsSyn ( OutPat(..) )
35 import TcHsSyn ( TypecheckedPat )
36 import DsHsSyn ( outPatType, collectTypedPatBinders )
41 import CoreUtils ( coreExprType )
42 import PrelInfo ( iRREFUT_PAT_ERROR_ID )
43 import Id ( idType, Id, mkWildId )
44 import Const ( Literal(..), Con(..) )
45 import TyCon ( isNewTyCon, tyConDataCons )
46 import DataCon ( DataCon, StrictnessMark, maybeMarkedUnboxed, dataConStrictMarks,
47 dataConId, splitProductType_maybe
49 import Type ( mkFunTy, isUnLiftedType, splitAlgTyConApp, unUsgTy,
52 import TysWiredIn ( unitDataCon, tupleCon, stringTy, unitTy, unitDataCon,
53 nilDataCon, consDataCon
55 import UniqSet ( mkUniqSet, minusUniqSet, isEmptyUniqSet, UniqSet )
61 %************************************************************************
63 \subsection{Tidying lit pats}
65 %************************************************************************
68 tidyLitPat lit lit_ty default_pat
69 | lit_ty == charTy = ConPat charDataCon lit_ty [] [] [LitPat (mk_char lit) charPrimTy]
70 | lit_ty == intTy = ConPat intDataCon lit_ty [] [] [LitPat (mk_int lit) intPrimTy]
71 | lit_ty == wordTy = ConPat wordDataCon lit_ty [] [] [LitPat (mk_word lit) wordPrimTy]
72 | lit_ty == addrTy = ConPat addrDataCon lit_ty [] [] [LitPat (mk_addr lit) addrPrimTy]
73 | lit_ty == floatTy = ConPat floatDataCon lit_ty [] [] [LitPat (mk_float lit) floatPrimTy]
74 | lit_ty == doubleTy = ConPat doubleDataCon lit_ty [] [] [LitPat (mk_double lit) doublePrimTy]
76 -- Convert the literal pattern "" to the constructor pattern [].
77 | null_str_lit lit = ConPat nilDataCon lit_ty [] [] []
78 -- Similar special case for "x"
79 | one_str_lit lit = ConPat consDataCon lit_ty [] []
80 [mk_first_char_lit lit, ConPat nilDataCon lit_ty [] [] []]
82 | otherwise = default_pat
85 mk_int (HsInt i) = HsIntPrim i
86 mk_int l@(HsLitLit s) = l
88 mk_char (HsChar c) = HsCharPrim c
89 mk_char l@(HsLitLit s) = l
91 mk_word l@(HsLitLit s) = l
93 mk_addr l@(HsLitLit s) = l
95 mk_float (HsInt i) = HsFloatPrim (fromInteger i)
96 mk_float (HsFrac f) = HsFloatPrim f
97 mk_float l@(HsLitLit s) = l
99 mk_double (HsInt i) = HsDoublePrim (fromInteger i)
100 mk_double (HsFrac f) = HsDoublePrim f
101 mk_double l@(HsLitLit s) = l
103 null_str_lit (HsString s) = _NULL_ s
104 null_str_lit other_lit = False
106 one_str_lit (HsString s) = _LENGTH_ s == (1::Int)
107 one_str_lit other_lit = False
108 mk_first_char_lit (HsString s) = ConPat charDataCon charTy [] [] [LitPat (HsCharPrim (_HEAD_ s))]
112 %************************************************************************
114 \subsection{Building lets}
116 %************************************************************************
118 Use case, not let for unlifted types. The simplifier will turn some
122 mkDsLet :: CoreBind -> CoreExpr -> CoreExpr
123 mkDsLet (NonRec bndr rhs) body
124 | isUnLiftedType (idType bndr) = Case rhs bndr [(DEFAULT,[],body)]
128 mkDsLets :: [CoreBind] -> CoreExpr -> CoreExpr
129 mkDsLets binds body = foldr mkDsLet body binds
133 %************************************************************************
135 \subsection{ Selecting match variables}
137 %************************************************************************
139 We're about to match against some patterns. We want to make some
140 @Ids@ to use as match variables. If a pattern has an @Id@ readily at
141 hand, which should indeed be bound to the pattern as a whole, then use it;
142 otherwise, make one up.
145 selectMatchVar :: TypecheckedPat -> DsM Id
146 selectMatchVar (VarPat var) = returnDs var
147 selectMatchVar (AsPat var pat) = returnDs var
148 selectMatchVar (LazyPat pat) = selectMatchVar pat
149 selectMatchVar other_pat = newSysLocalDs (outPatType other_pat) -- OK, better make up one...
153 %************************************************************************
155 %* type synonym EquationInfo and access functions for its pieces *
157 %************************************************************************
158 \subsection[EquationInfo-synonym]{@EquationInfo@: a useful synonym}
160 The ``equation info'' used by @match@ is relatively complicated and
161 worthy of a type synonym and a few handy functions.
166 type EqnSet = UniqSet EqnNo
170 EqnNo -- The number of the equation
172 DsMatchContext -- The context info is used when producing warnings
173 -- about shadowed patterns. It's the context
174 -- of the *first* thing matched in this group.
175 -- Should perhaps be a list of them all!
177 [TypecheckedPat] -- The patterns for an eqn
179 MatchResult -- Encapsulates the guards and bindings
185 CanItFail -- Tells whether the failure expression is used
186 (CoreExpr -> DsM CoreExpr)
187 -- Takes a expression to plug in at the
188 -- failure point(s). The expression should
191 data CanItFail = CanFail | CantFail
193 orFail CantFail CantFail = CantFail
197 Functions on MatchResults
200 cantFailMatchResult :: CoreExpr -> MatchResult
201 cantFailMatchResult expr = MatchResult CantFail (\ ignore -> returnDs expr)
203 extractMatchResult :: MatchResult -> CoreExpr -> DsM CoreExpr
204 extractMatchResult (MatchResult CantFail match_fn) fail_expr
205 = match_fn (error "It can't fail!")
207 extractMatchResult (MatchResult CanFail match_fn) fail_expr
208 = mkFailurePair fail_expr `thenDs` \ (fail_bind, if_it_fails) ->
209 match_fn if_it_fails `thenDs` \ body ->
210 returnDs (mkDsLet fail_bind body)
213 combineMatchResults :: MatchResult -> MatchResult -> MatchResult
214 combineMatchResults (MatchResult CanFail body_fn1)
215 (MatchResult can_it_fail2 body_fn2)
216 = MatchResult can_it_fail2 body_fn
218 body_fn fail = body_fn2 fail `thenDs` \ body2 ->
219 mkFailurePair body2 `thenDs` \ (fail_bind, duplicatable_expr) ->
220 body_fn1 duplicatable_expr `thenDs` \ body1 ->
221 returnDs (Let fail_bind body1)
223 combineMatchResults match_result1@(MatchResult CantFail body_fn1) match_result2
227 adjustMatchResult :: (CoreExpr -> CoreExpr) -> MatchResult -> MatchResult
228 adjustMatchResult encl_fn (MatchResult can_it_fail body_fn)
229 = MatchResult can_it_fail (\fail -> body_fn fail `thenDs` \ body ->
230 returnDs (encl_fn body))
232 adjustMatchResultDs :: (CoreExpr -> DsM CoreExpr) -> MatchResult -> MatchResult
233 adjustMatchResultDs encl_fn (MatchResult can_it_fail body_fn)
234 = MatchResult can_it_fail (\fail -> body_fn fail `thenDs` \ body ->
238 mkCoLetsMatchResult :: [CoreBind] -> MatchResult -> MatchResult
239 mkCoLetsMatchResult binds match_result
240 = adjustMatchResult (mkDsLets binds) match_result
243 mkGuardedMatchResult :: CoreExpr -> MatchResult -> MatchResult
244 mkGuardedMatchResult pred_expr (MatchResult can_it_fail body_fn)
245 = MatchResult CanFail (\fail -> body_fn fail `thenDs` \ body ->
246 returnDs (mkIfThenElse pred_expr body fail))
248 mkCoPrimCaseMatchResult :: Id -- Scrutinee
249 -> [(Literal, MatchResult)] -- Alternatives
251 mkCoPrimCaseMatchResult var match_alts
252 = MatchResult CanFail mk_case
255 = mapDs (mk_alt fail) match_alts `thenDs` \ alts ->
256 returnDs (Case (Var var) var (alts ++ [(DEFAULT, [], fail)]))
258 mk_alt fail (lit, MatchResult _ body_fn) = body_fn fail `thenDs` \ body ->
259 returnDs (Literal lit, [], body)
262 mkCoAlgCaseMatchResult :: Id -- Scrutinee
263 -> [(DataCon, [CoreBndr], MatchResult)] -- Alternatives
266 mkCoAlgCaseMatchResult var match_alts
267 | isNewTyCon tycon -- Newtype case; use a let
268 = ASSERT( newtype_sanity )
269 mkCoLetsMatchResult [coercion_bind] match_result
271 | otherwise -- Datatype case; use a case
272 = MatchResult fail_flag mk_case
275 scrut_ty = idType var
276 (tycon, tycon_arg_tys, _) = splitAlgTyConApp scrut_ty
279 (con_id, arg_ids, match_result) = head match_alts
280 arg_id = head arg_ids
281 coercion_bind = NonRec arg_id
282 (Note (Coerce (unUsgTy (idType arg_id)) (unUsgTy scrut_ty)) (Var var))
283 newtype_sanity = null (tail match_alts) && null (tail arg_ids)
285 -- Stuff for data types
286 data_cons = tyConDataCons tycon
288 match_results = [match_result | (_,_,match_result) <- match_alts]
290 fail_flag | exhaustive_case
291 = foldr1 orFail [can_it_fail | MatchResult can_it_fail _ <- match_results]
295 wild_var = mkWildId (idType var)
296 mk_case fail = mapDs (mk_alt fail) match_alts `thenDs` \ alts ->
297 returnDs (Case (Var var) wild_var (alts ++ mk_default fail))
299 mk_alt fail (con, args, MatchResult _ body_fn)
300 = body_fn fail `thenDs` \ body ->
301 rebuildConArgs con args (dataConStrictMarks con) body
302 `thenDs` \ (body', real_args) ->
303 returnDs (DataCon con, real_args, body')
305 mk_default fail | exhaustive_case = []
306 | otherwise = [(DEFAULT, [], fail)]
308 un_mentioned_constructors
309 = mkUniqSet data_cons `minusUniqSet` mkUniqSet [ con | (con, _, _) <- match_alts]
310 exhaustive_case = isEmptyUniqSet un_mentioned_constructors
313 For each constructor we match on, we might need to re-pack some
314 of the strict fields if they are unpacked in the constructor.
318 :: DataCon -- the con we're matching on
319 -> [Id] -- the source-level args
320 -> [StrictnessMark] -- the strictness annotations (per-arg)
321 -> CoreExpr -- the body
322 -> DsM (CoreExpr, [Id])
324 rebuildConArgs con [] stricts body = returnDs (body, [])
325 rebuildConArgs con (arg:args) stricts body | isTyVar arg
326 = rebuildConArgs con args stricts body `thenDs` \ (body', args') ->
327 returnDs (body',arg:args')
328 rebuildConArgs con (arg:args) (str:stricts) body
329 = rebuildConArgs con args stricts body `thenDs` \ (body', real_args) ->
330 case maybeMarkedUnboxed str of
331 Just (pack_con1, _) ->
332 case splitProductType_maybe (idType arg) of
333 Just (_, tycon_args, pack_con, con_arg_tys) ->
334 ASSERT( pack_con == pack_con1 )
335 newSysLocalsDs con_arg_tys `thenDs` \ unpacked_args ->
337 mkDsLet (NonRec arg (Con (DataCon pack_con)
338 (map Type tycon_args ++
339 map Var unpacked_args))) body',
340 unpacked_args ++ real_args
343 _ -> returnDs (body', arg:real_args)
346 %************************************************************************
348 \subsection{Desugarer's versions of some Core functions}
350 %************************************************************************
353 mkErrorAppDs :: Id -- The error function
354 -> Type -- Type to which it should be applied
355 -> String -- The error message string to pass
358 mkErrorAppDs err_id ty msg
359 = getSrcLocDs `thenDs` \ src_loc ->
361 full_msg = showSDoc (hcat [ppr src_loc, text "|", text msg])
363 returnDs (mkApps (Var err_id) [(Type . unUsgTy) ty, mkStringLit full_msg])
364 -- unUsgTy *required* -- KSW 1999-04-07
367 %************************************************************************
369 \subsection[mkSelectorBind]{Make a selector bind}
371 %************************************************************************
373 This is used in various places to do with lazy patterns.
374 For each binder $b$ in the pattern, we create a binding:
376 b = case v of pat' -> b'
378 where @pat'@ is @pat@ with each binder @b@ cloned into @b'@.
380 ToDo: making these bindings should really depend on whether there's
381 much work to be done per binding. If the pattern is complex, it
382 should be de-mangled once, into a tuple (and then selected from).
383 Otherwise the demangling can be in-line in the bindings (as here).
385 Boring! Boring! One error message per binder. The above ToDo is
386 even more helpful. Something very similar happens for pattern-bound
390 mkSelectorBinds :: TypecheckedPat -- The pattern
391 -> CoreExpr -- Expression to which the pattern is bound
392 -> DsM [(Id,CoreExpr)]
394 mkSelectorBinds (VarPat v) val_expr
395 = returnDs [(v, val_expr)]
397 mkSelectorBinds pat val_expr
398 | length binders == 1 || is_simple_pat pat
399 = newSysLocalDs (coreExprType val_expr) `thenDs` \ val_var ->
401 -- For the error message we don't use mkErrorAppDs to avoid
402 -- duplicating the string literal each time
403 newSysLocalDs stringTy `thenDs` \ msg_var ->
404 getSrcLocDs `thenDs` \ src_loc ->
406 full_msg = showSDoc (hcat [ppr src_loc, text "|", ppr pat])
408 mapDs (mk_bind val_var msg_var) binders `thenDs` \ binds ->
409 returnDs ( (val_var, val_expr) :
410 (msg_var, mkStringLit full_msg) :
415 = mkErrorAppDs iRREFUT_PAT_ERROR_ID tuple_ty (showSDoc (ppr pat))
416 `thenDs` \ error_expr ->
417 matchSimply val_expr LetMatch pat local_tuple error_expr
418 `thenDs` \ tuple_expr ->
419 newSysLocalDs tuple_ty
420 `thenDs` \ tuple_var ->
423 (binder, mkTupleSelector binders binder tuple_var (Var tuple_var))
425 returnDs ( (tuple_var, tuple_expr) : map mk_tup_bind binders )
427 binders = collectTypedPatBinders pat
428 local_tuple = mkTupleExpr binders
429 tuple_ty = coreExprType local_tuple
431 mk_bind scrut_var msg_var bndr_var
432 -- (mk_bind sv bv) generates
433 -- bv = case sv of { pat -> bv; other -> error-msg }
434 -- Remember, pat binds bv
435 = matchSimply (Var scrut_var) LetMatch pat
436 (Var bndr_var) error_expr `thenDs` \ rhs_expr ->
437 returnDs (bndr_var, rhs_expr)
439 binder_ty = idType bndr_var
440 error_expr = mkApps (Var iRREFUT_PAT_ERROR_ID) [Type binder_ty, Var msg_var]
442 is_simple_pat (TuplePat ps True{-boxed-}) = all is_triv_pat ps
443 is_simple_pat (ConPat _ _ _ _ ps) = all is_triv_pat ps
444 is_simple_pat (VarPat _) = True
445 is_simple_pat (RecPat _ _ _ _ ps) = and [is_triv_pat p | (_,p,_) <- ps]
446 is_simple_pat other = False
448 is_triv_pat (VarPat v) = True
449 is_triv_pat (WildPat _) = True
450 is_triv_pat other = False
454 @mkTupleExpr@ builds a tuple; the inverse to @mkTupleSelector@. If it
455 has only one element, it is the identity function. Notice we must
456 throw out any usage annotation on the outside of an Id.
459 mkTupleExpr :: [Id] -> CoreExpr
461 mkTupleExpr [] = mkConApp unitDataCon []
462 mkTupleExpr [id] = Var id
463 mkTupleExpr ids = mkConApp (tupleCon (length ids))
464 (map (Type . unUsgTy . idType) ids ++ [ Var i | i <- ids ])
468 @mkTupleSelector@ builds a selector which scrutises the given
469 expression and extracts the one name from the list given.
470 If you want the no-shadowing rule to apply, the caller
471 is responsible for making sure that none of these names
474 If there is just one id in the ``tuple'', then the selector is
478 mkTupleSelector :: [Id] -- The tuple args
479 -> Id -- The selected one
480 -> Id -- A variable of the same type as the scrutinee
481 -> CoreExpr -- Scrutinee
484 mkTupleSelector [var] should_be_the_same_var scrut_var scrut
485 = ASSERT(var == should_be_the_same_var)
488 mkTupleSelector vars the_var scrut_var scrut
489 = ASSERT( not (null vars) )
490 Case scrut scrut_var [(DataCon (tupleCon (length vars)), vars, Var the_var)]
494 %************************************************************************
496 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
498 %************************************************************************
500 Call the constructor Ids when building explicit lists, so that they
501 interact well with rules.
504 mkNilExpr :: Type -> CoreExpr
505 mkNilExpr ty = App (Var (dataConId nilDataCon)) (Type ty)
507 mkConsExpr :: Type -> CoreExpr -> CoreExpr -> CoreExpr
508 mkConsExpr ty hd tl = mkApps (Var (dataConId consDataCon)) [Type ty, hd, tl]
512 %************************************************************************
514 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
516 %************************************************************************
518 Generally, we handle pattern matching failure like this: let-bind a
519 fail-variable, and use that variable if the thing fails:
521 let fail.33 = error "Help"
532 If the case can't fail, then there'll be no mention of @fail.33@, and the
533 simplifier will later discard it.
536 If it can fail in only one way, then the simplifier will inline it.
539 Only if it is used more than once will the let-binding remain.
542 There's a problem when the result of the case expression is of
543 unboxed type. Then the type of @fail.33@ is unboxed too, and
544 there is every chance that someone will change the let into a case:
550 which is of course utterly wrong. Rather than drop the condition that
551 only boxed types can be let-bound, we just turn the fail into a function
552 for the primitive case:
554 let fail.33 :: Void -> Int#
555 fail.33 = \_ -> error "Help"
564 Now @fail.33@ is a function, so it can be let-bound.
567 mkFailurePair :: CoreExpr -- Result type of the whole case expression
568 -> DsM (CoreBind, -- Binds the newly-created fail variable
569 -- to either the expression or \ _ -> expression
570 CoreExpr) -- Either the fail variable, or fail variable
571 -- applied to unit tuple
574 = newFailLocalDs (unitTy `mkFunTy` ty) `thenDs` \ fail_fun_var ->
575 newSysLocalDs unitTy `thenDs` \ fail_fun_arg ->
576 returnDs (NonRec fail_fun_var (Lam fail_fun_arg expr),
577 App (Var fail_fun_var) (mkConApp unitDataCon []))
580 = newFailLocalDs ty `thenDs` \ fail_var ->
581 returnDs (NonRec fail_var expr, Var fail_var)
583 ty = coreExprType expr