[project @ 2000-09-07 09:10:07 by simonpj]
[ghc-hetmet.git] / ghc / compiler / deSugar / DsUtils.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[DsUtils]{Utilities for desugaring}
5
6 This module exports some utility functions of no great interest.
7
8 \begin{code}
9 module DsUtils (
10         CanItFail(..), EquationInfo(..), MatchResult(..),
11         EqnNo, EqnSet,
12
13         tidyLitPat, 
14
15         mkDsLet, mkDsLets,
16
17         cantFailMatchResult, extractMatchResult,
18         combineMatchResults, 
19         adjustMatchResult, adjustMatchResultDs,
20         mkCoLetsMatchResult, mkGuardedMatchResult, 
21         mkCoPrimCaseMatchResult, mkCoAlgCaseMatchResult,
22
23         mkErrorAppDs, mkNilExpr, mkConsExpr,
24         mkStringLit, mkStringLitFS,
25
26         mkSelectorBinds, mkTupleExpr, mkTupleSelector,
27
28         selectMatchVar
29     ) where
30
31 #include "HsVersions.h"
32
33 import {-# SOURCE #-} Match ( matchSimply )
34
35 import HsSyn
36 import TcHsSyn          ( TypecheckedPat )
37 import DsHsSyn          ( outPatType, collectTypedPatBinders )
38 import CoreSyn
39
40 import DsMonad
41
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
49                         )
50 import Type             ( mkFunTy, isUnLiftedType, splitAlgTyConApp, unUsgTy,
51                           Type
52                         )
53 import TysPrim          ( intPrimTy, 
54                           charPrimTy, 
55                           floatPrimTy, 
56                           doublePrimTy,
57                           addrPrimTy, 
58                           wordPrimTy
59                         )
60 import TysWiredIn       ( nilDataCon, consDataCon, 
61                           tupleCon,
62                           stringTy,
63                           unitDataConId, unitTy,
64                           charTy, charDataCon, 
65                           intTy, intDataCon,
66                           floatTy, floatDataCon, 
67                           doubleTy, doubleDataCon, 
68                           addrTy, addrDataCon,
69                           wordTy, wordDataCon
70                         )
71 import BasicTypes       ( Boxity(..) )
72 import UniqSet          ( mkUniqSet, minusUniqSet, isEmptyUniqSet, UniqSet )
73 import Unique           ( unpackCStringIdKey, unpackCStringUtf8IdKey )
74 import Outputable
75 import UnicodeUtil      ( stringToUtf8 )
76 \end{code}
77
78
79
80 %************************************************************************
81 %*                                                                      *
82 \subsection{Tidying lit pats}
83 %*                                                                      *
84 %************************************************************************
85
86 \begin{code}
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]
94
95         -- Convert short string-literal patterns like "f" to 'f':[]
96   | str_lit lit           = mk_list lit
97
98   | otherwise = default_pat
99
100   where
101     mk_int    (HsInt i)      = HsIntPrim i
102     mk_int    l@(HsLitLit s) = l
103
104     mk_char   (HsChar c)     = HsCharPrim c
105     mk_char   l@(HsLitLit s) = l
106
107     mk_word   l@(HsLitLit s) = l
108
109     mk_addr   l@(HsLitLit s) = l
110
111     mk_float  (HsInt i)      = HsFloatPrim (fromInteger i)
112     mk_float  (HsFrac f)     = HsFloatPrim f
113     mk_float  l@(HsLitLit s) = l
114
115     mk_double (HsInt i)      = HsDoublePrim (fromInteger i)
116     mk_double (HsFrac f)     = HsDoublePrim f
117     mk_double l@(HsLitLit s) = l
118
119     str_lit (HsString s)     = _LENGTH_ s <= 1  -- Short string literals only
120     str_lit _                = False
121
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)
125
126     mk_char_lit c            = ConPat charDataCon charTy [] [] [LitPat (HsCharPrim c) charPrimTy]
127 \end{code}
128
129
130 %************************************************************************
131 %*                                                                      *
132 \subsection{Building lets}
133 %*                                                                      *
134 %************************************************************************
135
136 Use case, not let for unlifted types.  The simplifier will turn some
137 back again.
138
139 \begin{code}
140 mkDsLet :: CoreBind -> CoreExpr -> CoreExpr
141 mkDsLet (NonRec bndr rhs) body
142   | isUnLiftedType (idType bndr) = Case rhs bndr [(DEFAULT,[],body)]
143 mkDsLet bind body
144   = Let bind body
145
146 mkDsLets :: [CoreBind] -> CoreExpr -> CoreExpr
147 mkDsLets binds body = foldr mkDsLet body binds
148 \end{code}
149
150
151 %************************************************************************
152 %*                                                                      *
153 \subsection{ Selecting match variables}
154 %*                                                                      *
155 %************************************************************************
156
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.
161
162 \begin{code}
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...
168 \end{code}
169
170
171 %************************************************************************
172 %*                                                                      *
173 %* type synonym EquationInfo and access functions for its pieces        *
174 %*                                                                      *
175 %************************************************************************
176 \subsection[EquationInfo-synonym]{@EquationInfo@: a useful synonym}
177
178 The ``equation info'' used by @match@ is relatively complicated and
179 worthy of a type synonym and a few handy functions.
180
181 \begin{code}
182
183 type EqnNo   = Int
184 type EqnSet  = UniqSet EqnNo
185
186 data EquationInfo
187   = EqnInfo
188         EqnNo           -- The number of the equation
189
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!
194
195         [TypecheckedPat]    -- The patterns for an eqn
196
197         MatchResult         -- Encapsulates the guards and bindings
198 \end{code}
199
200 \begin{code}
201 data MatchResult
202   = MatchResult
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
207                         -- be duplicatable!
208
209 data CanItFail = CanFail | CantFail
210
211 orFail CantFail CantFail = CantFail
212 orFail _        _        = CanFail
213 \end{code}
214
215 Functions on MatchResults
216
217 \begin{code}
218 cantFailMatchResult :: CoreExpr -> MatchResult
219 cantFailMatchResult expr = MatchResult CantFail (\ ignore -> returnDs expr)
220
221 extractMatchResult :: MatchResult -> CoreExpr -> DsM CoreExpr
222 extractMatchResult (MatchResult CantFail match_fn) fail_expr
223   = match_fn (error "It can't fail!")
224
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)
229
230
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
235   where
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)
240
241 combineMatchResults match_result1@(MatchResult CantFail body_fn1) match_result2
242   = match_result1
243
244
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))
249
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 ->
253                                       encl_fn body)
254
255
256 mkCoLetsMatchResult :: [CoreBind] -> MatchResult -> MatchResult
257 mkCoLetsMatchResult binds match_result
258   = adjustMatchResult (mkDsLets binds) match_result
259
260
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))
265
266 mkCoPrimCaseMatchResult :: Id                           -- Scrutinee
267                     -> [(Literal, MatchResult)]         -- Alternatives
268                     -> MatchResult
269 mkCoPrimCaseMatchResult var match_alts
270   = MatchResult CanFail mk_case
271   where
272     mk_case fail
273       = mapDs (mk_alt fail) match_alts          `thenDs` \ alts ->
274         returnDs (Case (Var var) var (alts ++ [(DEFAULT, [], fail)]))
275
276     mk_alt fail (lit, MatchResult _ body_fn) = body_fn fail     `thenDs` \ body ->
277                                                returnDs (LitAlt lit, [], body)
278
279
280 mkCoAlgCaseMatchResult :: Id                                    -- Scrutinee
281                     -> [(DataCon, [CoreBndr], MatchResult)]     -- Alternatives
282                     -> MatchResult
283
284 mkCoAlgCaseMatchResult var match_alts
285   | isNewTyCon tycon            -- Newtype case; use a let
286   = ASSERT( newtype_sanity )
287     mkCoLetsMatchResult [coercion_bind] match_result
288
289   | otherwise                   -- Datatype case; use a case
290   = MatchResult fail_flag mk_case
291   where
292         -- Common stuff
293     scrut_ty = idType var
294     (tycon, _, _) = splitAlgTyConApp scrut_ty
295
296         -- Stuff for newtype
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)) 
300                                                              (unUsgTy scrut_ty))
301                                                      (Var var))
302     newtype_sanity             = null (tail match_alts) && null (tail arg_ids)
303
304         -- Stuff for data types
305     data_cons = tyConDataCons tycon
306
307     match_results             = [match_result | (_,_,match_result) <- match_alts]
308
309     fail_flag | exhaustive_case
310               = foldr1 orFail [can_it_fail | MatchResult can_it_fail _ <- match_results]
311               | otherwise
312               = CanFail
313
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))
317
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')
323
324     mk_default fail | exhaustive_case = []
325                     | otherwise       = [(DEFAULT, [], fail)]
326
327     un_mentioned_constructors
328         = mkUniqSet data_cons `minusUniqSet` mkUniqSet [ con | (con, _, _) <- match_alts]
329     exhaustive_case = isEmptyUniqSet un_mentioned_constructors
330 \end{code}
331 %
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.
334 %
335 \begin{code}
336 rebuildConArgs
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])
342
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 ->
355                     returnDs (
356                          mkDsLet (NonRec arg (mkConApp pack_con 
357                                                   (map Type tycon_args ++
358                                                    map Var  unpacked_args))) body', 
359                          unpacked_args ++ real_args
360                     )
361                 
362         _ -> returnDs (body', arg:real_args)
363 \end{code}
364
365 %************************************************************************
366 %*                                                                      *
367 \subsection{Desugarer's versions of some Core functions}
368 %*                                                                      *
369 %************************************************************************
370
371 \begin{code}
372 mkErrorAppDs :: Id              -- The error function
373              -> Type            -- Type to which it should be applied
374              -> String          -- The error message string to pass
375              -> DsM CoreExpr
376
377 mkErrorAppDs err_id ty msg
378   = getSrcLocDs                 `thenDs` \ src_loc ->
379     let
380         full_msg = showSDoc (hcat [ppr src_loc, text "|", text msg])
381     in
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
385
386 mkStringLit   :: String       -> DsM CoreExpr
387 mkStringLit str = mkStringLitFS (_PK_ str)
388
389 mkStringLitFS :: FAST_STRING  -> DsM CoreExpr
390 mkStringLitFS str
391   | all safeChar chars
392   =
393     dsLookupGlobalValue unpackCStringIdKey      `thenDs` \ unpack_id ->
394     returnDs (App (Var unpack_id) (Lit (MachStr str)))
395
396   | otherwise
397   =
398     dsLookupGlobalValue unpackCStringUtf8IdKey  `thenDs` \ unpack_id ->
399     returnDs (App (Var unpack_id) (Lit (MachStr (_PK_ (stringToUtf8 chars)))))
400
401   where
402     chars = _UNPK_INT_ str
403     safeChar c = c >= 1 && c <= 0xFF
404 \end{code}
405
406 %************************************************************************
407 %*                                                                      *
408 \subsection[mkSelectorBind]{Make a selector bind}
409 %*                                                                      *
410 %************************************************************************
411
412 This is used in various places to do with lazy patterns.
413 For each binder $b$ in the pattern, we create a binding:
414 \begin{verbatim}
415     b = case v of pat' -> b'
416 \end{verbatim}
417 where @pat'@ is @pat@ with each binder @b@ cloned into @b'@.
418
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).
423
424 Boring!  Boring!  One error message per binder.  The above ToDo is
425 even more helpful.  Something very similar happens for pattern-bound
426 expressions.
427
428 \begin{code}
429 mkSelectorBinds :: TypecheckedPat       -- The pattern
430                 -> CoreExpr             -- Expression to which the pattern is bound
431                 -> DsM [(Id,CoreExpr)]
432
433 mkSelectorBinds (VarPat v) val_expr
434   = returnDs [(v, val_expr)]
435
436 mkSelectorBinds pat val_expr
437   | length binders == 1 || is_simple_pat pat
438   = newSysLocalDs (exprType val_expr)   `thenDs` \ val_var ->
439
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 ->
444     let
445         full_msg = showSDoc (hcat [ppr src_loc, text "|", ppr pat])
446     in
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) :
451                binds )
452
453
454   | otherwise
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 ->
461     let
462         mk_tup_bind binder =
463           (binder, mkTupleSelector binders binder tuple_var (Var tuple_var))
464     in
465     returnDs ( (tuple_var, tuple_expr) : map mk_tup_bind binders )
466   where
467     binders     = collectTypedPatBinders pat
468     local_tuple = mkTupleExpr binders
469     tuple_ty    = exprType local_tuple
470
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)
478       where
479         binder_ty = idType bndr_var
480         error_expr = mkApps (Var iRREFUT_PAT_ERROR_ID) [Type binder_ty, Var msg_var]
481
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
487
488     is_triv_pat (VarPat v)  = True
489     is_triv_pat (WildPat _) = True
490     is_triv_pat other       = False
491 \end{code}
492
493
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. 
497
498 \begin{code}
499 mkTupleExpr :: [Id] -> CoreExpr
500
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 ])
505 \end{code}
506
507
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
512 are in scope.
513
514 If there is just one id in the ``tuple'', then the selector is
515 just the identity.
516
517 \begin{code}
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
522                 -> CoreExpr
523
524 mkTupleSelector [var] should_be_the_same_var scrut_var scrut
525   = ASSERT(var == should_be_the_same_var)
526     scrut
527
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)]
531 \end{code}
532
533
534 %************************************************************************
535 %*                                                                      *
536 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
537 %*                                                                      *
538 %************************************************************************
539
540 Call the constructor Ids when building explicit lists, so that they
541 interact well with rules.
542
543 \begin{code}
544 mkNilExpr :: Type -> CoreExpr
545 mkNilExpr ty = App (Var (dataConId nilDataCon)) (Type ty)
546
547 mkConsExpr :: Type -> CoreExpr -> CoreExpr -> CoreExpr
548 mkConsExpr ty hd tl = mkApps (Var (dataConId consDataCon)) [Type ty, hd, tl]
549 \end{code}
550
551
552 %************************************************************************
553 %*                                                                      *
554 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
555 %*                                                                      *
556 %************************************************************************
557
558 Generally, we handle pattern matching failure like this: let-bind a
559 fail-variable, and use that variable if the thing fails:
560 \begin{verbatim}
561         let fail.33 = error "Help"
562         in
563         case x of
564                 p1 -> ...
565                 p2 -> fail.33
566                 p3 -> fail.33
567                 p4 -> ...
568 \end{verbatim}
569 Then
570 \begin{itemize}
571 \item
572 If the case can't fail, then there'll be no mention of @fail.33@, and the
573 simplifier will later discard it.
574
575 \item
576 If it can fail in only one way, then the simplifier will inline it.
577
578 \item
579 Only if it is used more than once will the let-binding remain.
580 \end{itemize}
581
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:
585 \begin{verbatim}
586         case error "Help" of
587           fail.33 -> case ....
588 \end{verbatim}
589
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:
593 \begin{verbatim}
594         let fail.33 :: Void -> Int#
595             fail.33 = \_ -> error "Help"
596         in
597         case x of
598                 p1 -> ...
599                 p2 -> fail.33 void
600                 p3 -> fail.33 void
601                 p4 -> ...
602 \end{verbatim}
603
604 Now @fail.33@ is a function, so it can be let-bound.
605
606 \begin{code}
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
612 mkFailurePair expr
613   | isUnLiftedType ty
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))
618
619   | otherwise
620   = newFailLocalDs ty           `thenDs` \ fail_var ->
621     returnDs (NonRec fail_var expr, Var fail_var)
622   where
623     ty = exprType expr
624 \end{code}
625
626
627