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,
24 mkStringLit, mkStringLitFS,
26 mkSelectorBinds, mkTupleExpr, mkTupleSelector,
31 #include "HsVersions.h"
33 import {-# SOURCE #-} Match ( matchSimply )
36 import TcHsSyn ( TypecheckedPat )
37 import DsHsSyn ( outPatType, collectTypedPatBinders )
42 import CoreUtils ( exprType, mkIfThenElse )
43 import PrelInfo ( iRREFUT_PAT_ERROR_ID )
44 import Id ( idType, Id, mkWildId )
45 import Literal ( Literal(..) )
46 import TyCon ( isNewTyCon, tyConDataCons )
47 import DataCon ( DataCon, StrictnessMark, maybeMarkedUnboxed,
48 dataConStrictMarks, dataConId, splitProductType_maybe
50 import Type ( mkFunTy, isUnLiftedType, splitAlgTyConApp, unUsgTy,
53 import TysPrim ( intPrimTy,
60 import TysWiredIn ( nilDataCon, consDataCon,
63 unitDataConId, unitTy,
66 floatTy, floatDataCon,
67 doubleTy, doubleDataCon,
71 import BasicTypes ( Boxity(..) )
72 import UniqSet ( mkUniqSet, minusUniqSet, isEmptyUniqSet, UniqSet )
73 import Unique ( unpackCStringIdKey, unpackCStringUtf8IdKey )
75 import UnicodeUtil ( stringToUtf8 )
80 %************************************************************************
82 \subsection{Tidying lit pats}
84 %************************************************************************
87 tidyLitPat lit lit_ty default_pat
88 | lit_ty == charTy = ConPat charDataCon lit_ty [] [] [LitPat (mk_char lit) charPrimTy]
89 | lit_ty == intTy = ConPat intDataCon lit_ty [] [] [LitPat (mk_int lit) intPrimTy]
90 | lit_ty == wordTy = ConPat wordDataCon lit_ty [] [] [LitPat (mk_word lit) wordPrimTy]
91 | lit_ty == addrTy = ConPat addrDataCon lit_ty [] [] [LitPat (mk_addr lit) addrPrimTy]
92 | lit_ty == floatTy = ConPat floatDataCon lit_ty [] [] [LitPat (mk_float lit) floatPrimTy]
93 | lit_ty == doubleTy = ConPat doubleDataCon lit_ty [] [] [LitPat (mk_double lit) doublePrimTy]
95 -- Convert short string-literal patterns like "f" to 'f':[]
96 | str_lit lit = mk_list lit
98 | otherwise = default_pat
101 mk_int (HsInt i) = HsIntPrim i
102 mk_int l@(HsLitLit s) = l
104 mk_char (HsChar c) = HsCharPrim c
105 mk_char l@(HsLitLit s) = l
107 mk_word l@(HsLitLit s) = l
109 mk_addr l@(HsLitLit s) = l
111 mk_float (HsInt i) = HsFloatPrim (fromInteger i)
112 mk_float (HsFrac f) = HsFloatPrim f
113 mk_float l@(HsLitLit s) = l
115 mk_double (HsInt i) = HsDoublePrim (fromInteger i)
116 mk_double (HsFrac f) = HsDoublePrim f
117 mk_double l@(HsLitLit s) = l
119 str_lit (HsString s) = _LENGTH_ s <= 1 -- Short string literals only
122 mk_list (HsString s) = foldr
123 (\c pat -> ConPat consDataCon lit_ty [] [] [mk_char_lit c,pat])
124 (ConPat nilDataCon lit_ty [] [] []) (_UNPK_INT_ s)
126 mk_char_lit c = ConPat charDataCon charTy [] [] [LitPat (HsCharPrim c) charPrimTy]
130 %************************************************************************
132 \subsection{Building lets}
134 %************************************************************************
136 Use case, not let for unlifted types. The simplifier will turn some
140 mkDsLet :: CoreBind -> CoreExpr -> CoreExpr
141 mkDsLet (NonRec bndr rhs) body
142 | isUnLiftedType (idType bndr) = Case rhs bndr [(DEFAULT,[],body)]
146 mkDsLets :: [CoreBind] -> CoreExpr -> CoreExpr
147 mkDsLets binds body = foldr mkDsLet body binds
151 %************************************************************************
153 \subsection{ Selecting match variables}
155 %************************************************************************
157 We're about to match against some patterns. We want to make some
158 @Ids@ to use as match variables. If a pattern has an @Id@ readily at
159 hand, which should indeed be bound to the pattern as a whole, then use it;
160 otherwise, make one up.
163 selectMatchVar :: TypecheckedPat -> DsM Id
164 selectMatchVar (VarPat var) = returnDs var
165 selectMatchVar (AsPat var pat) = returnDs var
166 selectMatchVar (LazyPat pat) = selectMatchVar pat
167 selectMatchVar other_pat = newSysLocalDs (outPatType other_pat) -- OK, better make up one...
171 %************************************************************************
173 %* type synonym EquationInfo and access functions for its pieces *
175 %************************************************************************
176 \subsection[EquationInfo-synonym]{@EquationInfo@: a useful synonym}
178 The ``equation info'' used by @match@ is relatively complicated and
179 worthy of a type synonym and a few handy functions.
184 type EqnSet = UniqSet EqnNo
188 EqnNo -- The number of the equation
190 DsMatchContext -- The context info is used when producing warnings
191 -- about shadowed patterns. It's the context
192 -- of the *first* thing matched in this group.
193 -- Should perhaps be a list of them all!
195 [TypecheckedPat] -- The patterns for an eqn
197 MatchResult -- Encapsulates the guards and bindings
203 CanItFail -- Tells whether the failure expression is used
204 (CoreExpr -> DsM CoreExpr)
205 -- Takes a expression to plug in at the
206 -- failure point(s). The expression should
209 data CanItFail = CanFail | CantFail
211 orFail CantFail CantFail = CantFail
215 Functions on MatchResults
218 cantFailMatchResult :: CoreExpr -> MatchResult
219 cantFailMatchResult expr = MatchResult CantFail (\ ignore -> returnDs expr)
221 extractMatchResult :: MatchResult -> CoreExpr -> DsM CoreExpr
222 extractMatchResult (MatchResult CantFail match_fn) fail_expr
223 = match_fn (error "It can't fail!")
225 extractMatchResult (MatchResult CanFail match_fn) fail_expr
226 = mkFailurePair fail_expr `thenDs` \ (fail_bind, if_it_fails) ->
227 match_fn if_it_fails `thenDs` \ body ->
228 returnDs (mkDsLet fail_bind body)
231 combineMatchResults :: MatchResult -> MatchResult -> MatchResult
232 combineMatchResults (MatchResult CanFail body_fn1)
233 (MatchResult can_it_fail2 body_fn2)
234 = MatchResult can_it_fail2 body_fn
236 body_fn fail = body_fn2 fail `thenDs` \ body2 ->
237 mkFailurePair body2 `thenDs` \ (fail_bind, duplicatable_expr) ->
238 body_fn1 duplicatable_expr `thenDs` \ body1 ->
239 returnDs (Let fail_bind body1)
241 combineMatchResults match_result1@(MatchResult CantFail body_fn1) match_result2
245 adjustMatchResult :: (CoreExpr -> CoreExpr) -> MatchResult -> MatchResult
246 adjustMatchResult encl_fn (MatchResult can_it_fail body_fn)
247 = MatchResult can_it_fail (\fail -> body_fn fail `thenDs` \ body ->
248 returnDs (encl_fn body))
250 adjustMatchResultDs :: (CoreExpr -> DsM CoreExpr) -> MatchResult -> MatchResult
251 adjustMatchResultDs encl_fn (MatchResult can_it_fail body_fn)
252 = MatchResult can_it_fail (\fail -> body_fn fail `thenDs` \ body ->
256 mkCoLetsMatchResult :: [CoreBind] -> MatchResult -> MatchResult
257 mkCoLetsMatchResult binds match_result
258 = adjustMatchResult (mkDsLets binds) match_result
261 mkGuardedMatchResult :: CoreExpr -> MatchResult -> MatchResult
262 mkGuardedMatchResult pred_expr (MatchResult can_it_fail body_fn)
263 = MatchResult CanFail (\fail -> body_fn fail `thenDs` \ body ->
264 returnDs (mkIfThenElse pred_expr body fail))
266 mkCoPrimCaseMatchResult :: Id -- Scrutinee
267 -> [(Literal, MatchResult)] -- Alternatives
269 mkCoPrimCaseMatchResult var match_alts
270 = MatchResult CanFail mk_case
273 = mapDs (mk_alt fail) match_alts `thenDs` \ alts ->
274 returnDs (Case (Var var) var (alts ++ [(DEFAULT, [], fail)]))
276 mk_alt fail (lit, MatchResult _ body_fn) = body_fn fail `thenDs` \ body ->
277 returnDs (LitAlt lit, [], body)
280 mkCoAlgCaseMatchResult :: Id -- Scrutinee
281 -> [(DataCon, [CoreBndr], MatchResult)] -- Alternatives
284 mkCoAlgCaseMatchResult var match_alts
285 | isNewTyCon tycon -- Newtype case; use a let
286 = ASSERT( newtype_sanity )
287 mkCoLetsMatchResult [coercion_bind] match_result
289 | otherwise -- Datatype case; use a case
290 = MatchResult fail_flag mk_case
293 scrut_ty = idType var
294 (tycon, _, _) = splitAlgTyConApp scrut_ty
297 (_, arg_ids, match_result) = head match_alts
298 arg_id = head arg_ids
299 coercion_bind = NonRec arg_id (Note (Coerce (unUsgTy (idType arg_id))
302 newtype_sanity = null (tail match_alts) && null (tail arg_ids)
304 -- Stuff for data types
305 data_cons = tyConDataCons tycon
307 match_results = [match_result | (_,_,match_result) <- match_alts]
309 fail_flag | exhaustive_case
310 = foldr1 orFail [can_it_fail | MatchResult can_it_fail _ <- match_results]
314 wild_var = mkWildId (idType var)
315 mk_case fail = mapDs (mk_alt fail) match_alts `thenDs` \ alts ->
316 returnDs (Case (Var var) wild_var (alts ++ mk_default fail))
318 mk_alt fail (con, args, MatchResult _ body_fn)
319 = body_fn fail `thenDs` \ body ->
320 rebuildConArgs con args (dataConStrictMarks con) body
321 `thenDs` \ (body', real_args) ->
322 returnDs (DataAlt con, real_args, body')
324 mk_default fail | exhaustive_case = []
325 | otherwise = [(DEFAULT, [], fail)]
327 un_mentioned_constructors
328 = mkUniqSet data_cons `minusUniqSet` mkUniqSet [ con | (con, _, _) <- match_alts]
329 exhaustive_case = isEmptyUniqSet un_mentioned_constructors
332 For each constructor we match on, we might need to re-pack some
333 of the strict fields if they are unpacked in the constructor.
337 :: DataCon -- the con we're matching on
338 -> [Id] -- the source-level args
339 -> [StrictnessMark] -- the strictness annotations (per-arg)
340 -> CoreExpr -- the body
341 -> DsM (CoreExpr, [Id])
343 rebuildConArgs con [] stricts body = returnDs (body, [])
344 rebuildConArgs con (arg:args) stricts body | isTyVar arg
345 = rebuildConArgs con args stricts body `thenDs` \ (body', args') ->
346 returnDs (body',arg:args')
347 rebuildConArgs con (arg:args) (str:stricts) body
348 = rebuildConArgs con args stricts body `thenDs` \ (body', real_args) ->
349 case maybeMarkedUnboxed str of
350 Just (pack_con1, _) ->
351 case splitProductType_maybe (idType arg) of
352 Just (_, tycon_args, pack_con, con_arg_tys) ->
353 ASSERT( pack_con == pack_con1 )
354 newSysLocalsDs con_arg_tys `thenDs` \ unpacked_args ->
356 mkDsLet (NonRec arg (mkConApp pack_con
357 (map Type tycon_args ++
358 map Var unpacked_args))) body',
359 unpacked_args ++ real_args
362 _ -> returnDs (body', arg:real_args)
365 %************************************************************************
367 \subsection{Desugarer's versions of some Core functions}
369 %************************************************************************
372 mkErrorAppDs :: Id -- The error function
373 -> Type -- Type to which it should be applied
374 -> String -- The error message string to pass
377 mkErrorAppDs err_id ty msg
378 = getSrcLocDs `thenDs` \ src_loc ->
380 full_msg = showSDoc (hcat [ppr src_loc, text "|", text msg])
382 mkStringLit full_msg `thenDs` \ core_msg ->
383 returnDs (mkApps (Var err_id) [(Type . unUsgTy) ty, core_msg])
384 -- unUsgTy *required* -- KSW 1999-04-07
386 mkStringLit :: String -> DsM CoreExpr
387 mkStringLit str = mkStringLitFS (_PK_ str)
389 mkStringLitFS :: FAST_STRING -> DsM CoreExpr
393 dsLookupGlobalValue unpackCStringIdKey `thenDs` \ unpack_id ->
394 returnDs (App (Var unpack_id) (Lit (MachStr str)))
398 dsLookupGlobalValue unpackCStringUtf8IdKey `thenDs` \ unpack_id ->
399 returnDs (App (Var unpack_id) (Lit (MachStr (_PK_ (stringToUtf8 chars)))))
402 chars = _UNPK_INT_ str
403 safeChar c = c >= 1 && c <= 0xFF
406 %************************************************************************
408 \subsection[mkSelectorBind]{Make a selector bind}
410 %************************************************************************
412 This is used in various places to do with lazy patterns.
413 For each binder $b$ in the pattern, we create a binding:
415 b = case v of pat' -> b'
417 where @pat'@ is @pat@ with each binder @b@ cloned into @b'@.
419 ToDo: making these bindings should really depend on whether there's
420 much work to be done per binding. If the pattern is complex, it
421 should be de-mangled once, into a tuple (and then selected from).
422 Otherwise the demangling can be in-line in the bindings (as here).
424 Boring! Boring! One error message per binder. The above ToDo is
425 even more helpful. Something very similar happens for pattern-bound
429 mkSelectorBinds :: TypecheckedPat -- The pattern
430 -> CoreExpr -- Expression to which the pattern is bound
431 -> DsM [(Id,CoreExpr)]
433 mkSelectorBinds (VarPat v) val_expr
434 = returnDs [(v, val_expr)]
436 mkSelectorBinds pat val_expr
437 | length binders == 1 || is_simple_pat pat
438 = newSysLocalDs (exprType val_expr) `thenDs` \ val_var ->
440 -- For the error message we don't use mkErrorAppDs to avoid
441 -- duplicating the string literal each time
442 newSysLocalDs stringTy `thenDs` \ msg_var ->
443 getSrcLocDs `thenDs` \ src_loc ->
445 full_msg = showSDoc (hcat [ppr src_loc, text "|", ppr pat])
447 mkStringLit full_msg `thenDs` \ core_msg ->
448 mapDs (mk_bind val_var msg_var) binders `thenDs` \ binds ->
449 returnDs ( (val_var, val_expr) :
450 (msg_var, core_msg) :
455 = mkErrorAppDs iRREFUT_PAT_ERROR_ID tuple_ty (showSDoc (ppr pat))
456 `thenDs` \ error_expr ->
457 matchSimply val_expr LetMatch pat local_tuple error_expr
458 `thenDs` \ tuple_expr ->
459 newSysLocalDs tuple_ty
460 `thenDs` \ tuple_var ->
463 (binder, mkTupleSelector binders binder tuple_var (Var tuple_var))
465 returnDs ( (tuple_var, tuple_expr) : map mk_tup_bind binders )
467 binders = collectTypedPatBinders pat
468 local_tuple = mkTupleExpr binders
469 tuple_ty = exprType local_tuple
471 mk_bind scrut_var msg_var bndr_var
472 -- (mk_bind sv bv) generates
473 -- bv = case sv of { pat -> bv; other -> error-msg }
474 -- Remember, pat binds bv
475 = matchSimply (Var scrut_var) LetMatch pat
476 (Var bndr_var) error_expr `thenDs` \ rhs_expr ->
477 returnDs (bndr_var, rhs_expr)
479 binder_ty = idType bndr_var
480 error_expr = mkApps (Var iRREFUT_PAT_ERROR_ID) [Type binder_ty, Var msg_var]
482 is_simple_pat (TuplePat ps Boxed) = all is_triv_pat ps
483 is_simple_pat (ConPat _ _ _ _ ps) = all is_triv_pat ps
484 is_simple_pat (VarPat _) = True
485 is_simple_pat (RecPat _ _ _ _ ps) = and [is_triv_pat p | (_,p,_) <- ps]
486 is_simple_pat other = False
488 is_triv_pat (VarPat v) = True
489 is_triv_pat (WildPat _) = True
490 is_triv_pat other = False
494 @mkTupleExpr@ builds a tuple; the inverse to @mkTupleSelector@. If it
495 has only one element, it is the identity function. Notice we must
496 throw out any usage annotation on the outside of an Id.
499 mkTupleExpr :: [Id] -> CoreExpr
501 mkTupleExpr [] = Var unitDataConId
502 mkTupleExpr [id] = Var id
503 mkTupleExpr ids = mkConApp (tupleCon Boxed (length ids))
504 (map (Type . unUsgTy . idType) ids ++ [ Var i | i <- ids ])
508 @mkTupleSelector@ builds a selector which scrutises the given
509 expression and extracts the one name from the list given.
510 If you want the no-shadowing rule to apply, the caller
511 is responsible for making sure that none of these names
514 If there is just one id in the ``tuple'', then the selector is
518 mkTupleSelector :: [Id] -- The tuple args
519 -> Id -- The selected one
520 -> Id -- A variable of the same type as the scrutinee
521 -> CoreExpr -- Scrutinee
524 mkTupleSelector [var] should_be_the_same_var scrut_var scrut
525 = ASSERT(var == should_be_the_same_var)
528 mkTupleSelector vars the_var scrut_var scrut
529 = ASSERT( not (null vars) )
530 Case scrut scrut_var [(DataAlt (tupleCon Boxed (length vars)), vars, Var the_var)]
534 %************************************************************************
536 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
538 %************************************************************************
540 Call the constructor Ids when building explicit lists, so that they
541 interact well with rules.
544 mkNilExpr :: Type -> CoreExpr
545 mkNilExpr ty = App (Var (dataConId nilDataCon)) (Type ty)
547 mkConsExpr :: Type -> CoreExpr -> CoreExpr -> CoreExpr
548 mkConsExpr ty hd tl = mkApps (Var (dataConId consDataCon)) [Type ty, hd, tl]
552 %************************************************************************
554 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
556 %************************************************************************
558 Generally, we handle pattern matching failure like this: let-bind a
559 fail-variable, and use that variable if the thing fails:
561 let fail.33 = error "Help"
572 If the case can't fail, then there'll be no mention of @fail.33@, and the
573 simplifier will later discard it.
576 If it can fail in only one way, then the simplifier will inline it.
579 Only if it is used more than once will the let-binding remain.
582 There's a problem when the result of the case expression is of
583 unboxed type. Then the type of @fail.33@ is unboxed too, and
584 there is every chance that someone will change the let into a case:
590 which is of course utterly wrong. Rather than drop the condition that
591 only boxed types can be let-bound, we just turn the fail into a function
592 for the primitive case:
594 let fail.33 :: Void -> Int#
595 fail.33 = \_ -> error "Help"
604 Now @fail.33@ is a function, so it can be let-bound.
607 mkFailurePair :: CoreExpr -- Result type of the whole case expression
608 -> DsM (CoreBind, -- Binds the newly-created fail variable
609 -- to either the expression or \ _ -> expression
610 CoreExpr) -- Either the fail variable, or fail variable
611 -- applied to unit tuple
614 = newFailLocalDs (unitTy `mkFunTy` ty) `thenDs` \ fail_fun_var ->
615 newSysLocalDs unitTy `thenDs` \ fail_fun_arg ->
616 returnDs (NonRec fail_fun_var (Lam fail_fun_arg expr),
617 App (Var fail_fun_var) (Var unitDataConId))
620 = newFailLocalDs ty `thenDs` \ fail_var ->
621 returnDs (NonRec fail_var expr, Var fail_var)