summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2012-09-15 23:06:20 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2012-09-15 23:06:20 +0100
commit84bb8541fffb99d425fcd50532dc4556f4bd7aca (patch)
tree71ba1048f0a74a3b8c3cf73f5be1a3b57b62bd7f /compiler
parentcf02909e1fc10597c3291817ab905d426307405b (diff)
downloadhaskell-84bb8541fffb99d425fcd50532dc4556f4bd7aca.tar.gz
Fix Trac #7237; mixup with empty tuples
When converting from Core to STG, we swith pattern matching on on a *nullary* unboxed tuple into matching using a PrimAlt on RealWorld# case e (RealWorld#) of { DEFAULT -> ... } This semms messy to me, but it works. There was a bug in that we were changing to PrimAlt, but not using a DEFAULT AltCon.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/stgSyn/CoreToStg.lhs11
-rw-r--r--compiler/types/Type.lhs16
2 files changed, 18 insertions, 9 deletions
diff --git a/compiler/stgSyn/CoreToStg.lhs b/compiler/stgSyn/CoreToStg.lhs
index 6dc091961a..eed579eed7 100644
--- a/compiler/stgSyn/CoreToStg.lhs
+++ b/compiler/stgSyn/CoreToStg.lhs
@@ -36,6 +36,7 @@ import Maybes ( maybeToBool )
import Name ( getOccName, isExternalName, nameOccName )
import OccName ( occNameString, occNameFS )
import BasicTypes ( Arity )
+import TysWiredIn ( unboxedUnitDataCon )
import Literal
import Outputable
import MonadUtils
@@ -420,6 +421,14 @@ coreToStgExpr (Case scrut bndr _ alts) = do
)
where
vars_alt (con, binders, rhs)
+ | DataAlt c <- con, c == unboxedUnitDataCon
+ = -- This case is a bit smelly.
+ -- See Note [Nullary unboxed tuple] in Type.lhs
+ -- where a nullary tuple is mapped to (State# World#)
+ ASSERT( null binders )
+ do { (rhs2, rhs_fvs, rhs_escs) <- coreToStgExpr rhs
+ ; return ((DEFAULT, [], [], rhs2), rhs_fvs, rhs_escs) }
+ | otherwise
= let -- Remove type variables
binders' = filterStgBinders binders
in
@@ -463,7 +472,7 @@ mkStgAltType bndr alts = case repType (idType bndr) of
PolyAlt
Nothing -> PolyAlt
UbxTupleRep rep_tys -> UbxTupAlt (length rep_tys)
-
+ -- NB Nullary unboxed tuples have UnaryRep, and generate a PrimAlt
where
_is_poly_alt_tycon tc
= isFunTyCon tc
diff --git a/compiler/types/Type.lhs b/compiler/types/Type.lhs
index 6a38030c08..4e8e631015 100644
--- a/compiler/types/Type.lhs
+++ b/compiler/types/Type.lhs
@@ -612,14 +612,14 @@ newtype at outermost level; and bale out if we see it again.
Note [Nullary unboxed tuple]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-We represent the nullary unboxed tuple as the unary (but void) type State# RealWorld.
-The reason for this is that the ReprArity is never less than the Arity (as it would
-otherwise be for a function type like (# #) -> Int).
-
-As a result, ReprArity is always strictly positive if Arity is. This is important
-because it allows us to distinguish at runtime between a thunk and a function
- takes a nullary unboxed tuple as an argument!
+We represent the nullary unboxed tuple as the unary (but void) type
+State# RealWorld. The reason for this is that the ReprArity is never
+less than the Arity (as it would otherwise be for a function type like
+(# #) -> Int).
+
+As a result, ReprArity is always strictly positive if Arity is. This
+is important because it allows us to distinguish at runtime between a
+thunk and a function takes a nullary unboxed tuple as an argument!
\begin{code}
type UnaryType = Type