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(..),
13 cantFailMatchResult, extractMatchResult,
15 adjustMatchResult, adjustMatchResultDs,
16 mkCoLetsMatchResult, mkGuardedMatchResult,
17 mkCoPrimCaseMatchResult, mkCoAlgCaseMatchResult,
21 mkSelectorBinds, mkTupleExpr, mkTupleSelector,
26 #include "HsVersions.h"
28 import {-# SOURCE #-} Match ( matchSimply )
30 import HsSyn ( OutPat(..) )
31 import TcHsSyn ( TypecheckedPat )
32 import DsHsSyn ( outPatType, collectTypedPatBinders )
37 import CoreUtils ( coreExprType )
38 import PrelVals ( iRREFUT_PAT_ERROR_ID )
39 import Id ( idType, Id, mkWildId )
40 import Const ( Literal(..), Con(..) )
41 import TyCon ( isNewTyCon, tyConDataCons )
42 import DataCon ( DataCon, dataConStrictMarks, dataConArgTys )
43 import BasicTypes ( StrictnessMark(..) )
44 import Type ( mkFunTy, isUnLiftedType, splitAlgTyConApp,
47 import TysWiredIn ( unitDataCon, tupleCon, stringTy, unitTy, unitDataCon )
48 import UniqSet ( mkUniqSet, minusUniqSet, isEmptyUniqSet, UniqSet )
53 %************************************************************************
55 %* Selecting match variables
57 %************************************************************************
59 We're about to match against some patterns. We want to make some
60 @Ids@ to use as match variables. If a pattern has an @Id@ readily at
61 hand, which should indeed be bound to the pattern as a whole, then use it;
62 otherwise, make one up.
65 selectMatchVar :: TypecheckedPat -> DsM Id
66 selectMatchVar (VarPat var) = returnDs var
67 selectMatchVar (AsPat var pat) = returnDs var
68 selectMatchVar (LazyPat pat) = selectMatchVar pat
69 selectMatchVar other_pat = newSysLocalDs (outPatType other_pat) -- OK, better make up one...
73 %************************************************************************
75 %* type synonym EquationInfo and access functions for its pieces *
77 %************************************************************************
78 \subsection[EquationInfo-synonym]{@EquationInfo@: a useful synonym}
80 The ``equation info'' used by @match@ is relatively complicated and
81 worthy of a type synonym and a few handy functions.
86 type EqnSet = UniqSet EqnNo
90 EqnNo -- The number of the equation
92 DsMatchContext -- The context info is used when producing warnings
93 -- about shadowed patterns. It's the context
94 -- of the *first* thing matched in this group.
95 -- Should perhaps be a list of them all!
97 [TypecheckedPat] -- The patterns for an eqn
99 MatchResult -- Encapsulates the guards and bindings
105 CanItFail -- Tells whether the failure expression is used
106 (CoreExpr -> DsM CoreExpr)
107 -- Takes a expression to plug in at the
108 -- failure point(s). The expression should
111 data CanItFail = CanFail | CantFail
113 orFail CantFail CantFail = CantFail
117 Functions on MatchResults
120 cantFailMatchResult :: CoreExpr -> MatchResult
121 cantFailMatchResult expr = MatchResult CantFail (\ ignore -> returnDs expr)
123 extractMatchResult :: MatchResult -> CoreExpr -> DsM CoreExpr
124 extractMatchResult (MatchResult CantFail match_fn) fail_expr
125 = match_fn (error "It can't fail!")
127 extractMatchResult (MatchResult CanFail match_fn) fail_expr
128 = mkFailurePair fail_expr `thenDs` \ (fail_bind, if_it_fails) ->
129 match_fn if_it_fails `thenDs` \ body ->
130 returnDs (Let fail_bind body)
133 combineMatchResults :: MatchResult -> MatchResult -> MatchResult
134 combineMatchResults (MatchResult CanFail body_fn1)
135 (MatchResult can_it_fail2 body_fn2)
136 = MatchResult can_it_fail2 body_fn
138 body_fn fail = body_fn2 fail `thenDs` \ body2 ->
139 mkFailurePair body2 `thenDs` \ (fail_bind, duplicatable_expr) ->
140 body_fn1 duplicatable_expr `thenDs` \ body1 ->
141 returnDs (Let fail_bind body1)
143 combineMatchResults match_result1@(MatchResult CantFail body_fn1) match_result2
147 adjustMatchResult :: (CoreExpr -> CoreExpr) -> MatchResult -> MatchResult
148 adjustMatchResult encl_fn (MatchResult can_it_fail body_fn)
149 = MatchResult can_it_fail (\fail -> body_fn fail `thenDs` \ body ->
150 returnDs (encl_fn body))
152 adjustMatchResultDs :: (CoreExpr -> DsM CoreExpr) -> MatchResult -> MatchResult
153 adjustMatchResultDs encl_fn (MatchResult can_it_fail body_fn)
154 = MatchResult can_it_fail (\fail -> body_fn fail `thenDs` \ body ->
158 mkCoLetsMatchResult :: [CoreBind] -> MatchResult -> MatchResult
159 mkCoLetsMatchResult binds match_result
160 = adjustMatchResult (mkLets binds) match_result
163 mkGuardedMatchResult :: CoreExpr -> MatchResult -> MatchResult
164 mkGuardedMatchResult pred_expr (MatchResult can_it_fail body_fn)
165 = MatchResult CanFail (\fail -> body_fn fail `thenDs` \ body ->
166 returnDs (mkIfThenElse pred_expr body fail))
168 mkCoPrimCaseMatchResult :: Id -- Scrutinee
169 -> [(Literal, MatchResult)] -- Alternatives
171 mkCoPrimCaseMatchResult var match_alts
172 = MatchResult CanFail mk_case
175 = mapDs (mk_alt fail) match_alts `thenDs` \ alts ->
176 returnDs (Case (Var var) var (alts ++ [(DEFAULT, [], fail)]))
178 mk_alt fail (lit, MatchResult _ body_fn) = body_fn fail `thenDs` \ body ->
179 returnDs (Literal lit, [], body)
182 mkCoAlgCaseMatchResult :: Id -- Scrutinee
183 -> [(DataCon, [CoreBndr], MatchResult)] -- Alternatives
186 mkCoAlgCaseMatchResult var match_alts
187 | isNewTyCon tycon -- Newtype case; use a let
188 = ASSERT( newtype_sanity )
189 mkCoLetsMatchResult [coercion_bind] match_result
191 | otherwise -- Datatype case; use a case
192 = MatchResult fail_flag mk_case
195 scrut_ty = idType var
196 (tycon, tycon_arg_tys, _) = splitAlgTyConApp scrut_ty
199 (con_id, arg_ids, match_result) = head match_alts
200 arg_id = head arg_ids
201 coercion_bind = NonRec arg_id (Note (Coerce (idType arg_id) scrut_ty) (Var var))
202 newtype_sanity = null (tail match_alts) && null (tail arg_ids)
204 -- Stuff for data types
205 data_cons = tyConDataCons tycon
207 match_results = [match_result | (_,_,match_result) <- match_alts]
209 fail_flag | exhaustive_case
210 = foldr1 orFail [can_it_fail | MatchResult can_it_fail _ <- match_results]
214 wild_var = mkWildId (idType var)
215 mk_case fail = mapDs (mk_alt fail) match_alts `thenDs` \ alts ->
216 returnDs (Case (Var var) wild_var (alts ++ mk_default fail))
218 mk_alt fail (con, args, MatchResult _ body_fn)
219 = body_fn fail `thenDs` \ body ->
220 rebuildConArgs con args (dataConStrictMarks con) body
221 `thenDs` \ (body', real_args) ->
222 returnDs (DataCon con, real_args, body')
224 mk_default fail | exhaustive_case = []
225 | otherwise = [(DEFAULT, [], fail)]
227 un_mentioned_constructors
228 = mkUniqSet data_cons `minusUniqSet` mkUniqSet [ con | (con, _, _) <- match_alts]
229 exhaustive_case = isEmptyUniqSet un_mentioned_constructors
231 -- for each constructor we match on, we might need to re-pack some
232 -- of the strict fields if they are unpacked in the constructor.
235 :: DataCon -- the con we're matching on
236 -> [Id] -- the source-level args
237 -> [StrictnessMark] -- the strictness annotations (per-arg)
238 -> CoreExpr -- the body
239 -> DsM (CoreExpr, [Id])
241 rebuildConArgs con [] stricts body = returnDs (body, [])
242 rebuildConArgs con (arg:args) stricts body | isTyVar arg
243 = rebuildConArgs con args stricts body `thenDs` \ (body', args') ->
244 returnDs (body',arg:args')
245 rebuildConArgs con (arg:args) (str:stricts) body
246 = rebuildConArgs con args stricts body `thenDs` \ (body', real_args) ->
248 MarkedUnboxed pack_con tys ->
249 let id_tys = dataConArgTys pack_con ty_args in
250 newSysLocalsDs id_tys `thenDs` \ unpacked_args ->
252 Let (NonRec arg (Con (DataCon pack_con)
254 map Var unpacked_args))) body',
255 unpacked_args ++ real_args
257 _ -> returnDs (body', arg:real_args)
259 where ty_args = case splitAlgTyConApp (idType arg) of { (_,args,_) -> args }
262 %************************************************************************
264 \subsection{Desugarer's versions of some Core functions}
266 %************************************************************************
269 mkErrorAppDs :: Id -- The error function
270 -> Type -- Type to which it should be applied
271 -> String -- The error message string to pass
274 mkErrorAppDs err_id ty msg
275 = getSrcLocDs `thenDs` \ src_loc ->
277 full_msg = showSDoc (hcat [ppr src_loc, text "|", text msg])
279 returnDs (mkApps (Var err_id) [Type ty, mkStringLit full_msg])
282 %************************************************************************
284 \subsection[mkSelectorBind]{Make a selector bind}
286 %************************************************************************
288 This is used in various places to do with lazy patterns.
289 For each binder $b$ in the pattern, we create a binding:
291 b = case v of pat' -> b'
293 where pat' is pat with each binder b cloned into b'.
295 ToDo: making these bindings should really depend on whether there's
296 much work to be done per binding. If the pattern is complex, it
297 should be de-mangled once, into a tuple (and then selected from).
298 Otherwise the demangling can be in-line in the bindings (as here).
300 Boring! Boring! One error message per binder. The above ToDo is
301 even more helpful. Something very similar happens for pattern-bound
305 mkSelectorBinds :: TypecheckedPat -- The pattern
306 -> CoreExpr -- Expression to which the pattern is bound
307 -> DsM [(Id,CoreExpr)]
309 mkSelectorBinds (VarPat v) val_expr
310 = returnDs [(v, val_expr)]
312 mkSelectorBinds pat val_expr
313 | length binders == 1 || is_simple_pat pat
314 = newSysLocalDs (coreExprType val_expr) `thenDs` \ val_var ->
316 -- For the error message we don't use mkErrorAppDs to avoid
317 -- duplicating the string literal each time
318 newSysLocalDs stringTy `thenDs` \ msg_var ->
319 getSrcLocDs `thenDs` \ src_loc ->
321 full_msg = showSDoc (hcat [ppr src_loc, text "|", ppr pat])
323 mapDs (mk_bind val_var msg_var) binders `thenDs` \ binds ->
324 returnDs ( (val_var, val_expr) :
325 (msg_var, mkStringLit full_msg) :
330 = mkErrorAppDs iRREFUT_PAT_ERROR_ID tuple_ty (showSDoc (ppr pat)) `thenDs` \ error_expr ->
331 matchSimply val_expr LetMatch pat local_tuple error_expr `thenDs` \ tuple_expr ->
332 newSysLocalDs tuple_ty `thenDs` \ tuple_var ->
334 mk_tup_bind binder = (binder, mkTupleSelector binders binder tuple_var (Var tuple_var))
336 returnDs ( (tuple_var, tuple_expr) : map mk_tup_bind binders )
338 binders = collectTypedPatBinders pat
339 local_tuple = mkTupleExpr binders
340 tuple_ty = coreExprType local_tuple
342 mk_bind scrut_var msg_var bndr_var
343 -- (mk_bind sv bv) generates
344 -- bv = case sv of { pat -> bv; other -> error-msg }
345 -- Remember, pat binds bv
346 = matchSimply (Var scrut_var) LetMatch pat
347 (Var bndr_var) error_expr `thenDs` \ rhs_expr ->
348 returnDs (bndr_var, rhs_expr)
350 binder_ty = idType bndr_var
351 error_expr = mkApps (Var iRREFUT_PAT_ERROR_ID) [Type binder_ty, Var msg_var]
353 is_simple_pat (TuplePat ps True{-boxed-}) = all is_triv_pat ps
354 is_simple_pat (ConPat _ _ _ _ ps) = all is_triv_pat ps
355 is_simple_pat (VarPat _) = True
356 is_simple_pat (RecPat _ _ _ _ ps) = and [is_triv_pat p | (_,p,_) <- ps]
357 is_simple_pat other = False
359 is_triv_pat (VarPat v) = True
360 is_triv_pat (WildPat _) = True
361 is_triv_pat other = False
365 @mkTupleExpr@ builds a tuple; the inverse to @mkTupleSelector@. If it
366 has only one element, it is the identity function.
369 mkTupleExpr :: [Id] -> CoreExpr
371 mkTupleExpr [] = mkConApp unitDataCon []
372 mkTupleExpr [id] = Var id
373 mkTupleExpr ids = mkConApp (tupleCon (length ids))
374 (map (Type . idType) ids ++ [ Var i | i <- ids ])
378 @mkTupleSelector@ builds a selector which scrutises the given
379 expression and extracts the one name from the list given.
380 If you want the no-shadowing rule to apply, the caller
381 is responsible for making sure that none of these names
384 If there is just one id in the ``tuple'', then the selector is
388 mkTupleSelector :: [Id] -- The tuple args
389 -> Id -- The selected one
390 -> Id -- A variable of the same type as the scrutinee
391 -> CoreExpr -- Scrutinee
394 mkTupleSelector [var] should_be_the_same_var scrut_var scrut
395 = ASSERT(var == should_be_the_same_var)
398 mkTupleSelector vars the_var scrut_var scrut
399 = ASSERT( not (null vars) )
400 Case scrut scrut_var [(DataCon (tupleCon (length vars)), vars, Var the_var)]
404 %************************************************************************
406 \subsection[mkFailurePair]{Code for pattern-matching and other failures}
408 %************************************************************************
410 Generally, we handle pattern matching failure like this: let-bind a
411 fail-variable, and use that variable if the thing fails:
413 let fail.33 = error "Help"
424 If the case can't fail, then there'll be no mention of fail.33, and the
425 simplifier will later discard it.
428 If it can fail in only one way, then the simplifier will inline it.
431 Only if it is used more than once will the let-binding remain.
434 There's a problem when the result of the case expression is of
435 unboxed type. Then the type of fail.33 is unboxed too, and
436 there is every chance that someone will change the let into a case:
442 which is of course utterly wrong. Rather than drop the condition that
443 only boxed types can be let-bound, we just turn the fail into a function
444 for the primitive case:
446 let fail.33 :: Void -> Int#
447 fail.33 = \_ -> error "Help"
456 Now fail.33 is a function, so it can be let-bound.
459 mkFailurePair :: CoreExpr -- Result type of the whole case expression
460 -> DsM (CoreBind, -- Binds the newly-created fail variable
461 -- to either the expression or \ _ -> expression
462 CoreExpr) -- Either the fail variable, or fail variable
463 -- applied to unit tuple
466 = newFailLocalDs (unitTy `mkFunTy` ty) `thenDs` \ fail_fun_var ->
467 newSysLocalDs unitTy `thenDs` \ fail_fun_arg ->
468 returnDs (NonRec fail_fun_var (Lam fail_fun_arg expr),
469 App (Var fail_fun_var) (mkConApp unitDataCon []))
472 = newFailLocalDs ty `thenDs` \ fail_var ->
473 returnDs (NonRec fail_var expr, Var fail_var)
475 ty = coreExprType expr