diff options
author | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2018-03-26 23:15:32 +0300 |
---|---|---|
committer | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2018-03-26 23:16:03 +0300 |
commit | 41c155876c9e8137ff9b9f9f9a12c4a78a44bc70 (patch) | |
tree | 9d3402cfd5eb749e90e822bb4e827f6ffa2d408e | |
parent | f0b258bc7e2d4ef32a20c61b7285a21f7680660e (diff) | |
download | haskell-41c155876c9e8137ff9b9f9f9a12c4a78a44bc70.tar.gz |
Make it evident in types that StgLam can't have empty args
StgLam can't have empty arguments. Reflect this in types. An assertion
can now be deleted.
Reviewers: bgamari
Reviewed By: bgamari
Subscribers: rwbarton, thomie, carter
Differential Revision: https://phabricator.haskell.org/D4484
-rw-r--r-- | compiler/stgSyn/CoreToStg.hs | 13 | ||||
-rw-r--r-- | compiler/stgSyn/StgSyn.hs | 6 |
2 files changed, 11 insertions, 8 deletions
diff --git a/compiler/stgSyn/CoreToStg.hs b/compiler/stgSyn/CoreToStg.hs index cb4e7f65d3..3ee3ba5cc4 100644 --- a/compiler/stgSyn/CoreToStg.hs +++ b/compiler/stgSyn/CoreToStg.hs @@ -49,6 +49,7 @@ import PrimOp ( PrimCall(..) ) import UniqFM import SrcLoc ( mkGeneralSrcSpan ) +import Data.List.NonEmpty (nonEmpty, toList) import Data.Maybe (isJust, fromMaybe) import Control.Monad (liftM, ap) @@ -418,9 +419,10 @@ coreToStgExpr expr@(Lam _ _) extendVarEnvCts [ (a, LambdaBound) | a <- args' ] $ do (body, body_fvs) <- coreToStgExpr body let - fvs = args' `minusFVBinders` body_fvs - result_expr | null args' = body - | otherwise = StgLam args' body + fvs = args' `minusFVBinders` body_fvs + result_expr = case nonEmpty args' of + Nothing -> body + Just args'' -> StgLam args'' body return (result_expr, fvs) @@ -771,11 +773,10 @@ mkTopStgRhs :: DynFlags -> Module -> CollectedCCs mkTopStgRhs dflags this_mod ccs rhs_fvs bndr binder_info rhs | StgLam bndrs body <- rhs = -- StgLam can't have empty arguments, so not CAF - ASSERT(not (null bndrs)) ( StgRhsClosure dontCareCCS binder_info (getFVs rhs_fvs) ReEntrant - bndrs body + (toList bndrs) body , ccs ) | StgConApp con args _ <- unticked_rhs @@ -825,7 +826,7 @@ mkStgRhs rhs_fvs bndr binder_info rhs = StgRhsClosure currentCCS binder_info (getFVs rhs_fvs) ReEntrant - bndrs body + (toList bndrs) body | isJoinId bndr -- must be a nullary join point = ASSERT(idJoinArity bndr == 0) diff --git a/compiler/stgSyn/StgSyn.hs b/compiler/stgSyn/StgSyn.hs index 29d544103f..608a028673 100644 --- a/compiler/stgSyn/StgSyn.hs +++ b/compiler/stgSyn/StgSyn.hs @@ -70,6 +70,8 @@ import RepType ( typePrimRep1 ) import Unique ( Unique ) import Util +import Data.List.NonEmpty ( NonEmpty, toList ) + {- ************************************************************************ * * @@ -221,7 +223,7 @@ finished it encodes (\x -> e) as (let f = \x -> e in f) -} | StgLam - [bndr] + (NonEmpty bndr) StgExpr -- Body of lambda {- @@ -721,7 +723,7 @@ pprStgExpr (StgOpApp op args _) = hsep [ pprStgOp op, brackets (interppSP args)] pprStgExpr (StgLam bndrs body) - = sep [ char '\\' <+> ppr_list (map (pprBndr LambdaBind) bndrs) + = sep [ char '\\' <+> ppr_list (map (pprBndr LambdaBind) (toList bndrs)) <+> text "->", pprStgExpr body ] where ppr_list = brackets . fsep . punctuate comma |