[project @ 2002-06-05 14:39:27 by simonpj]
[ghc-hetmet.git] / ghc / compiler / rename / RnExpr.lhs
index e483327..fd08c0f 100644 (file)
@@ -11,44 +11,49 @@ free variables.
 
 \begin{code}
 module RnExpr (
-       rnMatch, rnGRHSs, rnPat, rnExpr, rnExprs,
+       rnMatch, rnGRHSs, rnPat, rnExpr, rnExprs, rnStmt,
        checkPrecMatch
    ) where
 
 #include "HsVersions.h"
 
 import {-# SOURCE #-} RnBinds  ( rnBinds ) 
-import {-# SOURCE #-} RnSource ( rnHsSigType, rnHsType )
 
 import HsSyn
 import RdrHsSyn
 import RnHsSyn
 import RnMonad
 import RnEnv
-import RnIfaces                ( lookupFixity )
-import CmdLineOpts     ( opt_GlasgowExts, opt_IgnoreAsserts )
-import BasicTypes      ( Fixity(..), FixityDirection(..), defaultFixity )
-import PrelInfo                ( numClass_RDR, fractionalClass_RDR, eqClass_RDR, 
-                         ccallableClass_RDR, creturnableClass_RDR, 
-                         monadClass_RDR, enumClass_RDR, ordClass_RDR,
-                         ratioDataCon_RDR, negate_RDR, assertErr_RDR,
-                         ioDataCon_RDR
-                       )
+import RnTypes         ( rnHsTypeFVs, precParseErr, sectionPrecErr )
+import CmdLineOpts     ( DynFlag(..), opt_IgnoreAsserts )
+import Literal         ( inIntRange, inCharRange )
+import BasicTypes      ( Fixity(..), FixityDirection(..), IPName(..),
+                         defaultFixity, negateFixity, compareFixity )
+import PrelNames       ( hasKey, assertIdKey, 
+                         eqClassName, foldrName, buildName, eqStringName,
+                         cCallableClassName, cReturnableClassName, 
+                         monadClassName, enumClassName, ordClassName,
+                         ratioDataConName, splitName, fstName, sndName,
+                         ioDataConName, plusIntegerName, timesIntegerName,
+                         assertErr_RDR,
+                         replicatePName, mapPName, filterPName,
+                         falseDataConName, trueDataConName, crossPName,
+                         zipPName, lengthPName, indexPName, toPName,
+                         enumFromToPName, enumFromThenToPName, 
+                         fromIntegerName, fromRationalName, minusName, negateName,
+                         failMName, bindMName, thenMName, returnMName )
 import TysPrim         ( charPrimTyCon, addrPrimTyCon, intPrimTyCon, 
-                         floatPrimTyCon, doublePrimTyCon
-                       )
-import Name            ( nameUnique, isLocallyDefined, NamedThing(..)
-                        , mkSysLocalName, nameSrcLoc
-                       )
+                         floatPrimTyCon, doublePrimTyCon )
+import TysWiredIn      ( intTyCon )
+import Name            ( NamedThing(..), mkSystemName, nameSrcLoc )
 import NameSet
+import UnicodeUtil     ( stringToUtf8 )
 import UniqFM          ( isNullUFM )
-import FiniteMap       ( elemFM )
-import UniqSet         ( emptyUniqSet, UniqSet )
-import Unique          ( assertIdKey )
-import Util            ( removeDups )
-import ListSetOps      ( unionLists )
-import Maybes          ( maybeToBool )
+import UniqSet         ( emptyUniqSet )
+import List            ( intersectBy )
+import ListSetOps      ( removeDups )
 import Outputable
+import FastString
 \end{code}
 
 
@@ -68,21 +73,42 @@ rnPat (VarPatIn name)
     returnRn (VarPatIn vname, emptyFVs)
 
 rnPat (SigPatIn pat ty)
-  | opt_GlasgowExts
-  = rnPat pat          `thenRn` \ (pat', fvs1) ->
-    rnHsType doc ty    `thenRn` \ (ty',  fvs2) ->
-    returnRn (SigPatIn pat' ty', fvs1 `plusFV` fvs2)
-
-  | otherwise
-  = addErrRn (patSigErr ty)    `thenRn_`
-    rnPat pat
+  = doptRn Opt_GlasgowExts `thenRn` \ glaExts ->
+    
+    if glaExts
+    then rnPat pat             `thenRn` \ (pat', fvs1) ->
+         rnHsTypeFVs doc ty    `thenRn` \ (ty',  fvs2) ->
+         returnRn (SigPatIn pat' ty', fvs1 `plusFV` fvs2)
+
+    else addErrRn (patSigErr ty)       `thenRn_`
+         rnPat pat
   where
     doc = text "a pattern type-signature"
     
+rnPat (LitPatIn s@(HsString _)) 
+  = returnRn (LitPatIn s, unitFV eqStringName)
+
 rnPat (LitPatIn lit) 
-  = litOccurrence lit                  `thenRn` \ fvs1 ->
-    lookupImplicitOccRn eqClass_RDR    `thenRn` \ eq   ->      -- Needed to find equality on pattern
-    returnRn (LitPatIn lit, fvs1 `addOneFV` eq)
+  = litFVs lit         `thenRn` \ fvs ->
+    returnRn (LitPatIn lit, fvs) 
+
+rnPat (NPatIn lit mb_neg) 
+  = rnOverLit lit                      `thenRn` \ (lit', fvs1) ->
+    (case mb_neg of
+       Nothing  -> returnRn (Nothing, emptyFVs)
+       Just neg -> lookupSyntaxName neg        `thenRn` \ neg' ->
+                   returnRn (Just neg', unitFV neg')
+    )                                  `thenRn` \ (mb_neg', fvs2) ->
+    returnRn (NPatIn lit' mb_neg', 
+             fvs1 `plusFV` fvs2 `addOneFV` eqClassName)        
+       -- Needed to find equality on pattern
+
+rnPat (NPlusKPatIn name lit _)
+  = rnOverLit lit                      `thenRn` \ (lit', fvs) ->
+    lookupBndrRn name                  `thenRn` \ name' ->
+    lookupSyntaxName minusName         `thenRn` \ minus ->
+    returnRn (NPlusKPatIn name' lit' minus, 
+             fvs `addOneFV` ordClassName `addOneFV` minus)
 
 rnPat (LazyPatIn pat)
   = rnPat pat          `thenRn` \ (pat', fvs) ->
@@ -105,41 +131,28 @@ rnPat (ConOpPatIn pat1 con _ pat2)
 
     getModeRn          `thenRn` \ mode ->
        -- See comments with rnExpr (OpApp ...)
-    (case mode of
-       InterfaceMode -> returnRn (ConOpPatIn pat1' con' defaultFixity pat2')
-       SourceMode    -> lookupFixity con'      `thenRn` \ fixity ->
-                        mkConOpPatRn pat1' con' fixity pat2'
+    (if isInterfaceMode mode
+       then returnRn (ConOpPatIn pat1' con' defaultFixity pat2')
+       else lookupFixityRn con'        `thenRn` \ fixity ->
+            mkConOpPatRn pat1' con' fixity pat2'
     )                                                          `thenRn` \ pat' ->
     returnRn (pat', fvs1 `plusFV` fvs2 `addOneFV` con')
 
--- Negated patters can only be literals, and they are dealt with
--- by negating the literal at compile time, not by using the negation
--- operation in Num.  So we don't need to make an implicit reference
--- to negate_RDR.
-rnPat neg@(NegPatIn pat)
-  = checkRn (valid_neg_pat pat) (negPatErr neg)
-                       `thenRn_`
-    rnPat pat          `thenRn` \ (pat', fvs) ->
-    returnRn (NegPatIn pat', fvs)
-  where
-    valid_neg_pat (LitPatIn (HsInt  _)) = True
-    valid_neg_pat (LitPatIn (HsFrac _)) = True
-    valid_neg_pat _                     = False
-
 rnPat (ParPatIn pat)
   = rnPat pat          `thenRn` \ (pat', fvs) ->
     returnRn (ParPatIn pat', fvs)
 
-rnPat (NPlusKPatIn name lit)
-  = litOccurrence lit                  `thenRn` \ fvs ->
-    lookupImplicitOccRn ordClass_RDR   `thenRn` \ ord ->
-    lookupBndrRn name                  `thenRn` \ name' ->
-    returnRn (NPlusKPatIn name' lit, fvs `addOneFV` ord)
-
 rnPat (ListPatIn pats)
   = mapFvRn rnPat pats                 `thenRn` \ (patslist, fvs) ->
     returnRn (ListPatIn patslist, fvs `addOneFV` listTyCon_name)
 
+rnPat (PArrPatIn pats)
+  = mapFvRn rnPat pats                 `thenRn` \ (patslist, fvs) ->
+    returnRn (PArrPatIn patslist, 
+             fvs `plusFV` implicit_fvs `addOneFV` parrTyCon_name)
+  where
+    implicit_fvs = mkFVs [lengthPName, indexPName]
+
 rnPat (TuplePatIn pats boxed)
   = mapFvRn rnPat pats                                    `thenRn` \ (patslist, fvs) ->
     returnRn (TuplePatIn patslist boxed, fvs `addOneFV` tycon_name)
@@ -150,6 +163,10 @@ rnPat (RecPatIn con rpats)
   = lookupOccRn con    `thenRn` \ con' ->
     rnRpats rpats      `thenRn` \ (rpats', fvs) ->
     returnRn (RecPatIn con' rpats', fvs `addOneFV` con')
+
+rnPat (TypePatIn name)
+  = rnHsTypeFVs (text "type pattern") name     `thenRn` \ (name', fvs) ->
+    returnRn (TypePatIn name', fvs)
 \end{code}
 
 ************************************************************************
@@ -159,35 +176,33 @@ rnPat (RecPatIn con rpats)
 ************************************************************************
 
 \begin{code}
-rnMatch :: RdrNameMatch -> RnMS (RenamedMatch, FreeVars)
+rnMatch :: HsMatchContext RdrName -> RdrNameMatch -> RnMS (RenamedMatch, FreeVars)
 
-rnMatch match@(Match _ pats maybe_rhs_sig grhss)
+rnMatch ctxt match@(Match pats maybe_rhs_sig grhss)
   = pushSrcLocRn (getMatchLoc match)   $
 
-       -- Find the universally quantified type variables
-       -- in the pattern type signatures
-    getLocalNameEnv                    `thenRn` \ name_env ->
+       -- Bind pattern-bound type variables
     let
-       tyvars_in_sigs = rhs_sig_tyvars `unionLists` tyvars_in_pats
-       rhs_sig_tyvars = case maybe_rhs_sig of
+       rhs_sig_tys =  case maybe_rhs_sig of
                                Nothing -> []
-                               Just ty -> extractHsTyRdrNames ty
-       tyvars_in_pats = extractPatsTyVars pats
-       forall_tyvars  = filter (not . (`elemFM` name_env)) tyvars_in_sigs
-       doc            = text "a pattern type-signature"
+                               Just ty -> [ty]
+       pat_sig_tys = collectSigTysFromPats pats
+       doc_sig     = text "In a result type-signature"
+       doc_pat     = pprMatchContext ctxt
     in
-    bindTyVarsFVRn doc (map UserTyVar forall_tyvars)   $ \ sig_tyvars ->
+    bindPatSigTyVars (rhs_sig_tys ++ pat_sig_tys)      $ 
 
        -- Note that we do a single bindLocalsRn for all the
        -- matches together, so that we spot the repeated variable in
        --      f x x = 1
-    bindLocalsFVRn doc (collectPatsBinders pats) $ \ new_binders ->
+    bindLocalsFVRn doc_pat (collectPatsBinders pats)   $ \ new_binders ->
 
     mapFvRn rnPat pats                 `thenRn` \ (pats', pat_fvs) ->
     rnGRHSs grhss                      `thenRn` \ (grhss', grhss_fvs) ->
+    doptRn Opt_GlasgowExts             `thenRn` \ opt_GlasgowExts ->
     (case maybe_rhs_sig of
        Nothing -> returnRn (Nothing, emptyFVs)
-       Just ty | opt_GlasgowExts -> rnHsType doc ty    `thenRn` \ (ty', ty_fvs) ->
+       Just ty | opt_GlasgowExts -> rnHsTypeFVs doc_sig ty     `thenRn` \ (ty', ty_fvs) ->
                                     returnRn (Just ty', ty_fvs)
                | otherwise       -> addErrRn (patSigErr ty)    `thenRn_`
                                     returnRn (Nothing, emptyFVs)
@@ -200,10 +215,11 @@ rnMatch match@(Match _ pats maybe_rhs_sig grhss)
     in
     warnUnusedMatches unused_binders           `thenRn_`
     
-    returnRn (Match sig_tyvars pats' maybe_rhs_sig' grhss', all_fvs)
+    returnRn (Match pats' maybe_rhs_sig' grhss', all_fvs)
        -- The bindLocals and bindTyVars will remove the bound FVs
 \end{code}
 
+
 %************************************************************************
 %*                                                                     *
 \subsubsection{Guarded right-hand sides (GRHSs)}
@@ -213,29 +229,29 @@ rnMatch match@(Match _ pats maybe_rhs_sig grhss)
 \begin{code}
 rnGRHSs :: RdrNameGRHSs -> RnMS (RenamedGRHSs, FreeVars)
 
-rnGRHSs (GRHSs grhss binds maybe_ty)
-  = ASSERT( not (maybeToBool maybe_ty) )
-    rnBinds binds              $ \ binds' ->
+rnGRHSs (GRHSs grhss binds _)
+  = rnBinds binds              $ \ binds' ->
     mapFvRn rnGRHS grhss       `thenRn` \ (grhss', fvGRHSs) ->
-    returnRn (GRHSs grhss' binds' Nothing, fvGRHSs)
+    returnRn (GRHSs grhss' binds' placeHolderType, fvGRHSs)
 
 rnGRHS (GRHS guarded locn)
-  = pushSrcLocRn locn $                    
+  = doptRn Opt_GlasgowExts             `thenRn` \ opt_GlasgowExts ->
+    pushSrcLocRn locn $                    
     (if not (opt_GlasgowExts || is_standard_guard guarded) then
                addWarnRn (nonStdGuardErr guarded)
      else
                returnRn ()
     )          `thenRn_`
 
-    rnStmts rnExpr guarded     `thenRn` \ (guarded', fvs) ->
+    rnStmts guarded    `thenRn` \ ((_, guarded'), fvs) ->
     returnRn (GRHS guarded' locn, fvs)
   where
        -- Standard Haskell 1.4 guards are just a single boolean
        -- expression, rather than a list of qualifiers as in the
        -- Glasgow extension
-    is_standard_guard [ExprStmt _ _]                = True
-    is_standard_guard [GuardStmt _ _, ExprStmt _ _] = True
-    is_standard_guard other                        = False
+    is_standard_guard [ResultStmt _ _]                 = True
+    is_standard_guard [ExprStmt _ _ _, ResultStmt _ _] = True
+    is_standard_guard other                           = False
 \end{code}
 
 %************************************************************************
@@ -272,19 +288,32 @@ rnExpr :: RdrNameHsExpr -> RnMS (RenamedHsExpr, FreeVars)
 
 rnExpr (HsVar v)
   = lookupOccRn v      `thenRn` \ name ->
-    if nameUnique name == assertIdKey then
+    if name `hasKey` assertIdKey then
        -- We expand it to (GHCerr.assert__ location)
         mkAssertExpr
     else
         -- The normal case
        returnRn (HsVar name, unitFV name)
 
+rnExpr (HsIPVar v)
+  = newIPName v                        `thenRn` \ name ->
+    let 
+       fvs = case name of
+               Linear _  -> mkFVs [splitName, fstName, sndName]
+               Dupable _ -> emptyFVs 
+    in   
+    returnRn (HsIPVar name, fvs)
+
 rnExpr (HsLit lit) 
-  = litOccurrence lit          `thenRn` \ fvs ->
+  = litFVs lit         `thenRn` \ fvs -> 
     returnRn (HsLit lit, fvs)
 
+rnExpr (HsOverLit lit) 
+  = rnOverLit lit              `thenRn` \ (lit', fvs) ->
+    returnRn (HsOverLit lit', fvs)
+
 rnExpr (HsLam match)
-  = rnMatch match      `thenRn` \ (match', fvMatch) ->
+  = rnMatch LambdaExpr match   `thenRn` \ (match', fvMatch) ->
     returnRn (HsLam match', fvMatch)
 
 rnExpr (HsApp fun arg)
@@ -303,52 +332,54 @@ rnExpr (OpApp e1 op _ e2)
        -- that the deriving code generator got the association correct
        -- Don't even look up the fixity when in interface mode
     getModeRn                          `thenRn` \ mode -> 
-    (case mode of
-       SourceMode    -> lookupFixity op_name           `thenRn` \ fixity ->
-                        mkOpAppRn e1' op' fixity e2'
-       InterfaceMode -> returnRn (OpApp e1' op' defaultFixity e2')
+    (if isInterfaceMode mode
+       then returnRn (OpApp e1' op' defaultFixity e2')
+       else lookupFixityRn op_name             `thenRn` \ fixity ->
+            mkOpAppRn e1' op' fixity e2'
     )                                  `thenRn` \ final_e -> 
 
     returnRn (final_e,
              fv_e1 `plusFV` fv_op `plusFV` fv_e2)
 
-rnExpr (NegApp e n)
-  = rnExpr e                           `thenRn` \ (e', fv_e) ->
-    lookupImplicitOccRn negate_RDR     `thenRn` \ neg ->
-    mkNegAppRn e' (HsVar neg)          `thenRn` \ final_e ->
-    returnRn (final_e, fv_e `addOneFV` neg)
+rnExpr (NegApp e _)
+  = rnExpr e                   `thenRn` \ (e', fv_e) ->
+    lookupSyntaxName negateName        `thenRn` \ neg_name ->
+    mkNegAppRn e' neg_name     `thenRn` \ final_e ->
+    returnRn (final_e, fv_e `addOneFV` neg_name)
 
 rnExpr (HsPar e)
   = rnExpr e           `thenRn` \ (e', fvs_e) ->
     returnRn (HsPar e', fvs_e)
 
-rnExpr (SectionL expr op)
-  = rnExpr expr                `thenRn` \ (expr', fvs_expr) ->
-    rnExpr op          `thenRn` \ (op', fvs_op) ->
+rnExpr section@(SectionL expr op)
+  = rnExpr expr                                        `thenRn` \ (expr', fvs_expr) ->
+    rnExpr op                                  `thenRn` \ (op', fvs_op) ->
+    checkSectionPrec InfixL section op' expr' `thenRn_`
     returnRn (SectionL expr' op', fvs_op `plusFV` fvs_expr)
 
-rnExpr (SectionR op expr)
-  = rnExpr op          `thenRn` \ (op',   fvs_op) ->
-    rnExpr expr                `thenRn` \ (expr', fvs_expr) ->
+rnExpr section@(SectionR op expr)
+  = rnExpr op                                  `thenRn` \ (op',   fvs_op) ->
+    rnExpr expr                                        `thenRn` \ (expr', fvs_expr) ->
+    checkSectionPrec InfixR section op' expr'  `thenRn_`
     returnRn (SectionR op' expr', fvs_op `plusFV` fvs_expr)
 
-rnExpr (CCall fun args may_gc is_casm fake_result_ty)
+rnExpr (HsCCall fun args may_gc is_casm _)
        -- Check out the comment on RnIfaces.getNonWiredDataDecl about ccalls
-  = lookupImplicitOccRn ccallableClass_RDR     `thenRn` \ cc ->
-    lookupImplicitOccRn creturnableClass_RDR   `thenRn` \ cr ->
-    lookupImplicitOccRn ioDataCon_RDR          `thenRn` \ io ->
+  = lookupOrigNames [] `thenRn` \ implicit_fvs ->
     rnExprs args                               `thenRn` \ (args', fvs_args) ->
-    returnRn (CCall fun args' may_gc is_casm fake_result_ty, 
-             fvs_args `addOneFV` cc `addOneFV` cr `addOneFV` io)
+    returnRn (HsCCall fun args' may_gc is_casm placeHolderType, 
+             fvs_args `plusFV` mkFVs [cCallableClassName, 
+                                      cReturnableClassName, 
+                                      ioDataConName])
 
-rnExpr (HsSCC label expr)
+rnExpr (HsSCC lbl expr)
   = rnExpr expr                `thenRn` \ (expr', fvs_expr) ->
-    returnRn (HsSCC label expr', fvs_expr)
+    returnRn (HsSCC lbl expr', fvs_expr)
 
 rnExpr (HsCase expr ms src_loc)
   = pushSrcLocRn src_loc $
-    rnExpr expr                        `thenRn` \ (new_expr, e_fvs) ->
-    mapFvRn rnMatch ms         `thenRn` \ (new_ms, ms_fvs) ->
+    rnExpr expr                                `thenRn` \ (new_expr, e_fvs) ->
+    mapFvRn (rnMatch CaseAlt) ms       `thenRn` \ (new_ms, ms_fvs) ->
     returnRn (HsCase new_expr new_ms src_loc, e_fvs `plusFV` ms_fvs)
 
 rnExpr (HsLet binds expr)
@@ -356,21 +387,56 @@ rnExpr (HsLet binds expr)
     rnExpr expr                         `thenRn` \ (expr',fvExpr) ->
     returnRn (HsLet binds' expr', fvExpr)
 
-rnExpr (HsDo do_or_lc stmts src_loc)
+rnExpr (HsWith expr binds is_with)
+  = warnCheckRn (not is_with) withWarning `thenRn_`
+    rnExpr expr                        `thenRn` \ (expr',fvExpr) ->
+    rnIPBinds binds            `thenRn` \ (binds',fvBinds) ->
+    returnRn (HsWith expr' binds' is_with, fvExpr `plusFV` fvBinds)
+
+rnExpr e@(HsDo do_or_lc stmts _ ty src_loc)
   = pushSrcLocRn src_loc $
-    lookupImplicitOccRn monadClass_RDR         `thenRn` \ monad ->
-    rnStmts rnExpr stmts                       `thenRn` \ (stmts', fvs) ->
-    returnRn (HsDo do_or_lc stmts' src_loc, fvs `addOneFV` monad)
+    rnStmts stmts                      `thenRn` \ ((_, stmts'), fvs) ->
+
+       -- Check the statement list ends in an expression
+    case last stmts' of {
+       ResultStmt _ _ -> returnRn () ;
+       _              -> addErrRn (doStmtListErr e)
+    }                                  `thenRn_`
+
+       -- Generate the rebindable syntax for the monad
+    (case do_or_lc of
+       DoExpr -> mapRn lookupSyntaxName monad_names
+       other  -> returnRn []
+    )                                  `thenRn` \ monad_names' ->
+
+    returnRn (HsDo do_or_lc stmts' monad_names' placeHolderType src_loc, 
+             fvs `plusFV` implicit_fvs)
+  where
+    monad_names = [returnMName, failMName, bindMName, thenMName]
+
+    implicit_fvs = case do_or_lc of
+      PArrComp -> mkFVs [replicatePName, mapPName, filterPName,
+                        falseDataConName, trueDataConName, crossPName,
+                        zipPName]
+      _        -> mkFVs [foldrName, buildName, monadClassName]
+       -- Monad stuff should not be necessary for a list comprehension
+       -- but the typechecker looks up the bind and return Ids anyway
+       -- Oh well.
+
+rnExpr (ExplicitList _ exps)
+  = rnExprs exps                       `thenRn` \ (exps', fvs) ->
+    returnRn  (ExplicitList placeHolderType exps', fvs `addOneFV` listTyCon_name)
 
-rnExpr (ExplicitList exps)
+rnExpr (ExplicitPArr _ exps)
   = rnExprs exps                       `thenRn` \ (exps', fvs) ->
-    returnRn  (ExplicitList exps', fvs `addOneFV` listTyCon_name)
+    returnRn  (ExplicitPArr placeHolderType exps', 
+              fvs `addOneFV` toPName `addOneFV` parrTyCon_name)
 
-rnExpr (ExplicitTuple exps boxed)
+rnExpr (ExplicitTuple exps boxity)
   = rnExprs exps                               `thenRn` \ (exps', fvs) ->
-    returnRn (ExplicitTuple exps' boxed, fvs `addOneFV` tycon_name)
+    returnRn (ExplicitTuple exps' boxity, fvs `addOneFV` tycon_name)
   where
-    tycon_name = tupleTyCon_name boxed (length exps)
+    tycon_name = tupleTyCon_name boxity (length exps)
 
 rnExpr (RecordCon con_id rbinds)
   = lookupOccRn con_id                         `thenRn` \ conname ->
@@ -383,8 +449,8 @@ rnExpr (RecordUpd expr rbinds)
     returnRn (RecordUpd expr' rbinds', fvExpr `plusFV` fvRbinds)
 
 rnExpr (ExprWithTySig expr pty)
-  = rnExpr expr                                        `thenRn` \ (expr', fvExpr) ->
-    rnHsSigType (text "an expression") pty     `thenRn` \ (pty', fvTy) ->
+  = rnExpr expr                                                   `thenRn` \ (expr', fvExpr) ->
+    rnHsTypeFVs (text "an expression type signature") pty  `thenRn` \ (pty', fvTy) ->
     returnRn (ExprWithTySig expr' pty', fvExpr `plusFV` fvTy)
 
 rnExpr (HsIf p b1 b2 src_loc)
@@ -394,10 +460,15 @@ rnExpr (HsIf p b1 b2 src_loc)
     rnExpr b2          `thenRn` \ (b2', fvB2) ->
     returnRn (HsIf p' b1' b2' src_loc, plusFVs [fvP, fvB1, fvB2])
 
+rnExpr (HsType a)
+  = rnHsTypeFVs doc a  `thenRn` \ (t, fvT) -> 
+    returnRn (HsType t, fvT)
+  where 
+    doc = text "in a type argument"
+
 rnExpr (ArithSeqIn seq)
-  = lookupImplicitOccRn enumClass_RDR  `thenRn` \ enum ->
-    rn_seq seq                         `thenRn` \ (new_seq, fvs) ->
-    returnRn (ArithSeqIn new_seq, fvs `addOneFV` enum)
+  = rn_seq seq                         `thenRn` \ (new_seq, fvs) ->
+    returnRn (ArithSeqIn new_seq, fvs `addOneFV` enumClassName)
   where
     rn_seq (From expr)
      = rnExpr expr     `thenRn` \ (expr', fvExpr) ->
@@ -419,8 +490,47 @@ rnExpr (ArithSeqIn seq)
        rnExpr expr3    `thenRn` \ (expr3', fvExpr3) ->
        returnRn (FromThenTo expr1' expr2' expr3',
                  plusFVs [fvExpr1, fvExpr2, fvExpr3])
+
+rnExpr (PArrSeqIn seq)
+  = rn_seq seq                        `thenRn` \ (new_seq, fvs) ->
+    returnRn (PArrSeqIn new_seq, 
+             fvs `plusFV` mkFVs [enumFromToPName, enumFromThenToPName])
+  where
+
+    -- the parser shouldn't generate these two
+    --
+    rn_seq (From     _  ) = panic "RnExpr.rnExpr: Infinite parallel array!"
+    rn_seq (FromThen _ _) = panic "RnExpr.rnExpr: Infinite parallel array!"
+
+    rn_seq (FromTo expr1 expr2)
+     = rnExpr expr1    `thenRn` \ (expr1', fvExpr1) ->
+       rnExpr expr2    `thenRn` \ (expr2', fvExpr2) ->
+       returnRn (FromTo expr1' expr2', fvExpr1 `plusFV` fvExpr2)
+    rn_seq (FromThenTo expr1 expr2 expr3)
+     = rnExpr expr1    `thenRn` \ (expr1', fvExpr1) ->
+       rnExpr expr2    `thenRn` \ (expr2', fvExpr2) ->
+       rnExpr expr3    `thenRn` \ (expr3', fvExpr3) ->
+       returnRn (FromThenTo expr1' expr2' expr3',
+                 plusFVs [fvExpr1, fvExpr2, fvExpr3])
+\end{code}
+
+These three are pattern syntax appearing in expressions.
+Since all the symbols are reservedops we can simply reject them.
+We return a (bogus) EWildPat in each case.
+
+\begin{code}
+rnExpr e@EWildPat = addErrRn (patSynErr e)     `thenRn_`
+                   returnRn (EWildPat, emptyFVs)
+
+rnExpr e@(EAsPat _ _) = addErrRn (patSynErr e) `thenRn_`
+                       returnRn (EWildPat, emptyFVs)
+
+rnExpr e@(ELazyPat _) = addErrRn (patSynErr e) `thenRn_`
+                       returnRn (EWildPat, emptyFVs)
 \end{code}
 
+
+
 %************************************************************************
 %*                                                                     *
 \subsubsection{@Rbinds@s and @Rpats@s: in record expressions}
@@ -459,6 +569,22 @@ rnRpats rpats
 
 %************************************************************************
 %*                                                                     *
+\subsubsection{@rnIPBinds@s: in implicit parameter bindings}           *
+%*                                                                     *
+%************************************************************************
+
+\begin{code}
+rnIPBinds [] = returnRn ([], emptyFVs)
+rnIPBinds ((n, expr) : binds)
+  = newIPName n                        `thenRn` \ name ->
+    rnExpr expr                        `thenRn` \ (expr',fvExpr) ->
+    rnIPBinds binds            `thenRn` \ (binds',fvBinds) ->
+    returnRn ((name, expr') : binds', fvExpr `plusFV` fvBinds)
+
+\end{code}
+
+%************************************************************************
+%*                                                                     *
 \subsubsection{@Stmt@s: in @do@ expressions}
 %*                                                                     *
 %************************************************************************
@@ -472,56 +598,69 @@ be @{r}@, and the free var set for the entire Quals will be @{r}@. This
 Quals.
 
 \begin{code}
-type RnExprTy = RdrNameHsExpr -> RnMS (RenamedHsExpr, FreeVars)
+rnStmts :: [RdrNameStmt]
+       -> RnMS (([Name], [RenamedStmt]), FreeVars)
 
-rnStmts :: RnExprTy
-       -> [RdrNameStmt] 
-       -> RnMS ([RenamedStmt], FreeVars)
+rnStmts []
+  = returnRn (([], []), emptyFVs)
 
-rnStmts rn_expr []
-  = returnRn ([], emptyFVs)
+rnStmts (stmt:stmts)
+  = getLocalNameEnv            `thenRn` \ name_env ->
+    rnStmt stmt                                $ \ stmt' ->
+    rnStmts stmts                      `thenRn` \ ((binders, stmts'), fvs) ->
+    returnRn ((binders, stmt' : stmts'), fvs)
 
-rnStmts rn_expr (stmt:stmts)
-  = rnStmt rn_expr stmt                                $ \ stmt' ->
-    rnStmts rn_expr stmts                      `thenRn` \ (stmts', fvs) ->
-    returnRn (stmt' : stmts', fvs)
+rnStmt :: RdrNameStmt
+       -> (RenamedStmt -> RnMS (([Name], a), FreeVars))
+       -> RnMS (([Name], a), FreeVars)
+-- The thing list of names returned is the list returned by the
+-- thing_inside, plus the binders of the arguments stmt
 
-rnStmt :: RnExprTy -> RdrNameStmt
-       -> (RenamedStmt -> RnMS (a, FreeVars))
-       -> RnMS (a, FreeVars)
 -- Because of mutual recursion we have to pass in rnExpr.
 
-rnStmt rn_expr (BindStmt pat expr src_loc) thing_inside
+rnStmt (ParStmt stmtss) thing_inside
+  = mapFvRn rnStmts stmtss             `thenRn` \ (bndrstmtss, fv_stmtss) ->
+    let binderss = map fst bndrstmtss
+       checkBndrs all_bndrs bndrs
+         = checkRn (null (intersectBy eqOcc all_bndrs bndrs)) err `thenRn_`
+           returnRn (bndrs ++ all_bndrs)
+       eqOcc n1 n2 = nameOccName n1 == nameOccName n2
+       err = text "duplicate binding in parallel list comprehension"
+    in
+    foldlRn checkBndrs [] binderss     `thenRn` \ new_binders ->
+    bindLocalNamesFV new_binders       $
+    thing_inside (ParStmtOut bndrstmtss)`thenRn` \ ((rest_bndrs, result), fv_rest) ->
+    returnRn ((new_binders ++ rest_bndrs, result), fv_stmtss `plusFV` fv_rest)
+
+rnStmt (BindStmt pat expr src_loc) thing_inside
   = pushSrcLocRn src_loc $
-    rn_expr expr                                       `thenRn` \ (expr', fv_expr) ->
-    bindLocalsFVRn doc binders                         $ \ new_binders ->
-    rnPat pat                                          `thenRn` \ (pat', fv_pat) ->
-    thing_inside (BindStmt pat' expr' src_loc)         `thenRn` \ (result, fvs) -> 
-    returnRn (result, fv_expr `plusFV` fvs `plusFV` fv_pat)
+    rnExpr expr                                        `thenRn` \ (expr', fv_expr) ->
+    bindPatSigTyVars (collectSigTysFromPat pat)        $ 
+    bindLocalsFVRn doc (collectPatBinders pat) $ \ new_binders ->
+    rnPat pat                                  `thenRn` \ (pat', fv_pat) ->
+    thing_inside (BindStmt pat' expr' src_loc) `thenRn` \ ((rest_binders, result), fvs) ->
+    returnRn ((new_binders ++ rest_binders, result),
+             fv_expr `plusFV` fvs `plusFV` fv_pat)
   where
-    binders = collectPatBinders pat
-    doc = text "a pattern in do binding" 
+    doc = text "In a pattern in 'do' binding" 
 
-rnStmt rn_expr (ExprStmt expr src_loc) thing_inside
+rnStmt (ExprStmt expr _ src_loc) thing_inside
   = pushSrcLocRn src_loc $
-    rn_expr expr                               `thenRn` \ (expr', fv_expr) ->
-    thing_inside (ExprStmt expr' src_loc)      `thenRn` \ (result, fvs) ->
+    rnExpr expr                                                `thenRn` \ (expr', fv_expr) ->
+    thing_inside (ExprStmt expr' placeHolderType src_loc)      `thenRn` \ (result, fvs) ->
     returnRn (result, fv_expr `plusFV` fvs)
 
-rnStmt rn_expr (GuardStmt expr src_loc) thing_inside
+rnStmt (ResultStmt expr src_loc) thing_inside
   = pushSrcLocRn src_loc $
-    rn_expr expr                               `thenRn` \ (expr', fv_expr) ->
-    thing_inside (GuardStmt expr' src_loc)     `thenRn` \ (result, fvs) ->
-    returnRn (result, fv_expr `plusFV` fvs)
-
-rnStmt rn_expr (ReturnStmt expr) thing_inside
-  = rn_expr expr                               `thenRn` \ (expr', fv_expr) ->
-    thing_inside (ReturnStmt expr')            `thenRn` \ (result, fvs) ->
+    rnExpr expr                                `thenRn` \ (expr', fv_expr) ->
+    thing_inside (ResultStmt expr' src_loc)    `thenRn` \ (result, fvs) ->
     returnRn (result, fv_expr `plusFV` fvs)
 
-rnStmt rn_expr (LetStmt binds) thing_inside
-  = rnBinds binds              $ \ binds' ->
-    thing_inside (LetStmt binds')
+rnStmt (LetStmt binds) thing_inside
+  = rnBinds binds                              $ \ binds' ->
+    let new_binders = collectHsBinders binds' in
+    thing_inside (LetStmt binds')    `thenRn` \ ((rest_binders, result), fvs) ->
+    returnRn ((new_binders ++ rest_binders, result), fvs )
 \end{code}
 
 %************************************************************************
@@ -537,48 +676,59 @@ the programmer actually wrote, so you can't find it out from the Name.
 
 Furthermore, the second argument is guaranteed not to be another
 operator application.  Why? Because the parser parses all
-operator appications left-associatively.
+operator appications left-associatively, EXCEPT negation, which
+we need to handle specially.
 
 \begin{code}
-mkOpAppRn :: RenamedHsExpr -> RenamedHsExpr -> Fixity -> RenamedHsExpr
+mkOpAppRn :: RenamedHsExpr                     -- Left operand; already rearranged
+         -> RenamedHsExpr -> Fixity            -- Operator and fixity
+         -> RenamedHsExpr                      -- Right operand (not an OpApp, but might
+                                               -- be a NegApp)
          -> RnMS RenamedHsExpr
 
-mkOpAppRn e1@(OpApp e11 op1 fix1 e12) 
-         op2 fix2 e2
+---------------------------
+-- (e11 `op1` e12) `op2` e2
+mkOpAppRn e1@(OpApp e11 op1 fix1 e12) op2 fix2 e2
   | nofix_error
-  = addErrRn (precParseErr (get op1,fix1) (get op2,fix2))      `thenRn_`
+  = addErrRn (precParseErr (ppr_op op1,fix1) (ppr_op op2,fix2))        `thenRn_`
     returnRn (OpApp e1 op2 fix2 e2)
 
-  | rearrange_me
+  | associate_right
   = mkOpAppRn e12 op2 fix2 e2          `thenRn` \ new_e ->
     returnRn (OpApp e11 op1 fix1 new_e)
   where
-    (nofix_error, rearrange_me) = compareFixity fix1 fix2
+    (nofix_error, associate_right) = compareFixity fix1 fix2
 
-mkOpAppRn e1@(NegApp neg_arg neg_op) 
-         op2 
-         fix2@(Fixity prec2 dir2)
-         e2
+---------------------------
+--     (- neg_arg) `op` e2
+mkOpAppRn e1@(NegApp neg_arg neg_name) op2 fix2 e2
   | nofix_error
-  = addErrRn (precParseErr (get neg_op,fix_neg) (get op2,fix2))        `thenRn_`
+  = addErrRn (precParseErr (pp_prefix_minus,negateFixity) (ppr_op op2,fix2))   `thenRn_`
     returnRn (OpApp e1 op2 fix2 e2)
 
-  | rearrange_me
+  | associate_right
   = mkOpAppRn neg_arg op2 fix2 e2      `thenRn` \ new_e ->
-    returnRn (NegApp new_e neg_op)
+    returnRn (NegApp new_e neg_name)
+  where
+    (nofix_error, associate_right) = compareFixity negateFixity fix2
+
+---------------------------
+--     e1 `op` - neg_arg
+mkOpAppRn e1 op1 fix1 e2@(NegApp neg_arg _)    -- NegApp can occur on the right
+  | not associate_right                                -- We *want* right association
+  = addErrRn (precParseErr (ppr_op op1, fix1) (pp_prefix_minus, negateFixity)) `thenRn_`
+    returnRn (OpApp e1 op1 fix1 e2)
   where
-    fix_neg = Fixity 6 InfixL          -- Precedence of unary negate is wired in as infixl 6!
-    (nofix_error, rearrange_me) = compareFixity fix_neg fix2
+    (_, associate_right) = compareFixity fix1 negateFixity
 
+---------------------------
+--     Default case
 mkOpAppRn e1 op fix e2                         -- Default case, no rearrangment
-  = ASSERT( if right_op_ok fix e2 then True
-           else pprPanic "mkOpAppRn" (vcat [ppr e1, text "---", ppr op, 
-                                            text "---", ppr fix, text "---", ppr e2])
+  = ASSERT2( right_op_ok fix e2,
+            ppr e1 $$ text "---" $$ ppr op $$ text "---" $$ ppr fix $$ text "---" $$ ppr e2
     )
     returnRn (OpApp e1 op fix e2)
 
-get (HsVar n) = n
-
 -- Parser left-associates everything, but 
 -- derived instances may have correctly-associated things to
 -- in the right operarand.  So we just check that the right operand is OK
@@ -590,13 +740,13 @@ right_op_ok fix1 other
   = True
 
 -- Parser initially makes negation bind more tightly than any other operator
-mkNegAppRn neg_arg neg_op
+mkNegAppRn neg_arg neg_name
   = 
 #ifdef DEBUG
     getModeRn                  `thenRn` \ mode ->
     ASSERT( not_op_app mode neg_arg )
 #endif
-    returnRn (NegApp neg_arg neg_op)
+    returnRn (NegApp neg_arg neg_name)
 
 not_op_app SourceMode (OpApp _ _ _ _) = False
 not_op_app mode other                = True
@@ -609,23 +759,15 @@ mkConOpPatRn :: RenamedPat -> Name -> Fixity -> RenamedPat
 mkConOpPatRn p1@(ConOpPatIn p11 op1 fix1 p12) 
             op2 fix2 p2
   | nofix_error
-  = addErrRn (precParseErr (op1,fix1) (op2,fix2))      `thenRn_`
+  = addErrRn (precParseErr (ppr_op op1,fix1) (ppr_op op2,fix2))        `thenRn_`
     returnRn (ConOpPatIn p1 op2 fix2 p2)
 
-  | rearrange_me
+  | associate_right
   = mkConOpPatRn p12 op2 fix2 p2               `thenRn` \ new_p ->
     returnRn (ConOpPatIn p11 op1 fix1 new_p)
 
   where
-    (nofix_error, rearrange_me) = compareFixity fix1 fix2
-
-mkConOpPatRn p1@(NegPatIn neg_arg) 
-         op2 
-         fix2@(Fixity prec2 dir2)
-         p2
-  | prec2 > 6  -- Precedence of unary - is wired in as 6!
-  = addErrRn (precParseNegPatErr (op2,fix2))   `thenRn_`
-    returnRn (ConOpPatIn p1 op2 fix2 p2)
+    (nofix_error, associate_right) = compareFixity fix1 fix2
 
 mkConOpPatRn p1 op fix p2                      -- Default case, no rearrangment
   = ASSERT( not_op_pat p2 )
@@ -641,111 +783,108 @@ checkPrecMatch :: Bool -> Name -> RenamedMatch -> RnMS ()
 checkPrecMatch False fn match
   = returnRn ()
 
-checkPrecMatch True op (Match _ [p1,p2] _ _)
+checkPrecMatch True op (Match (p1:p2:_) _ _)
+       -- True indicates an infix lhs
   = getModeRn          `thenRn` \ mode ->
        -- See comments with rnExpr (OpApp ...)
-    case mode of
-       InterfaceMode -> returnRn ()
-       SourceMode    -> checkPrec op p1 False  `thenRn_`
-                        checkPrec op p2 True
+    if isInterfaceMode mode
+       then returnRn ()
+       else checkPrec op p1 False      `thenRn_`
+            checkPrec op p2 True
 
 checkPrecMatch True op _ = panic "checkPrecMatch"
 
 checkPrec op (ConOpPatIn _ op1 _ _) right
-  = lookupFixity op    `thenRn` \  op_fix@(Fixity op_prec  op_dir) ->
-    lookupFixity op1   `thenRn` \ op1_fix@(Fixity op1_prec op1_dir) ->
+  = lookupFixityRn op  `thenRn` \  op_fix@(Fixity op_prec  op_dir) ->
+    lookupFixityRn op1 `thenRn` \ op1_fix@(Fixity op1_prec op1_dir) ->
     let
        inf_ok = op1_prec > op_prec || 
                 (op1_prec == op_prec &&
                  (op1_dir == InfixR && op_dir == InfixR && right ||
                   op1_dir == InfixL && op_dir == InfixL && not right))
 
-       info  = (op,op_fix)
-       info1 = (op1,op1_fix)
+       info  = (ppr_op op,  op_fix)
+       info1 = (ppr_op op1, op1_fix)
        (infol, infor) = if right then (info, info1) else (info1, info)
     in
     checkRn inf_ok (precParseErr infol infor)
 
-checkPrec op (NegPatIn _) right
-  = lookupFixity op    `thenRn` \ op_fix@(Fixity op_prec op_dir) ->
-    checkRn (op_prec <= 6) (precParseNegPatErr (op,op_fix))
-
 checkPrec op pat right
   = returnRn ()
-\end{code}
-
-Consider
-       a `op1` b `op2` c
 
-(compareFixity op1 op2) tells which way to arrange appication, or
-whether there's an error.
-
-\begin{code}
-compareFixity :: Fixity -> Fixity
-             -> (Bool,         -- Error please
-                 Bool)         -- Associate to the right: a op1 (b op2 c)
-compareFixity (Fixity prec1 dir1) (Fixity prec2 dir2)
-  = case prec1 `compare` prec2 of
-       GT -> left
-       LT -> right
-       EQ -> case (dir1, dir2) of
-                       (InfixR, InfixR) -> right
-                       (InfixL, InfixL) -> left
-                       _                -> error_please
+-- Check precedence of (arg op) or (op arg) respectively
+-- If arg is itself an operator application, then either
+--   (a) its precedence must be higher than that of op
+--   (b) its precedency & associativity must be the same as that of op
+checkSectionPrec direction section op arg
+  = case arg of
+       OpApp _ op fix _ -> go_for_it (ppr_op op)     fix
+       NegApp _ _       -> go_for_it pp_prefix_minus negateFixity
+       other            -> returnRn ()
   where
-    right       = (False, True)
-    left         = (False, False)
-    error_please = (True,  False)
+    HsVar op_name = op
+    go_for_it pp_arg_op arg_fix@(Fixity arg_prec assoc)
+       = lookupFixityRn op_name        `thenRn` \ op_fix@(Fixity op_prec _) ->
+         checkRn (op_prec < arg_prec
+                    || op_prec == arg_prec && direction == assoc)
+                 (sectionPrecErr (ppr_op op_name, op_fix)      
+                 (pp_arg_op, arg_fix) section)
 \end{code}
 
+
 %************************************************************************
 %*                                                                     *
 \subsubsection{Literals}
 %*                                                                     *
 %************************************************************************
 
-When literals occur we have to make sure that the types and classes they involve
+When literals occur we have to make sure
+that the types and classes they involve
 are made available.
 
 \begin{code}
-litOccurrence (HsChar _)
-  = returnRn (unitFV charTyCon_name)
-
-litOccurrence (HsCharPrim _)
-  = returnRn (unitFV (getName charPrimTyCon))
-
-litOccurrence (HsString _)
-  = returnRn (unitFV listTyCon_name `plusFV` unitFV charTyCon_name)
-
-litOccurrence (HsStringPrim _)
-  = returnRn (unitFV (getName addrPrimTyCon))
-
-litOccurrence (HsInt _)
-  = lookupImplicitOccRn numClass_RDR `thenRn` \ num ->
-    returnRn (unitFV num)                      -- Int and Integer are forced in by Num
+litFVs (HsChar c)
+   = checkRn (inCharRange c) (bogusCharError c) `thenRn_`
+     returnRn (unitFV charTyCon_name)
+
+litFVs (HsCharPrim c)         = returnRn (unitFV (getName charPrimTyCon))
+litFVs (HsString s)           = returnRn (mkFVs [listTyCon_name, charTyCon_name])
+litFVs (HsStringPrim s)       = returnRn (unitFV (getName addrPrimTyCon))
+litFVs (HsInt i)             = returnRn (unitFV (getName intTyCon))
+litFVs (HsIntPrim i)          = returnRn (unitFV (getName intPrimTyCon))
+litFVs (HsFloatPrim f)        = returnRn (unitFV (getName floatPrimTyCon))
+litFVs (HsDoublePrim d)       = returnRn (unitFV (getName doublePrimTyCon))
+litFVs (HsLitLit l bogus_ty)  = returnRn (unitFV cCallableClassName)
+litFVs lit                   = pprPanic "RnExpr.litFVs" (ppr lit)      -- HsInteger and HsRat only appear 
+                                                                       -- in post-typechecker translations
+
+rnOverLit (HsIntegral i _)
+  = lookupSyntaxName fromIntegerName   `thenRn` \ from_integer_name ->
+    if inIntRange i then
+       returnRn (HsIntegral i from_integer_name, unitFV from_integer_name)
+    else let
+       fvs = mkFVs [plusIntegerName, timesIntegerName]
+       -- Big integer literals are built, using + and *, 
+       -- out of small integers (DsUtils.mkIntegerLit)
+       -- [NB: plusInteger, timesInteger aren't rebindable... 
+       --      they are used to construct the argument to fromInteger, 
+       --      which is the rebindable one.]
+    in
+    returnRn (HsIntegral i from_integer_name, fvs `addOneFV` from_integer_name)
 
-litOccurrence (HsFrac _)
-  = lookupImplicitOccRn fractionalClass_RDR    `thenRn` \ frac ->
-    lookupImplicitOccRn ratioDataCon_RDR       `thenRn` \ ratio ->
-    returnRn (unitFV frac `plusFV` unitFV ratio)
+rnOverLit (HsFractional i _)
+  = lookupSyntaxName fromRationalName          `thenRn` \ from_rat_name ->
+    let
+       fvs = mkFVs [ratioDataConName, plusIntegerName, timesIntegerName]
        -- We have to make sure that the Ratio type is imported with
        -- its constructor, because literals of type Ratio t are
        -- built with that constructor.
        -- The Rational type is needed too, but that will come in
        -- when fractionalClass does.
-    
-litOccurrence (HsIntPrim _)
-  = returnRn (unitFV (getName intPrimTyCon))
-
-litOccurrence (HsFloatPrim _)
-  = returnRn (unitFV (getName floatPrimTyCon))
-
-litOccurrence (HsDoublePrim _)
-  = returnRn (unitFV (getName doublePrimTyCon))
-
-litOccurrence (HsLitLit _)
-  = lookupImplicitOccRn ccallableClass_RDR     `thenRn` \ cc ->
-    returnRn (unitFV cc)
+       -- The plus/times integer operations may be needed to construct the numerator
+       -- and denominator (see DsUtils.mkIntegerLit)
+    in
+    returnRn (HsFractional i from_rat_name, fvs `addOneFV` from_rat_name)
 \end{code}
 
 %************************************************************************
@@ -757,8 +896,8 @@ litOccurrence (HsLitLit _)
 \begin{code}
 mkAssertExpr :: RnMS (RenamedHsExpr, FreeVars)
 mkAssertExpr =
-  mkImportedGlobalFromRdrName assertErr_RDR            `thenRn` \ name ->
-  getSrcLocRn                                          `thenRn` \ sloc ->
+  lookupOrigName assertErr_RDR         `thenRn` \ name ->
+  getSrcLocRn                          `thenRn` \ sloc ->
 
     -- if we're ignoring asserts, return (\ _ e -> e)
     -- if not, return (assertError "src-loc")
@@ -766,23 +905,19 @@ mkAssertExpr =
   if opt_IgnoreAsserts then
     getUniqRn                          `thenRn` \ uniq ->
     let
-     vname = mkSysLocalName uniq SLIT("v")
+     vname = mkSystemName uniq FSLIT("v")
      expr  = HsLam ignorePredMatch
      loc   = nameSrcLoc vname
-     ignorePredMatch = Match [] [WildPatIn, VarPatIn vname] Nothing 
-                             (GRHSs [GRHS [ExprStmt (HsVar vname) loc] loc]
-                                   EmptyBinds Nothing)
+     ignorePredMatch = mkSimpleMatch [WildPatIn, VarPatIn vname] (HsVar vname) placeHolderType loc
     in
     returnRn (expr, unitFV name)
   else
     let
      expr = 
           HsApp (HsVar name)
-               (HsLit (HsString (_PK_ (showSDoc (ppr sloc)))))
-
+               (HsLit (HsStringPrim (mkFastString (stringToUtf8 (showSDoc (ppr sloc))))))
     in
     returnRn (expr, unitFV name)
-
 \end{code}
 
 %************************************************************************
@@ -792,33 +927,37 @@ mkAssertExpr =
 %************************************************************************
 
 \begin{code}
+ppr_op op = quotes (ppr op)    -- Here, op can be a Name or a (Var n), where n is a Name
+pp_prefix_minus = ptext SLIT("prefix `-'")
+
 dupFieldErr str (dup:rest)
   = hsep [ptext SLIT("duplicate field name"), 
           quotes (ppr dup),
          ptext SLIT("in record"), text str]
 
-negPatErr pat 
-  = sep [ptext SLIT("prefix `-' not applied to literal in pattern"), quotes (ppr pat)]
+nonStdGuardErr guard
+  = hang (ptext
+    SLIT("accepting non-standard pattern guards (-fglasgow-exts to suppress this message)")
+    ) 4 (ppr guard)
 
-precParseNegPatErr op 
-  = hang (ptext SLIT("precedence parsing error"))
-      4 (hsep [ptext SLIT("prefix `-' has lower precedence than"), 
-              quotes (pp_op op), 
-              ptext SLIT("in pattern")])
+patSigErr ty
+  =  (ptext SLIT("Illegal signature in pattern:") <+> ppr ty)
+       $$ nest 4 (ptext SLIT("Use -fglasgow-exts to permit it"))
 
-precParseErr op1 op2 
-  = hang (ptext SLIT("precedence parsing error"))
-      4 (hsep [ptext SLIT("cannot mix"), quotes (pp_op op1), ptext SLIT("and"), 
-              quotes (pp_op op2),
-              ptext SLIT("in the same infix expression")])
+patSynErr e 
+  = sep [ptext SLIT("Pattern syntax in expression context:"),
+        nest 4 (ppr e)]
 
-nonStdGuardErr guard
-  = hang (ptext SLIT("accepting non-standard pattern guards (-fglasgow-exts to suppress this message)"))
-      4 (ppr guard)
+doStmtListErr e
+  = sep [ptext SLIT("`do' statements must end in expression:"),
+        nest 4 (ppr e)]
 
-patSigErr ty
-  = hang (ptext SLIT("Illegal signature in pattern:") <+> ppr ty)
-        4 (ptext SLIT("Use -fglasgow-exts to permit it"))
+bogusCharError c
+  = ptext SLIT("character literal out of range: '\\") <> int c <> char '\''
 
-pp_op (op, fix) = hcat [ppr op, space, parens (ppr fix)]
+withWarning
+  = sep [quotes (ptext SLIT("with")),
+        ptext SLIT("is deprecated, use"),
+        quotes (ptext SLIT("let")),
+        ptext SLIT("instead")]
 \end{code}