summaryrefslogtreecommitdiff
path: root/compiler/deSugar/DsExpr.lhs
diff options
context:
space:
mode:
authorDr. ERDI Gergo <gergo@erdi.hu>2014-11-12 18:18:09 +0800
committerDr. ERDI Gergo <gergo@erdi.hu>2014-11-13 23:38:39 +0800
commit5fe872d3bc2d03976fb89b5659e14d2179210ee1 (patch)
tree513bd8fe1e363ee5c61ac6fdd5aa6e55369d4cc7 /compiler/deSugar/DsExpr.lhs
parent7f929862388afd54043d59b37f2f5375c5315344 (diff)
downloadhaskell-5fe872d3bc2d03976fb89b5659e14d2179210ee1.tar.gz
Apply compulsory unfoldings during desugaring, except for `seq` which is special.
See Note [Unfolding while desugaring] for the rationale.
Diffstat (limited to 'compiler/deSugar/DsExpr.lhs')
-rw-r--r--compiler/deSugar/DsExpr.lhs22
1 files changed, 21 insertions, 1 deletions
diff --git a/compiler/deSugar/DsExpr.lhs b/compiler/deSugar/DsExpr.lhs
index 6844f48970..ce2d5a5d4a 100644
--- a/compiler/deSugar/DsExpr.lhs
+++ b/compiler/deSugar/DsExpr.lhs
@@ -46,12 +46,14 @@ import MkCore
import DynFlags
import CostCentre
import Id
+import Unique
import Module
import VarSet
import VarEnv
import ConLike
import DataCon
import TysWiredIn
+import PrelNames ( seqIdKey )
import BasicTypes
import Maybes
import SrcLoc
@@ -191,7 +193,12 @@ dsLExpr (L loc e) = putSrcSpanDs loc $ dsExpr e
dsExpr :: HsExpr Id -> DsM CoreExpr
dsExpr (HsPar e) = dsLExpr e
dsExpr (ExprWithTySigOut e _) = dsLExpr e
-dsExpr (HsVar var) = return (varToCoreExpr var) -- See Note [Desugaring vars]
+dsExpr (HsVar var) -- See Note [Unfolding while desugaring]
+ | unfold_var = return $ unfoldingTemplate unfolding
+ | otherwise = return (varToCoreExpr var) -- See Note [Desugaring vars]
+ where
+ unfold_var = isCompulsoryUnfolding unfolding && not (var `hasKey` seqIdKey)
+ unfolding = idUnfolding var
dsExpr (HsIPVar _) = panic "dsExpr: HsIPVar"
dsExpr (HsLit lit) = dsLit lit
dsExpr (HsOverLit lit) = dsOverLit lit
@@ -220,6 +227,19 @@ dsExpr (HsApp fun arg)
dsExpr (HsUnboundVar _) = panic "dsExpr: HsUnboundVar"
\end{code}
+Note [Unfolding while desugaring]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Variables with compulsory unfolding must be substituted at desugaring
+time. This is needed to preserve the let/app invariant in cases where
+the unfolding changes whether wrapping in a case is needed.
+Suppose we have a call like this:
+ I# x
+where 'x' has an unfolding like this:
+ f void#
+In this case, 'mkCoreAppDs' needs to see 'f void#', not 'x', to be
+able to do the right thing.
+
+
Note [Desugaring vars]
~~~~~~~~~~~~~~~~~~~~~~
In one situation we can get a *coercion* variable in a HsVar, namely