Handle introduction of MkCore in DsMeta
[ghc-hetmet.git] / compiler / deSugar / DsUtils.lhs
index 553b468..071953f 100644 (file)
@@ -168,8 +168,8 @@ mk_val_app (Var f `App` Type ty1 `App` Type _ `App` arg1) arg2 _ res_ty
   = Case arg1 case_bndr res_ty [(DEFAULT,[],arg2)]
   where
     case_bndr = case arg1 of
-                  Var v1 -> v1 -- Note [Desugaring seq (2)]
-                  _      -> mkWildId ty1
+                  Var v1 | isLocalId v1 -> v1  -- Note [Desugaring seq (2) and (3)]
+                  _                     -> mkWildId ty1
 
 mk_val_app fun arg arg_ty _    -- See Note [CoreSyn let/app invariant]
   | not (isUnLiftedType arg_ty) || exprOkForSpeculation arg
@@ -220,7 +220,7 @@ the seq, by re-introducing the space leak:
 We can try to avoid doing this by ensuring that the binder-swap in the
 case happens, so we get his at an early stage:
    case chp of chp2 { I# -> ...chp2... }
-But this is fragile.  The real culprit is the source program.  Perhpas we
+But this is fragile.  The real culprit is the source program.  Perhaps we
 should have said explicitly
    let !chp2 = chp in ...chp2...
 
@@ -234,6 +234,15 @@ Notice the shadowing of the case binder! And now all is well.
 The reason it's a hack is because if you define mySeq=seq, the hack
 won't work on mySeq.  
 
+Note [Desugaring seq (3)] cf Trac #2409
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The isLocalId ensures that we don't turn 
+       True `seq` e
+into
+       case True of True { ... }
+which stupidly tries to bind the datacon 'True'. 
+
+
 %************************************************************************
 %*                                                                     *
 \subsection{ Selecting match variables}
@@ -532,15 +541,15 @@ mkErrorAppDs err_id ty msg = do
 \end{code}
 
 
-*************************************************************
+%************************************************************************
 %*                                                                     *
 \subsection{Making literals}
 %*                                                                     *
 %************************************************************************
 
 \begin{code}
-mkCharExpr     :: Char      -> CoreExpr      -- Returns        C# c :: Int
-mkIntExpr      :: Integer    -> CoreExpr      -- Returns       I# i :: Int
+mkCharExpr     :: Char      -> CoreExpr      -- Returns @C# c :: Int@
+mkIntExpr      :: Integer    -> CoreExpr      -- Returns @I# i :: Int@
 mkIntegerExpr  :: Integer    -> DsM CoreExpr  -- Result :: Integer
 mkStringExpr   :: String     -> DsM CoreExpr  -- Result :: String
 mkStringExprFS :: FastString -> DsM CoreExpr  -- Result :: String
@@ -797,17 +806,18 @@ mkLHsVarTup ids  = mkLHsTup (map nlHsVar ids)
 mkLHsTup :: [LHsExpr Id] -> LHsExpr Id
 mkLHsTup []     = nlHsVar unitDataConId
 mkLHsTup [lexp] = lexp
-mkLHsTup lexps  = noLoc $ ExplicitTuple lexps Boxed
-
+mkLHsTup lexps  = L (getLoc (head lexps)) $ 
+                 ExplicitTuple lexps Boxed
 
 -- Smart constructors for source tuple patterns
 mkLHsVarPatTup :: [Id] -> LPat Id
 mkLHsVarPatTup bs  = mkLHsPatTup (map nlVarPat bs)
 
 mkLHsPatTup :: [LPat Id] -> LPat Id
+mkLHsPatTup []     = noLoc $ mkVanillaTuplePat [] Boxed
 mkLHsPatTup [lpat] = lpat
-mkLHsPatTup lpats  = noLoc $ mkVanillaTuplePat lpats Boxed -- Handles the case where lpats = [] gracefully
-
+mkLHsPatTup lpats  = L (getLoc (head lpats)) $ 
+                    mkVanillaTuplePat lpats Boxed
 
 -- The Big equivalents for the source tuple expressions
 mkBigLHsVarTup :: [Id] -> LHsExpr Id
@@ -823,7 +833,6 @@ mkBigLHsVarPatTup bs = mkBigLHsPatTup (map nlVarPat bs)
 
 mkBigLHsPatTup :: [LPat Id] -> LPat Id
 mkBigLHsPatTup = mkBigTuple mkLHsPatTup
-
 \end{code}