Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : ghc-7.6

http://hackage.haskell.org/trac/ghc/changeset/b1f3b61a9efa5d19bc36f4f7bd1e28395350e1a4

>---------------------------------------------------------------

commit b1f3b61a9efa5d19bc36f4f7bd1e28395350e1a4
Author: Simon Peyton Jones <[email protected]>
Date:   Sat Sep 15 23:06:20 2012 +0100

    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.

>---------------------------------------------------------------

 compiler/stgSyn/CoreToStg.lhs |   11 ++++++++++-
 compiler/types/Type.lhs       |   16 ++++++++--------
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/compiler/stgSyn/CoreToStg.lhs b/compiler/stgSyn/CoreToStg.lhs
index 6dc0919..eed579e 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 1099303..98aee9e 100644
--- a/compiler/types/Type.lhs
+++ b/compiler/types/Type.lhs
@@ -611,14 +611,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



_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to