[project @ 2002-04-29 14:03:38 by simonmar]
[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, tidyNPat,
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, mkIntegerLit, 
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, outPatType, collectTypedPatBinders )
37 import CoreSyn
38
39 import DsMonad
40
41 import CoreUtils        ( exprType, mkIfThenElse, mkCoerce )
42 import PrelInfo         ( iRREFUT_PAT_ERROR_ID )
43 import MkId             ( mkReboxingAlt, mkNewTypeBody )
44 import Id               ( idType, Id, mkWildId )
45 import Literal          ( Literal(..), inIntRange, tARGET_MAX_INT )
46 import TyCon            ( isNewTyCon, tyConDataCons, isRecursiveTyCon )
47 import DataCon          ( DataCon, dataConSourceArity )
48 import Type             ( mkFunTy, isUnLiftedType, Type, splitTyConApp )
49 import TcType           ( tcTyConAppTyCon, isIntTy, isFloatTy, isDoubleTy )
50 import TysPrim          ( intPrimTy, charPrimTy, floatPrimTy, doublePrimTy )
51 import TysWiredIn       ( nilDataCon, consDataCon, 
52                           tupleCon,
53                           unitDataConId, unitTy,
54                           charTy, charDataCon, 
55                           intTy, intDataCon, smallIntegerDataCon, 
56                           floatDataCon, 
57                           doubleDataCon,
58                           stringTy, isPArrFakeCon )
59 import BasicTypes       ( Boxity(..) )
60 import UniqSet          ( mkUniqSet, minusUniqSet, isEmptyUniqSet, UniqSet )
61 import PrelNames        ( unpackCStringName, unpackCStringUtf8Name, 
62                           plusIntegerName, timesIntegerName, 
63                           lengthPName, indexPName )
64 import Outputable
65 import UnicodeUtil      ( intsToUtf8, stringToUtf8 )
66 import Util             ( isSingleton, notNull )
67 import FastString
68 \end{code}
69
70
71
72 %************************************************************************
73 %*                                                                      *
74 \subsection{Tidying lit pats}
75 %*                                                                      *
76 %************************************************************************
77
78 \begin{code}
79 tidyLitPat :: HsLit -> TypecheckedPat -> TypecheckedPat
80 tidyLitPat (HsChar c) pat = ConPat charDataCon   charTy [] [] [LitPat (HsCharPrim c)   charPrimTy]
81 tidyLitPat lit        pat = pat
82
83 tidyNPat :: HsLit -> Type -> TypecheckedPat -> TypecheckedPat
84 tidyNPat (HsString s) _ pat
85   | lengthFS s <= 1     -- Short string literals only
86   = foldr (\c pat -> ConPat consDataCon stringTy [] [] [mk_char_lit c,pat])
87           (ConPat nilDataCon stringTy [] [] []) (unpackIntFS s)
88         -- The stringTy is the type of the whole pattern, not 
89         -- the type to instantiate (:) or [] with!
90   where
91     mk_char_lit c = ConPat charDataCon charTy [] [] [LitPat (HsCharPrim c) charPrimTy]
92
93 tidyNPat lit lit_ty default_pat
94   | isIntTy lit_ty      = ConPat intDataCon    lit_ty [] [] [LitPat (mk_int lit)    intPrimTy]
95   | isFloatTy lit_ty    = ConPat floatDataCon  lit_ty [] [] [LitPat (mk_float lit)  floatPrimTy]
96   | isDoubleTy lit_ty   = ConPat doubleDataCon lit_ty [] [] [LitPat (mk_double lit) doublePrimTy]
97   | otherwise           = default_pat
98
99   where
100     mk_int    (HsInteger i) = HsIntPrim i
101
102     mk_float  (HsInteger i) = HsFloatPrim (fromInteger i)
103     mk_float  (HsRat f _)   = HsFloatPrim f
104
105     mk_double (HsInteger i) = HsDoublePrim (fromInteger i)
106     mk_double (HsRat f _)   = HsDoublePrim f
107 \end{code}
108
109
110 %************************************************************************
111 %*                                                                      *
112 \subsection{Building lets}
113 %*                                                                      *
114 %************************************************************************
115
116 Use case, not let for unlifted types.  The simplifier will turn some
117 back again.
118
119 \begin{code}
120 mkDsLet :: CoreBind -> CoreExpr -> CoreExpr
121 mkDsLet (NonRec bndr rhs) body
122   | isUnLiftedType (idType bndr) = Case rhs bndr [(DEFAULT,[],body)]
123 mkDsLet bind body
124   = Let bind body
125
126 mkDsLets :: [CoreBind] -> CoreExpr -> CoreExpr
127 mkDsLets binds body = foldr mkDsLet body binds
128 \end{code}
129
130
131 %************************************************************************
132 %*                                                                      *
133 \subsection{ Selecting match variables}
134 %*                                                                      *
135 %************************************************************************
136
137 We're about to match against some patterns.  We want to make some
138 @Ids@ to use as match variables.  If a pattern has an @Id@ readily at
139 hand, which should indeed be bound to the pattern as a whole, then use it;
140 otherwise, make one up.
141
142 \begin{code}
143 selectMatchVar :: TypecheckedPat -> DsM Id
144 selectMatchVar (VarPat var)     = returnDs var
145 selectMatchVar (AsPat var pat)  = returnDs var
146 selectMatchVar (LazyPat pat)    = selectMatchVar pat
147 selectMatchVar other_pat        = newSysLocalDs (outPatType other_pat) -- OK, better make up one...
148 \end{code}
149
150
151 %************************************************************************
152 %*                                                                      *
153 %* type synonym EquationInfo and access functions for its pieces        *
154 %*                                                                      *
155 %************************************************************************
156 \subsection[EquationInfo-synonym]{@EquationInfo@: a useful synonym}
157
158 The ``equation info'' used by @match@ is relatively complicated and
159 worthy of a type synonym and a few handy functions.
160
161 \begin{code}
162
163 type EqnNo   = Int
164 type EqnSet  = UniqSet EqnNo
165
166 data EquationInfo
167   = EqnInfo
168         EqnNo           -- The number of the equation
169
170         DsMatchContext  -- The context info is used when producing warnings
171                         -- about shadowed patterns.  It's the context
172                         -- of the *first* thing matched in this group.
173                         -- Should perhaps be a list of them all!
174
175         [TypecheckedPat]    -- The patterns for an eqn
176
177         MatchResult         -- Encapsulates the guards and bindings
178 \end{code}
179
180 \begin{code}
181 data MatchResult
182   = MatchResult
183         CanItFail       -- Tells whether the failure expression is used
184         (CoreExpr -> DsM CoreExpr)
185                         -- Takes a expression to plug in at the
186                         -- failure point(s). The expression should
187                         -- be duplicatable!
188
189 data CanItFail = CanFail | CantFail
190
191 orFail CantFail CantFail = CantFail
192 orFail _        _        = CanFail
193 \end{code}
194
195 Functions on MatchResults
196
197 \begin{code}
198 cantFailMatchResult :: CoreExpr -> MatchResult
199 cantFailMatchResult expr = MatchResult CantFail (\ ignore -> returnDs expr)
200
201 extractMatchResult :: MatchResult -> CoreExpr -> DsM CoreExpr
202 extractMatchResult (MatchResult CantFail match_fn) fail_expr
203   = match_fn (error "It can't fail!")
204
205 extractMatchResult (MatchResult CanFail match_fn) fail_expr
206   = mkFailurePair fail_expr             `thenDs` \ (fail_bind, if_it_fails) ->
207     match_fn if_it_fails                `thenDs` \ body ->
208     returnDs (mkDsLet fail_bind body)
209
210
211 combineMatchResults :: MatchResult -> MatchResult -> MatchResult
212 combineMatchResults (MatchResult CanFail      body_fn1)
213                     (MatchResult can_it_fail2 body_fn2)
214   = MatchResult can_it_fail2 body_fn
215   where
216     body_fn fail = body_fn2 fail                        `thenDs` \ body2 ->
217                    mkFailurePair body2                  `thenDs` \ (fail_bind, duplicatable_expr) ->
218                    body_fn1 duplicatable_expr           `thenDs` \ body1 ->
219                    returnDs (Let fail_bind body1)
220
221 combineMatchResults match_result1@(MatchResult CantFail body_fn1) match_result2
222   = match_result1
223
224
225 adjustMatchResult :: (CoreExpr -> CoreExpr) -> MatchResult -> MatchResult
226 adjustMatchResult encl_fn (MatchResult can_it_fail body_fn)
227   = MatchResult can_it_fail (\fail -> body_fn fail      `thenDs` \ body ->
228                                       returnDs (encl_fn body))
229
230 adjustMatchResultDs :: (CoreExpr -> DsM CoreExpr) -> MatchResult -> MatchResult
231 adjustMatchResultDs encl_fn (MatchResult can_it_fail body_fn)
232   = MatchResult can_it_fail (\fail -> body_fn fail      `thenDs` \ body ->
233                                       encl_fn body)
234
235
236 mkCoLetsMatchResult :: [CoreBind] -> MatchResult -> MatchResult
237 mkCoLetsMatchResult binds match_result
238   = adjustMatchResult (mkDsLets binds) match_result
239
240
241 mkGuardedMatchResult :: CoreExpr -> MatchResult -> MatchResult
242 mkGuardedMatchResult pred_expr (MatchResult can_it_fail body_fn)
243   = MatchResult CanFail (\fail -> body_fn fail  `thenDs` \ body ->
244                                   returnDs (mkIfThenElse pred_expr body fail))
245
246 mkCoPrimCaseMatchResult :: Id                           -- Scrutinee
247                     -> [(Literal, MatchResult)]         -- Alternatives
248                     -> MatchResult
249 mkCoPrimCaseMatchResult var match_alts
250   = MatchResult CanFail mk_case
251   where
252     mk_case fail
253       = mapDs (mk_alt fail) match_alts          `thenDs` \ alts ->
254         returnDs (Case (Var var) var ((DEFAULT, [], fail) : alts))
255
256     mk_alt fail (lit, MatchResult _ body_fn) = body_fn fail     `thenDs` \ body ->
257                                                returnDs (LitAlt lit, [], body)
258
259
260 mkCoAlgCaseMatchResult :: Id                                    -- Scrutinee
261                     -> [(DataCon, [CoreBndr], MatchResult)]     -- Alternatives
262                     -> MatchResult
263
264 mkCoAlgCaseMatchResult var match_alts
265   | isNewTyCon tycon            -- Newtype case; use a let
266   = ASSERT( null (tail match_alts) && null (tail arg_ids) )
267     mkCoLetsMatchResult [NonRec arg_id newtype_rhs] match_result
268
269   | isPArrFakeAlts match_alts   -- Sugared parallel array; use a literal case 
270   = MatchResult CanFail mk_parrCase
271
272   | otherwise                   -- Datatype case; use a case
273   = MatchResult fail_flag mk_case
274   where
275         -- Common stuff
276     scrut_ty = idType var
277     tycon    = tcTyConAppTyCon scrut_ty         -- Newtypes must be opaque here
278
279         -- Stuff for newtype
280     (_, arg_ids, match_result) = head match_alts
281     arg_id                     = head arg_ids
282     newtype_rhs                = mkNewTypeBody tycon (idType arg_id) (Var var)
283                 
284         -- Stuff for data types
285     data_cons      = tyConDataCons tycon
286     match_results  = [match_result | (_,_,match_result) <- match_alts]
287
288     fail_flag | exhaustive_case
289               = foldr1 orFail [can_it_fail | MatchResult can_it_fail _ <- match_results]
290               | otherwise
291               = CanFail
292
293     wild_var = mkWildId (idType var)
294     mk_case fail = mapDs (mk_alt fail) match_alts       `thenDs` \ alts ->
295                    returnDs (Case (Var var) wild_var (mk_default fail ++ alts))
296
297     mk_alt fail (con, args, MatchResult _ body_fn)
298         = body_fn fail                          `thenDs` \ body ->
299           getUniquesDs                          `thenDs` \ us ->
300           returnDs (mkReboxingAlt us con args body)
301
302     mk_default fail | exhaustive_case = []
303                     | otherwise       = [(DEFAULT, [], fail)]
304
305     un_mentioned_constructors
306         = mkUniqSet data_cons `minusUniqSet` mkUniqSet [ con | (con, _, _) <- match_alts]
307     exhaustive_case = isEmptyUniqSet un_mentioned_constructors
308
309         -- Stuff for parallel arrays
310         -- 
311         -- * the following is to desugar cases over fake constructors for
312         --   parallel arrays, which are introduced by `tidy1' in the `PArrPat'
313         --   case
314         --
315         -- Concerning `isPArrFakeAlts':
316         --
317         -- * it is *not* sufficient to just check the type of the type
318         --   constructor, as we have to be careful not to confuse the real
319         --   representation of parallel arrays with the fake constructors;
320         --   moreover, a list of alternatives must not mix fake and real
321         --   constructors (this is checked earlier on)
322         --
323         -- FIXME: We actually go through the whole list and make sure that
324         --        either all or none of the constructors are fake parallel
325         --        array constructors.  This is to spot equations that mix fake
326         --        constructors with the real representation defined in
327         --        `PrelPArr'.  It would be nicer to spot this situation
328         --        earlier and raise a proper error message, but it can really
329         --        only happen in `PrelPArr' anyway.
330         --
331     isPArrFakeAlts [(dcon, _, _)]      = isPArrFakeCon dcon
332     isPArrFakeAlts ((dcon, _, _):alts) = 
333       case (isPArrFakeCon dcon, isPArrFakeAlts alts) of
334         (True , True ) -> True
335         (False, False) -> False
336         _              -> 
337           panic "DsUtils: You may not mix `[:...:]' with `PArr' patterns"
338     --
339     mk_parrCase fail =             
340       dsLookupGlobalValue lengthPName                   `thenDs` \lengthP  ->
341       unboxAlt                                          `thenDs` \alt      ->
342       returnDs (Case (len lengthP) (mkWildId intTy) [alt])
343       where
344         elemTy      = case splitTyConApp (idType var) of
345                         (_, [elemTy]) -> elemTy
346                         _               -> panic panicMsg
347         panicMsg    = "DsUtils.mkCoAlgCaseMatchResult: not a parallel array?"
348         len lengthP = mkApps (Var lengthP) [Type elemTy, Var var]
349         --
350         unboxAlt = 
351           newSysLocalDs intPrimTy                       `thenDs` \l        ->
352           dsLookupGlobalValue indexPName                `thenDs` \indexP   ->
353           mapDs (mkAlt indexP) match_alts               `thenDs` \alts     ->
354           returnDs (DataAlt intDataCon, [l], (Case (Var l) wild (dft : alts)))
355           where
356             wild = mkWildId intPrimTy
357             dft  = (DEFAULT, [], fail)
358         --
359         -- each alternative matches one array length (corresponding to one
360         -- fake array constructor), so the match is on a literal; each
361         -- alternative's body is extended by a local binding for each
362         -- constructor argument, which are bound to array elements starting
363         -- with the first
364         --
365         mkAlt indexP (con, args, MatchResult _ bodyFun) = 
366           bodyFun fail                                  `thenDs` \body     ->
367           returnDs (LitAlt lit, [], mkDsLets binds body)
368           where
369             lit   = MachInt $ toInteger (dataConSourceArity con)
370             binds = [NonRec arg (indexExpr i) | (i, arg) <- zip [1..] args]
371             --
372             indexExpr i = mkApps (Var indexP) [Type elemTy, Var var, toInt i]
373             toInt     i = mkConApp intDataCon [Lit $ MachInt i]
374 \end{code}
375
376
377 %************************************************************************
378 %*                                                                      *
379 \subsection{Desugarer's versions of some Core functions}
380 %*                                                                      *
381 %************************************************************************
382
383 \begin{code}
384 mkErrorAppDs :: Id              -- The error function
385              -> Type            -- Type to which it should be applied
386              -> String          -- The error message string to pass
387              -> DsM CoreExpr
388
389 mkErrorAppDs err_id ty msg
390   = getSrcLocDs                 `thenDs` \ src_loc ->
391     let
392         full_msg = showSDoc (hcat [ppr src_loc, text "|", text msg])
393         core_msg = Lit (MachStr (mkFastString (stringToUtf8 full_msg)))
394     in
395     returnDs (mkApps (Var err_id) [Type ty, core_msg])
396 \end{code}
397
398
399 *************************************************************
400 %*                                                                      *
401 \subsection{Making literals}
402 %*                                                                      *
403 %************************************************************************
404
405 \begin{code}
406 mkIntegerLit :: Integer -> DsM CoreExpr
407 mkIntegerLit i
408   | inIntRange i        -- Small enough, so start from an Int
409   = returnDs (mkSmallIntegerLit i)
410
411 -- Special case for integral literals with a large magnitude:
412 -- They are transformed into an expression involving only smaller
413 -- integral literals. This improves constant folding.
414
415   | otherwise           -- Big, so start from a string
416   = dsLookupGlobalValue plusIntegerName         `thenDs` \ plus_id ->
417     dsLookupGlobalValue timesIntegerName        `thenDs` \ times_id ->
418     let 
419         plus a b  = Var plus_id  `App` a `App` b
420         times a b = Var times_id `App` a `App` b
421
422         -- Transform i into (x1 + (x2 + (x3 + (...) * b) * b) * b) with abs xi <= b
423         horner :: Integer -> Integer -> CoreExpr
424         horner b i | abs q <= 1 = if r == 0 || r == i 
425                                   then mkSmallIntegerLit i 
426                                   else mkSmallIntegerLit r `plus` mkSmallIntegerLit (i-r)
427                    | r == 0     =                             horner b q `times` mkSmallIntegerLit b
428                    | otherwise  = mkSmallIntegerLit r `plus` (horner b q `times` mkSmallIntegerLit b)
429                    where
430                      (q,r) = i `quotRem` b
431
432     in
433     returnDs (horner tARGET_MAX_INT i)
434
435 mkSmallIntegerLit i = mkConApp smallIntegerDataCon [mkIntLit i]
436
437 mkStringLit   :: String       -> DsM CoreExpr
438 mkStringLit str = mkStringLitFS (mkFastString str)
439
440 mkStringLitFS :: FastString  -> DsM CoreExpr
441 mkStringLitFS str
442   | nullFastString str
443   = returnDs (mkNilExpr charTy)
444
445   | lengthFS str == 1
446   = let
447         the_char = mkConApp charDataCon [mkLit (MachChar (headIntFS str))]
448     in
449     returnDs (mkConsExpr charTy the_char (mkNilExpr charTy))
450
451   | all safeChar int_chars
452   = dsLookupGlobalValue unpackCStringName       `thenDs` \ unpack_id ->
453     returnDs (App (Var unpack_id) (Lit (MachStr str)))
454
455   | otherwise
456   = dsLookupGlobalValue unpackCStringUtf8Name   `thenDs` \ unpack_id ->
457     returnDs (App (Var unpack_id) (Lit (MachStr (mkFastString (intsToUtf8 int_chars)))))
458
459   where
460     int_chars = unpackIntFS str
461     safeChar c = c >= 1 && c <= 0xFF
462 \end{code}
463
464
465 %************************************************************************
466 %*                                                                      *
467 \subsection[mkSelectorBind]{Make a selector bind}
468 %*                                                                      *
469 %************************************************************************
470
471 This is used in various places to do with lazy patterns.
472 For each binder $b$ in the pattern, we create a binding:
473 \begin{verbatim}
474     b = case v of pat' -> b'
475 \end{verbatim}
476 where @pat'@ is @pat@ with each binder @b@ cloned into @b'@.
477
478 ToDo: making these bindings should really depend on whether there's
479 much work to be done per binding.  If the pattern is complex, it
480 should be de-mangled once, into a tuple (and then selected from).
481 Otherwise the demangling can be in-line in the bindings (as here).
482
483 Boring!  Boring!  One error message per binder.  The above ToDo is
484 even more helpful.  Something very similar happens for pattern-bound
485 expressions.
486
487 \begin{code}
488 mkSelectorBinds :: TypecheckedPat       -- The pattern
489                 -> CoreExpr             -- Expression to which the pattern is bound
490                 -> DsM [(Id,CoreExpr)]
491
492 mkSelectorBinds (VarPat v) val_expr
493   = returnDs [(v, val_expr)]
494
495 mkSelectorBinds pat val_expr
496   | isSingleton binders || is_simple_pat pat
497   = newSysLocalDs (exprType val_expr)   `thenDs` \ val_var ->
498
499         -- For the error message we make one error-app, to avoid duplication.
500         -- But we need it at different types... so we use coerce for that
501     mkErrorAppDs iRREFUT_PAT_ERROR_ID 
502                  unitTy (showSDoc (ppr pat))    `thenDs` \ err_expr ->
503     newSysLocalDs unitTy                        `thenDs` \ err_var ->
504     mapDs (mk_bind val_var err_var) binders     `thenDs` \ binds ->
505     returnDs ( (val_var, val_expr) : 
506                (err_var, err_expr) :
507                binds )
508
509
510   | otherwise
511   = mkErrorAppDs iRREFUT_PAT_ERROR_ID 
512                  tuple_ty (showSDoc (ppr pat))                  `thenDs` \ error_expr ->
513     matchSimply val_expr PatBindRhs pat local_tuple error_expr  `thenDs` \ tuple_expr ->
514     newSysLocalDs tuple_ty                                      `thenDs` \ tuple_var ->
515     let
516         mk_tup_bind binder
517           = (binder, mkTupleSelector binders binder tuple_var (Var tuple_var))
518     in
519     returnDs ( (tuple_var, tuple_expr) : map mk_tup_bind binders )
520   where
521     binders     = collectTypedPatBinders pat
522     local_tuple = mkTupleExpr binders
523     tuple_ty    = exprType local_tuple
524
525     mk_bind scrut_var err_var bndr_var
526     -- (mk_bind sv err_var) generates
527     --          bv = case sv of { pat -> bv; other -> coerce (type-of-bv) err_var }
528     -- Remember, pat binds bv
529       = matchSimply (Var scrut_var) PatBindRhs pat
530                     (Var bndr_var) error_expr                   `thenDs` \ rhs_expr ->
531         returnDs (bndr_var, rhs_expr)
532       where
533         error_expr = mkCoerce (idType bndr_var) (Var err_var)
534
535     is_simple_pat (TuplePat ps Boxed)  = all is_triv_pat ps
536     is_simple_pat (ConPat _ _ _ _ ps)  = all is_triv_pat ps
537     is_simple_pat (VarPat _)           = True
538     is_simple_pat (RecPat _ _ _ _ ps)  = and [is_triv_pat p | (_,p,_) <- ps]
539     is_simple_pat other                = False
540
541     is_triv_pat (VarPat v)  = True
542     is_triv_pat (WildPat _) = True
543     is_triv_pat other       = False
544 \end{code}
545
546
547 @mkTupleExpr@ builds a tuple; the inverse to @mkTupleSelector@.  If it
548 has only one element, it is the identity function.
549
550 \begin{code}
551 mkTupleExpr :: [Id] -> CoreExpr
552
553 mkTupleExpr []   = Var unitDataConId
554 mkTupleExpr [id] = Var id
555 mkTupleExpr ids  = mkConApp (tupleCon Boxed (length ids))
556                             (map (Type . idType) ids ++ [ Var i | i <- ids ])
557 \end{code}
558
559
560 @mkTupleSelector@ builds a selector which scrutises the given
561 expression and extracts the one name from the list given.
562 If you want the no-shadowing rule to apply, the caller
563 is responsible for making sure that none of these names
564 are in scope.
565
566 If there is just one id in the ``tuple'', then the selector is
567 just the identity.
568
569 \begin{code}
570 mkTupleSelector :: [Id]         -- The tuple args
571                 -> Id           -- The selected one
572                 -> Id           -- A variable of the same type as the scrutinee
573                 -> CoreExpr     -- Scrutinee
574                 -> CoreExpr
575
576 mkTupleSelector [var] should_be_the_same_var scrut_var scrut
577   = ASSERT(var == should_be_the_same_var)
578     scrut
579
580 mkTupleSelector vars the_var scrut_var scrut
581   = ASSERT( notNull vars )
582     Case scrut scrut_var [(DataAlt (tupleCon Boxed (length vars)), vars, Var the_var)]
583 \end{code}
584
585
586 %************************************************************************
587 %*                                                                      *
588 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
589 %*                                                                      *
590 %************************************************************************
591
592 Call the constructor Ids when building explicit lists, so that they
593 interact well with rules.
594
595 \begin{code}
596 mkNilExpr :: Type -> CoreExpr
597 mkNilExpr ty = mkConApp nilDataCon [Type ty]
598
599 mkConsExpr :: Type -> CoreExpr -> CoreExpr -> CoreExpr
600 mkConsExpr ty hd tl = mkConApp consDataCon [Type ty, hd, tl]
601 \end{code}
602
603
604 %************************************************************************
605 %*                                                                      *
606 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
607 %*                                                                      *
608 %************************************************************************
609
610 Generally, we handle pattern matching failure like this: let-bind a
611 fail-variable, and use that variable if the thing fails:
612 \begin{verbatim}
613         let fail.33 = error "Help"
614         in
615         case x of
616                 p1 -> ...
617                 p2 -> fail.33
618                 p3 -> fail.33
619                 p4 -> ...
620 \end{verbatim}
621 Then
622 \begin{itemize}
623 \item
624 If the case can't fail, then there'll be no mention of @fail.33@, and the
625 simplifier will later discard it.
626
627 \item
628 If it can fail in only one way, then the simplifier will inline it.
629
630 \item
631 Only if it is used more than once will the let-binding remain.
632 \end{itemize}
633
634 There's a problem when the result of the case expression is of
635 unboxed type.  Then the type of @fail.33@ is unboxed too, and
636 there is every chance that someone will change the let into a case:
637 \begin{verbatim}
638         case error "Help" of
639           fail.33 -> case ....
640 \end{verbatim}
641
642 which is of course utterly wrong.  Rather than drop the condition that
643 only boxed types can be let-bound, we just turn the fail into a function
644 for the primitive case:
645 \begin{verbatim}
646         let fail.33 :: Void -> Int#
647             fail.33 = \_ -> error "Help"
648         in
649         case x of
650                 p1 -> ...
651                 p2 -> fail.33 void
652                 p3 -> fail.33 void
653                 p4 -> ...
654 \end{verbatim}
655
656 Now @fail.33@ is a function, so it can be let-bound.
657
658 \begin{code}
659 mkFailurePair :: CoreExpr       -- Result type of the whole case expression
660               -> DsM (CoreBind, -- Binds the newly-created fail variable
661                                 -- to either the expression or \ _ -> expression
662                       CoreExpr) -- Either the fail variable, or fail variable
663                                 -- applied to unit tuple
664 mkFailurePair expr
665   | isUnLiftedType ty
666   = newFailLocalDs (unitTy `mkFunTy` ty)        `thenDs` \ fail_fun_var ->
667     newSysLocalDs unitTy                        `thenDs` \ fail_fun_arg ->
668     returnDs (NonRec fail_fun_var (Lam fail_fun_arg expr),
669               App (Var fail_fun_var) (Var unitDataConId))
670
671   | otherwise
672   = newFailLocalDs ty           `thenDs` \ fail_var ->
673     returnDs (NonRec fail_var expr, Var fail_var)
674   where
675     ty = exprType expr
676 \end{code}
677
678