@@ -29,8 +29,12 @@ import Language.Haskell.Syntax.Basic (Boxity(..))
29
29
30
30
import {- #SOURCE#-} GHC.HsToCore.Expr (dsExpr )
31
31
32
- import GHC.Types.Basic ( Origin (.. ), isGenerated , requiresPMC )
32
+ import GHC.Types.Basic ( Origin (.. ), requiresPMC )
33
33
import GHC.Types.SourceText
34
+ ( FractionalLit ,
35
+ IntegralLit (il_value ),
36
+ negateFractionalLit ,
37
+ integralFractionalLit )
34
38
import GHC.Driver.DynFlags
35
39
import GHC.Hs
36
40
import GHC.Hs.Syn.Type
@@ -193,13 +197,9 @@ match :: [MatchId] -- ^ Variables rep\'ing the exprs we\'re matching with
193
197
194
198
match [] ty eqns
195
199
= assertPpr (not (null eqns)) (ppr ty) $
196
- return (foldr1 combineMatchResults match_results)
197
- where
198
- match_results = [ assert (null (eqn_pats eqn)) $
199
- eqn_rhs eqn
200
- | eqn <- eqns ]
200
+ combineEqnRhss (NEL. fromList eqns)
201
201
202
- match (v: vs) ty eqns -- Eqns * can* be empty
202
+ match (v: vs) ty eqns -- Eqns can be empty, but each equation is nonempty
203
203
= assertPpr (all (isInternalName . idName) vars) (ppr vars) $
204
204
do { dflags <- getDynFlags
205
205
; let platform = targetPlatform dflags
@@ -222,12 +222,11 @@ match (v:vs) ty eqns -- Eqns *can* be empty
222
222
dropGroup :: Functor f => f (PatGroup ,EquationInfo ) -> f EquationInfo
223
223
dropGroup = fmap snd
224
224
225
- match_groups :: [NonEmpty (PatGroup ,EquationInfo )] -> DsM (NonEmpty (MatchResult CoreExpr ))
226
- -- Result list of [MatchResult CoreExpr] is always non-empty
225
+ match_groups :: [NonEmpty (PatGroup ,EquationInfoNE )] -> DsM (NonEmpty (MatchResult CoreExpr ))
227
226
match_groups [] = matchEmpty v ty
228
227
match_groups (g: gs) = mapM match_group $ g :| gs
229
228
230
- match_group :: NonEmpty (PatGroup ,EquationInfo ) -> DsM (MatchResult CoreExpr )
229
+ match_group :: NonEmpty (PatGroup ,EquationInfoNE ) -> DsM (MatchResult CoreExpr )
231
230
match_group eqns@ ((group,_) :| _)
232
231
= case group of
233
232
PgCon {} -> matchConFamily vars ty (ne $ subGroupUniq [(c,e) | (PgCon c, e) <- eqns'])
@@ -267,20 +266,20 @@ matchEmpty var res_ty
267
266
mk_seq fail = return $ mkWildCase (Var var) (idScaledType var) res_ty
268
267
[Alt DEFAULT [] fail ]
269
268
270
- matchVariables :: NonEmpty MatchId -> Type -> NonEmpty EquationInfo -> DsM (MatchResult CoreExpr )
269
+ matchVariables :: NonEmpty MatchId -> Type -> NonEmpty EquationInfoNE -> DsM (MatchResult CoreExpr )
271
270
-- Real true variables, just like in matchVar, SLPJ p 94
272
271
-- No binding to do: they'll all be wildcards by now (done in tidy)
273
272
matchVariables (_ :| vars) ty eqns = match vars ty $ NEL. toList $ shiftEqns eqns
274
273
275
- matchBangs :: NonEmpty MatchId -> Type -> NonEmpty EquationInfo -> DsM (MatchResult CoreExpr )
274
+ matchBangs :: NonEmpty MatchId -> Type -> NonEmpty EquationInfoNE -> DsM (MatchResult CoreExpr )
276
275
matchBangs (var :| vars) ty eqns
277
276
= do { match_result <- match (var: vars) ty $ NEL. toList $
278
277
decomposeFirstPat getBangPat <$> eqns
279
278
; return (mkEvalMatchResult var ty match_result) }
280
279
281
- matchCoercion :: NonEmpty MatchId -> Type -> NonEmpty EquationInfo -> DsM (MatchResult CoreExpr )
280
+ matchCoercion :: NonEmpty MatchId -> Type -> NonEmpty EquationInfoNE -> DsM (MatchResult CoreExpr )
282
281
-- Apply the coercion to the match variable and then match that
283
- matchCoercion (var :| vars) ty ( eqns@ (eqn1 :| _) )
282
+ matchCoercion (var :| vars) ty eqns@ (eqn1 :| _)
284
283
= do { let XPat (CoPat co pat _) = firstPat eqn1
285
284
; let pat_ty' = hsPatType pat
286
285
; var' <- newUniqueId var (idMult var) pat_ty'
@@ -290,9 +289,9 @@ matchCoercion (var :| vars) ty (eqns@(eqn1 :| _))
290
289
{ let bind = NonRec var' (core_wrap (Var var))
291
290
; return (mkCoLetMatchResult bind match_result) } }
292
291
293
- matchView :: NonEmpty MatchId -> Type -> NonEmpty EquationInfo -> DsM (MatchResult CoreExpr )
292
+ matchView :: NonEmpty MatchId -> Type -> NonEmpty EquationInfoNE -> DsM (MatchResult CoreExpr )
294
293
-- Apply the view function to the match variable and then match that
295
- matchView (var :| vars) ty ( eqns@ (eqn1 :| _) )
294
+ matchView (var :| vars) ty eqns@ (eqn1 :| _)
296
295
= do { -- we could pass in the expr from the PgView,
297
296
-- but this needs to extract the pat anyway
298
297
-- to figure out the type of the fresh variable
@@ -309,10 +308,9 @@ matchView (var :| vars) ty (eqns@(eqn1 :| _))
309
308
match_result) }
310
309
311
310
-- decompose the first pattern and leave the rest alone
312
- decomposeFirstPat :: (Pat GhcTc -> Pat GhcTc ) -> EquationInfo -> EquationInfo
313
- decomposeFirstPat extractpat (eqn@ (EqnInfo { eqn_pats = pat : pats }))
314
- = eqn { eqn_pats = extractpat pat : pats}
315
- decomposeFirstPat _ _ = panic " decomposeFirstPat"
311
+ decomposeFirstPat :: (Pat GhcTc -> Pat GhcTc ) -> EquationInfoNE -> EquationInfoNE
312
+ decomposeFirstPat extract eqn@ (EqnMatch { eqn_pat = pat }) = eqn{eqn_pat = fmap extract pat}
313
+ decomposeFirstPat _ (EqnDone {}) = panic " decomposeFirstPat"
316
314
317
315
getCoPat , getBangPat , getViewPat :: Pat GhcTc -> Pat GhcTc
318
316
getCoPat (XPat (CoPat _ pat _)) = pat
@@ -405,15 +403,14 @@ tidyEqnInfo :: Id -> EquationInfo
405
403
-- POST CONDITION: head pattern in the EqnInfo is
406
404
-- one of these for which patGroup is defined.
407
405
408
- tidyEqnInfo _ (EqnInfo { eqn_pats = [] })
409
- = panic " tidyEqnInfo"
406
+ tidyEqnInfo _ eqn@ (EqnDone {}) = return (idDsWrapper, eqn)
410
407
411
- tidyEqnInfo v eqn@ (EqnInfo { eqn_pats = pat : pats, eqn_orig = orig })
412
- = do { (wrap, pat') <- tidy1 v orig pat
413
- ; return (wrap, eqn { eqn_pats = pat' : pats }) }
408
+ tidyEqnInfo v eqn@ (EqnMatch { eqn_pat = ( L loc pat) }) = do
409
+ (wrap, pat') <- tidy1 v ( not . isGoodSrcSpan . locA $ loc) pat
410
+ return (wrap, eqn{eqn_pat = L loc pat' })
414
411
415
412
tidy1 :: Id -- The Id being scrutinised
416
- -> Origin -- Was this a pattern the user wrote?
413
+ -> Bool -- `True` if the pattern was generated, `False` if it was user-written
417
414
-> Pat GhcTc -- The pattern against which it is to be matched
418
415
-> DsM (DsWrapper , -- Extra bindings to do before the match
419
416
Pat GhcTc ) -- Equivalent pattern
@@ -424,10 +421,10 @@ tidy1 :: Id -- The Id being scrutinised
424
421
-- It eliminates many pattern forms (as-patterns, variable patterns,
425
422
-- list patterns, etc) and returns any created bindings in the wrapper.
426
423
427
- tidy1 v o (ParPat _ _ pat _) = tidy1 v o (unLoc pat)
428
- tidy1 v o (SigPat _ pat _) = tidy1 v o (unLoc pat)
424
+ tidy1 v g (ParPat _ _ pat _) = tidy1 v g (unLoc pat)
425
+ tidy1 v g (SigPat _ pat _) = tidy1 v g (unLoc pat)
429
426
tidy1 _ _ (WildPat ty) = return (idDsWrapper, WildPat ty)
430
- tidy1 v o (BangPat _ (L l p)) = tidy_bang_pat v o l p
427
+ tidy1 v g (BangPat _ (L l p)) = tidy_bang_pat v g l p
431
428
432
429
-- case v of { x -> mr[] }
433
430
-- = case v of { _ -> let x=v in mr[] }
@@ -436,8 +433,8 @@ tidy1 v _ (VarPat _ (L _ var))
436
433
437
434
-- case v of { x@p -> mr[] }
438
435
-- = case v of { p -> let x=v in mr[] }
439
- tidy1 v o (AsPat _ (L _ var) _ pat)
440
- = do { (wrap, pat') <- tidy1 v o (unLoc pat)
436
+ tidy1 v g (AsPat _ (L _ var) _ pat)
437
+ = do { (wrap, pat') <- tidy1 v g (unLoc pat)
441
438
; return (wrapBind var v . wrap, pat') }
442
439
443
440
{- now, here we handle lazy patterns:
@@ -489,22 +486,22 @@ tidy1 _ _ (SumPat tys pat alt arity)
489
486
-- See Note [Unboxed tuple RuntimeRep vars] in TyCon
490
487
491
488
-- LitPats: we *might* be able to replace these w/ a simpler form
492
- tidy1 _ o (LitPat _ lit)
493
- = do { unless (isGenerated o) $
489
+ tidy1 _ g (LitPat _ lit)
490
+ = do { unless g $
494
491
warnAboutOverflowedLit lit
495
492
; return (idDsWrapper, tidyLitPat lit) }
496
493
497
494
-- NPats: we *might* be able to replace these w/ a simpler form
498
- tidy1 _ o (NPat ty (L _ lit@ OverLit { ol_val = v }) mb_neg eq)
499
- = do { unless (isGenerated o) $
495
+ tidy1 _ g (NPat ty (L _ lit@ OverLit { ol_val = v }) mb_neg eq)
496
+ = do { unless g $
500
497
let lit' | Just _ <- mb_neg = lit{ ol_val = negateOverLitVal v }
501
498
| otherwise = lit
502
499
in warnAboutOverflowedOverLit lit'
503
500
; return (idDsWrapper, tidyNPat lit mb_neg eq ty) }
504
501
505
502
-- NPlusKPat: we may want to warn about the literals
506
- tidy1 _ o n@ (NPlusKPat _ _ (L _ lit1) lit2 _ _)
507
- = do { unless (isGenerated o) $ do
503
+ tidy1 _ g n@ (NPlusKPat _ _ (L _ lit1) lit2 _ _)
504
+ = do { unless g $ do
508
505
warnAboutOverflowedOverLit lit1
509
506
warnAboutOverflowedOverLit lit2
510
507
; return (idDsWrapper, n) }
@@ -514,28 +511,28 @@ tidy1 _ _ non_interesting_pat
514
511
= return (idDsWrapper, non_interesting_pat)
515
512
516
513
--------------------
517
- tidy_bang_pat :: Id -> Origin -> SrcSpanAnnA -> Pat GhcTc
514
+ tidy_bang_pat :: Id -> Bool -> SrcSpanAnnA -> Pat GhcTc
518
515
-> DsM (DsWrapper , Pat GhcTc )
519
516
520
517
-- Discard par/sig under a bang
521
- tidy_bang_pat v o _ (ParPat _ _ (L l p) _) = tidy_bang_pat v o l p
522
- tidy_bang_pat v o _ (SigPat _ (L l p) _) = tidy_bang_pat v o l p
518
+ tidy_bang_pat v g _ (ParPat _ _ (L l p) _) = tidy_bang_pat v g l p
519
+ tidy_bang_pat v g _ (SigPat _ (L l p) _) = tidy_bang_pat v g l p
523
520
524
521
-- Push the bang-pattern inwards, in the hope that
525
522
-- it may disappear next time
526
- tidy_bang_pat v o l (AsPat x v' at p)
527
- = tidy1 v o (AsPat x v' at (L l (BangPat noExtField p)))
528
- tidy_bang_pat v o l (XPat (CoPat w p t))
529
- = tidy1 v o (XPat $ CoPat w (BangPat noExtField (L l p)) t)
523
+ tidy_bang_pat v g l (AsPat x v' at p)
524
+ = tidy1 v g (AsPat x v' at (L l (BangPat noExtField p)))
525
+ tidy_bang_pat v g l (XPat (CoPat w p t))
526
+ = tidy1 v g (XPat $ CoPat w (BangPat noExtField (L l p)) t)
530
527
531
528
-- Discard bang around strict pattern
532
- tidy_bang_pat v o _ p@ (LitPat {}) = tidy1 v o p
533
- tidy_bang_pat v o _ p@ (ListPat {}) = tidy1 v o p
534
- tidy_bang_pat v o _ p@ (TuplePat {}) = tidy1 v o p
535
- tidy_bang_pat v o _ p@ (SumPat {}) = tidy1 v o p
529
+ tidy_bang_pat v g _ p@ (LitPat {}) = tidy1 v g p
530
+ tidy_bang_pat v g _ p@ (ListPat {}) = tidy1 v g p
531
+ tidy_bang_pat v g _ p@ (TuplePat {}) = tidy1 v g p
532
+ tidy_bang_pat v g _ p@ (SumPat {}) = tidy1 v g p
536
533
537
534
-- Data/newtype constructors
538
- tidy_bang_pat v o l p@ (ConPat { pat_con = L _ (RealDataCon dc)
535
+ tidy_bang_pat v g l p@ (ConPat { pat_con = L _ (RealDataCon dc)
539
536
, pat_args = args
540
537
, pat_con_ext = ConPatTc
541
538
{ cpt_arg_tys = arg_tys
@@ -544,8 +541,8 @@ tidy_bang_pat v o l p@(ConPat { pat_con = L _ (RealDataCon dc)
544
541
-- Newtypes: push bang inwards (#9844)
545
542
=
546
543
if isNewTyCon (dataConTyCon dc)
547
- then tidy1 v o (p { pat_args = push_bang_into_newtype_arg l (scaledThing ty) args })
548
- else tidy1 v o p -- Data types: discard the bang
544
+ then tidy1 v g (p { pat_args = push_bang_into_newtype_arg l (scaledThing ty) args })
545
+ else tidy1 v g p -- Data types: discard the bang
549
546
where
550
547
(ty: _) = dataConInstArgTys dc arg_tys
551
548
@@ -808,16 +805,14 @@ matchWrapper ctxt scrs (MG { mg_alts = L _ matches
808
805
mk_eqn_info :: LMatch GhcTc (LHsExpr GhcTc ) -> (Nablas , NonEmpty Nablas ) -> DsM EquationInfo
809
806
mk_eqn_info (L _ (Match { m_pats = pats, m_grhss = grhss })) (pat_nablas, rhss_nablas)
810
807
= do { dflags <- getDynFlags
811
- ; let upats = map (unLoc . decideBangHood dflags) pats
808
+ ; let upats = map (decideBangHood dflags) pats
812
809
-- pat_nablas is the covered set *after* matching the pattern, but
813
810
-- before any of the GRHSs. We extend the environment with pat_nablas
814
811
-- (via updPmNablas) so that the where-clause of 'grhss' can profit
815
812
-- from that knowledge (#18533)
816
813
; match_result <- updPmNablas pat_nablas $
817
814
dsGRHSs ctxt grhss rhs_ty rhss_nablas
818
- ; return EqnInfo { eqn_pats = upats
819
- , eqn_orig = FromSource
820
- , eqn_rhs = match_result } }
815
+ ; return $ mkEqnInfo upats match_result }
821
816
822
817
discard_warnings_if_skip_pmc orig =
823
818
if requiresPMC orig
@@ -958,10 +953,9 @@ matchSinglePatVar var mb_scrut ctx pat ty match_result
958
953
pmcPatBind (DsMatchContext ctx locn) var (unLoc pat)
959
954
else getLdiNablas
960
955
961
- ; let eqn_info = EqnInfo { eqn_pats = [unLoc (decideBangHood dflags pat)]
962
- , eqn_orig = FromSource
963
- , eqn_rhs =
964
- updPmNablasMatchResult ldi_nablas match_result }
956
+ ; let eqn_info = EqnMatch { eqn_pat = decideBangHood dflags pat
957
+ , eqn_rest =
958
+ EqnDone $ updPmNablasMatchResult ldi_nablas match_result }
965
959
-- See Note [Long-distance information in do notation]
966
960
-- in GHC.HsToCore.Expr.
967
961
@@ -999,6 +993,13 @@ data PatGroup
999
993
-- the LHsExpr is the expression e
1000
994
Type -- the Type is the type of p (equivalently, the result type of e)
1001
995
996
+ instance Show PatGroup where
997
+ show PgAny = " PgAny"
998
+ show (PgCon _) = " PgCon"
999
+ show (PgLit _) = " PgLit"
1000
+ show (PgView _ _) = " PgView"
1001
+ show _ = " PgOther"
1002
+
1002
1003
{- Note [Don't use Literal for PgN]
1003
1004
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1004
1005
Previously we had, as PatGroup constructors
@@ -1019,7 +1020,7 @@ the PgN constructor as a FractionalLit if numeric, and add a PgOverStr construct
1019
1020
for overloaded strings.
1020
1021
-}
1021
1022
1022
- groupEquations :: Platform -> [EquationInfo ] -> [NonEmpty (PatGroup , EquationInfo )]
1023
+ groupEquations :: Platform -> [EquationInfoNE ] -> [NonEmpty (PatGroup , EquationInfoNE )]
1023
1024
-- If the result is of form [g1, g2, g3],
1024
1025
-- (a) all the (pg,eq) pairs in g1 have the same pg
1025
1026
-- (b) none of the gi are empty
@@ -1163,8 +1164,8 @@ viewLExprEq (e1,_) (e2,_) = lexp e1 e2
1163
1164
exp (HsApp _ e1 e2) (HsApp _ e1' e2') = lexp e1 e1' && lexp e2 e2'
1164
1165
-- the fixities have been straightened out by now, so it's safe
1165
1166
-- to ignore them?
1166
- exp (OpApp _ l o ri) (OpApp _ l' o' ri') =
1167
- lexp l l' && lexp o o' && lexp ri ri'
1167
+ exp (OpApp _ l g ri) (OpApp _ l' o' ri') =
1168
+ lexp l l' && lexp g o' && lexp ri ri'
1168
1169
exp (NegApp _ e n) (NegApp _ e' n') = lexp e e' && syn_exp n n'
1169
1170
exp (SectionL _ e1 e2) (SectionL _ e1' e2') =
1170
1171
lexp e1 e1' && lexp e2 e2'
0 commit comments