FIX #2197: an update frame might point to an IND_OLDGEN
[ghc-hetmet.git] / compiler / rename / RnSource.lhs
index 7573f5e..8a2d0f4 100644 (file)
@@ -34,10 +34,10 @@ import RnEnv                ( lookupLocalDataTcNames,
                          lookupOccRn, newLocalsRn, 
                          bindLocatedLocalsFV, bindPatSigTyVarsFV,
                          bindTyVarsRn, extendTyVarEnvFVRn,
-                         bindLocalNames, checkDupNames, mapFvRn, lookupGreLocalRn,
+                         bindLocalNames, checkDupRdrNames, mapFvRn, lookupGreLocalRn,
                        )
-import RnNames       (importsFromLocalDecls, extendRdrEnvRn)
-import HscTypes      (GenAvailInfo(..))
+import RnNames         ( getLocalNonValBinders, extendGlobalRdrEnvRn )
+import HscTypes        ( GenAvailInfo(..) )
 import RnHsDoc          ( rnHsDoc, rnMbLHsDoc )
 import TcRnMonad
 
@@ -46,17 +46,39 @@ import Class                ( FunDep )
 import Name            ( Name, nameOccName )
 import NameSet
 import NameEnv
-import UniqFM
+import LazyUniqFM
 import OccName 
 import Outputable
+import FastString
 import SrcLoc          ( Located(..), unLoc, noLoc )
 import DynFlags        ( DynFlag(..) )
-import Maybes          ( seqMaybe )
 import Maybe            ( isNothing )
-import Monad           ( liftM, when )
 import BasicTypes       ( Boxity(..) )
 
 import ListSetOps    (findDupsEq, mkLookupFun)
+
+import Control.Monad
+\end{code}
+
+\begin{code}
+-- XXX
+thenM :: Monad a => a b -> (b -> a c) -> a c
+thenM = (>>=)
+
+thenM_ :: Monad a => a b -> a c -> a c
+thenM_ = (>>)
+
+returnM :: Monad m => a -> m a
+returnM = return
+
+mappM :: (Monad m) => (a -> m b) -> [a] -> m [b]
+mappM = mapM
+
+mappM_ :: (Monad m) => (a -> m b) -> [a] -> m ()
+mappM_ = mapM_
+
+checkM :: Monad m => Bool -> m () -> m ()
+checkM = unless
 \end{code}
 
 @rnSourceDecl@ `renames' declarations.
@@ -76,10 +98,10 @@ Checks the @(..)@ etc constraints in the export list.
 
 
 \begin{code}
--- brings the binders of the group into scope in the appropriate places;
+-- Brings the binders of the group into scope in the appropriate places;
 -- does NOT assume that anything is in scope already
 --
--- the Bool determines whether (True) names in the group shadow existing
+-- The Bool determines whether (True) names in the group shadow existing
 -- Unquals in the global environment (used in Template Haskell) or
 -- (False) whether duplicates are reported as an error
 rnSrcDecls :: Bool -> HsGroup RdrName -> RnM (TcGblEnv, HsGroup Name)
@@ -101,8 +123,10 @@ rnSrcDecls shadowP group@(HsGroup {hs_valds  = val_decls,
    local_fix_env <- makeMiniFixityEnv fix_decls;
 
    -- (B) Bring top level binders (and their fixities) into scope,
-   --     except for the value bindings, which get brought in below.
-   inNewEnv (importsFromLocalDecls shadowP group local_fix_env) $ \ tcg_env -> do {
+   --     *except* for the value bindings, which get brought in below.
+   avails <- getLocalNonValBinders group ;
+   tc_envs <- extendGlobalRdrEnvRn shadowP avails local_fix_env ;
+   setEnvs tc_envs $ do {
 
    failIfErrsM ; -- No point in continuing if (say) we have duplicate declarations
 
@@ -110,7 +134,7 @@ rnSrcDecls shadowP group@(HsGroup {hs_valds  = val_decls,
    --     extend the record field env.
    --     This depends on the data constructors and field names being in
    --     scope from (B) above
-   inNewEnv (extendRecordFieldEnv tycl_decls) $ \ tcg_env -> do {
+   inNewEnv (extendRecordFieldEnv tycl_decls) $ \ _ -> do {
 
    -- (D) Rename the left-hand sides of the value bindings.
    --     This depends on everything from (B) being in scope,
@@ -121,12 +145,8 @@ rnSrcDecls shadowP group@(HsGroup {hs_valds  = val_decls,
    let { lhs_binders = map unLoc $ collectHsValBinders new_lhs;
          lhs_avails = map Avail lhs_binders
        } ;
-   inNewEnv (extendRdrEnvRn shadowP (tcg_rdr_env tcg_env, tcg_fix_env tcg_env)
-                             lhs_avails local_fix_env
-              >>= \ (new_rdr_env, new_fix_env) -> 
-                         return (tcg_env { tcg_rdr_env = new_rdr_env,
-                                           tcg_fix_env = new_fix_env
-                                         })) $ \tcg_env -> do {
+   (tcg_env, tcl_env) <- extendGlobalRdrEnvRn shadowP lhs_avails local_fix_env ;
+   setEnvs (tcg_env, tcl_env) $ do {
 
    --  Now everything is in scope, as the remaining renaming assumes.
 
@@ -170,15 +190,15 @@ rnSrcDecls shadowP group@(HsGroup {hs_valds  = val_decls,
 
    -- (I) Compute the results and return
    let {rn_group = HsGroup { hs_valds  = rn_val_decls,
-                               hs_tyclds = rn_tycl_decls,
-                               hs_instds = rn_inst_decls,
+                            hs_tyclds = rn_tycl_decls,
+                            hs_instds = rn_inst_decls,
                              hs_derivds = rn_deriv_decls,
-                               hs_fixds  = rn_fix_decls,
-                               hs_depds  = [], -- deprecs are returned in the tcg_env (see below)
-                                             -- not in the HsGroup
-                               hs_fords  = rn_foreign_decls,
-                               hs_defds  = rn_default_decls,
-                               hs_ruleds = rn_rule_decls,
+                            hs_fixds  = rn_fix_decls,
+                            hs_depds  = [], -- deprecs are returned in the tcg_env
+                                            -- (see below) not in the HsGroup
+                            hs_fords  = rn_foreign_decls,
+                            hs_defds  = rn_default_decls,
+                            hs_ruleds = rn_rule_decls,
                              hs_docs   = rn_docs } ;
 
        other_fvs = plusFVs [src_fvs1, src_fvs2, src_fvs6, src_fvs3, 
@@ -252,6 +272,9 @@ rnSrcFixityDecls :: [LFixitySig RdrName] -> RnM [LFixitySig Name]
 -- Rename the fixity decls, so we can put
 -- the renamed decls in the renamed syntax tree
 -- Errors if the thing being fixed is not defined locally.
+--
+-- The returned FixitySigs are not actually used for anything,
+-- except perhaps the GHCi API
 rnSrcFixityDecls fix_decls
   = do fix_decls <- mapM rn_decl fix_decls
        return (concat fix_decls)
@@ -260,7 +283,7 @@ rnSrcFixityDecls fix_decls
         -- GHC extension: look up both the tycon and data con 
        -- for con-like things; hence returning a list
        -- If neither are in scope, report an error; otherwise
-       -- add both to the fixity env
+       -- return a fixity sig for each (slightly odd)
     rn_decl (L loc (FixitySig (L name_loc rdr_name) fixity))
       = setSrcSpan name_loc $
                     -- this lookup will fail if the definition isn't local
@@ -360,16 +383,6 @@ rnSrcInstDecl (InstDecl inst_ty mbinds uprags ats)
        -- Used for both source and interface file decls
   = rnHsSigType (text "an instance decl") inst_ty      `thenM` \ inst_ty' ->
 
-       -- Rename the associated types
-       -- The typechecker (not the renamer) checks that all 
-       -- the declarations are for the right class
-    let
-       at_doc   = text "In the associated types of an instance declaration"
-       at_names = map (head . tyClDeclNames . unLoc) ats
-    in
-    checkDupNames at_doc at_names              `thenM_`
-    rnATInsts ats                              `thenM` \ (ats', at_fvs) ->
-
        -- Rename the bindings
        -- The typechecker (not the renamer) checks that all 
        -- the bindings are for the right class
@@ -378,13 +391,34 @@ rnSrcInstDecl (InstDecl inst_ty mbinds uprags ats)
        meth_names  = collectHsBindLocatedBinders mbinds
        (inst_tyvars, _, cls,_) = splitHsInstDeclTy (unLoc inst_ty')
     in
-    checkDupNames meth_doc meth_names  `thenM_`
+    checkDupRdrNames meth_doc meth_names       `thenM_`
+       -- Check that the same method is not given twice in the
+       -- same instance decl   instance C T where
+       --                            f x = ...
+       --                            g y = ...
+       --                            f x = ...
+       -- We must use checkDupRdrNames because the Name of the
+       -- method is the Name of the class selector, whose SrcSpan
+       -- points to the class declaration
+
     extendTyVarEnvForMethodBinds inst_tyvars (         
        -- (Slightly strangely) the forall-d tyvars scope over
        -- the method bindings too
        rnMethodBinds cls (\n->[])      -- No scoped tyvars
                      [] mbinds
     )                                          `thenM` \ (mbinds', meth_fvs) ->
+       -- Rename the associated types
+       -- The typechecker (not the renamer) checks that all 
+       -- the declarations are for the right class
+    let
+       at_doc   = text "In the associated types of an instance declaration"
+       at_names = map (head . tyClDeclNames . unLoc) ats
+    in
+    checkDupRdrNames at_doc at_names           `thenM_`
+       -- See notes with checkDupRdrNames for methods, above
+
+    rnATInsts ats                              `thenM` \ (ats', at_fvs) ->
+
        -- Rename the prags and signatures.
        -- Note that the type variables are not in scope here,
        -- so that      instance Eq a => Eq (T a) where
@@ -524,8 +558,8 @@ validRuleLhs foralls lhs
   where
     checkl (L loc e) = check e
 
-    check (OpApp e1 op _ e2)             = checkl op `seqMaybe` checkl_e e1 `seqMaybe` checkl_e e2
-    check (HsApp e1 e2)                  = checkl e1 `seqMaybe` checkl_e e2
+    check (OpApp e1 op _ e2)             = checkl op `mplus` checkl_e e1 `mplus` checkl_e e2
+    check (HsApp e1 e2)                  = checkl e1 `mplus` checkl_e e2
     check (HsVar v) | v `notElem` foralls = Nothing
     check other                                  = Just other  -- Failure
 
@@ -538,14 +572,14 @@ validRuleLhs foralls lhs
     check_e (HsLit e)    = Nothing
     check_e (HsOverLit e) = Nothing
 
-    check_e (OpApp e1 op _ e2)          = checkl_e e1 `seqMaybe` checkl_e op `seqMaybe` checkl_e e2
-    check_e (HsApp e1 e2)               = checkl_e e1 `seqMaybe` checkl_e e2
+    check_e (OpApp e1 op _ e2)          = checkl_e e1 `mplus` checkl_e op `mplus` checkl_e e2
+    check_e (HsApp e1 e2)               = checkl_e e1 `mplus` checkl_e e2
     check_e (NegApp e _)                = checkl_e e
     check_e (ExplicitList _ es)         = checkl_es es
     check_e (ExplicitTuple es _) = checkl_es es
     check_e other               = Just other   -- Fails
 
-    checkl_es es = foldr (seqMaybe . checkl_e) Nothing es
+    checkl_es es = foldr (mplus . checkl_e) Nothing es
 -}
 
 badRuleLhsErr name lhs bad_e
@@ -602,8 +636,9 @@ rnTyClDecl (tydecl@TyData {tcdND = new_or_data, tcdCtxt = context,
        ; context' <- rnContext data_doc context
        ; typats' <- rnTyPats data_doc typatsMaybe
        ; (derivs', deriv_fvs) <- rn_derivs derivs
-       ; checkDupNames data_doc con_names
        ; condecls' <- rnConDecls (unLoc tycon') condecls
+               -- No need to check for duplicate constructor decls
+               -- since that is done by RnNames.extendGlobalRdrEnvRn
        ; returnM (TyData {tcdND = new_or_data, tcdCtxt = context', 
                           tcdLName = tycon', tcdTyVars = tyvars', 
                           tcdTyPats = typats', tcdKindSig = Nothing, 
@@ -629,8 +664,9 @@ rnTyClDecl (tydecl@TyData {tcdND = new_or_data, tcdCtxt = context,
                -- do not scope over the constructor signatures
                --      data T a where { T1 :: forall b. b-> b }
        ; (derivs', deriv_fvs) <- rn_derivs derivs
-       ; checkDupNames data_doc con_names
        ; condecls' <- rnConDecls (unLoc tycon') condecls
+               -- No need to check for duplicate constructor decls
+               -- since that is done by RnNames.extendGlobalRdrEnvRn
        ; returnM (TyData {tcdND = new_or_data, tcdCtxt = noLoc [], 
                           tcdLName = tycon', tcdTyVars = tyvars', 
                           tcdTyPats = Nothing, tcdKindSig = sig,
@@ -694,14 +730,13 @@ rnTyClDecl (ClassDecl {tcdCtxt = context, tcdLName = cname,
             ; sigs' <- renameSigs okClsDclSig sigs
             ; return   (tyvars', context', fds', ats', ats_fvs, sigs') }
 
-       -- Check for duplicates among the associated types
-       ; let at_rdr_names_w_locs = [tcdLName ty | L _ ty <- ats]
-       ; checkDupNames at_doc at_rdr_names_w_locs
+       -- No need to check for duplicate associated type decls
+       -- since that is done by RnNames.extendGlobalRdrEnvRn
 
        -- Check the signatures
        -- First process the class op sigs (op_sigs), then the fixity sigs (non_op_sigs).
        ; let sig_rdr_names_w_locs = [op | L _ (TypeSig op _) <- sigs]
-       ; checkDupNames sig_doc sig_rdr_names_w_locs
+       ; checkDupRdrNames sig_doc sig_rdr_names_w_locs
                -- Typechecker is responsible for checking that we only
                -- give default-method bindings for things in this class.
                -- The renamer *could* check this for class decls, but can't
@@ -721,7 +756,9 @@ rnTyClDecl (ClassDecl {tcdCtxt = context, tcdLName = cname,
            ; let meth_rdr_names_w_locs = collectHsBindLocatedBinders mbinds
                  gen_rdr_tyvars_w_locs = [ tv | tv <- extractGenericPatTyVars mbinds,
                                                 not (unLoc tv `elemLocalRdrEnv` name_env) ]
-           ; checkDupNames meth_doc meth_rdr_names_w_locs
+               -- No need to check for duplicate method signatures
+               -- since that is done by RnNames.extendGlobalRdrEnvRn
+               -- and the methods are already in scope
            ; gen_tyvars <- newLocalsRn gen_rdr_tyvars_w_locs
            ; rnMethodBinds (unLoc cname') (mkSigTvFn sigs') gen_tyvars mbinds }
 
@@ -820,8 +857,9 @@ rnConDeclDetails doc (InfixCon ty1 ty2)
     returnM (InfixCon new_ty1 new_ty2)
 
 rnConDeclDetails doc (RecCon fields)
-  = do { checkDupNames doc (map cd_fld_name fields)
-       ; new_fields <- mappM (rnField doc) fields
+  = do { new_fields <- mappM (rnField doc) fields
+               -- No need to check for duplicate fields
+               -- since that is done by RnNames.extendGlobalRdrEnvRn
        ; return (RecCon new_fields) }
 
 rnField doc (ConDeclField name ty haddock_doc)