Fix Trac #2114: error reporting for 'forall' without appropriate flags
[ghc-hetmet.git] / compiler / rename / RnEnv.lhs
index d924ab1..59451fc 100644 (file)
@@ -36,7 +36,7 @@ module RnEnv (
        mapFvRn, mapFvRnCPS,
        warnUnusedMatches, warnUnusedModules, warnUnusedImports, 
        warnUnusedTopBinds, warnUnusedLocalBinds,
-       dataTcOccs, unknownNameErr,
+       dataTcOccs, unknownNameErr
     ) where
 
 #include "HsVersions.h"
@@ -55,12 +55,13 @@ import Name         ( Name, nameIsLocalOrFrom, mkInternalName, isWiredInName,
                          nameSrcLoc, nameSrcSpan, nameOccName, nameModule, isExternalName )
 import NameSet
 import NameEnv
-import UniqFM
+import LazyUniqFM
 import DataCon         ( dataConFieldLabels )
 import OccName         ( OccName, tcName, isDataOcc, pprNonVarNameSpace, occNameSpace,
                          reportIfUnused, occNameFS )
 import Module          ( Module, ModuleName )
-import PrelNames       ( mkUnboundName, rOOT_MAIN, iNTERACTIVE, consDataConKey, hasKey )
+import PrelNames       ( mkUnboundName, rOOT_MAIN, iNTERACTIVE, 
+                         consDataConKey, hasKey, forall_tv_RDR )
 import UniqSupply
 import BasicTypes      ( IPName, mapIPName, Fixity )
 import SrcLoc          ( SrcSpan, srcSpanStart, Located(..), eqLocated, unLoc,
@@ -70,9 +71,30 @@ import Util
 import Maybes
 import ListSetOps      ( removeDups )
 import List            ( nubBy )
-import Monad           ( when )
 import DynFlags
 import FastString
+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}
 
 %*********************************************************
@@ -869,8 +891,10 @@ checkShadowedNames doc_str (global_env,local_env) loc_rdr_names
        | otherwise          = return ()
        where
          complain pp_locs = addWarnAt loc (shadowedNameWarn doc_str occ pp_locs)
-         mb_local = lookupLocalRdrOcc  local_env  occ
-          gres     = lookupGlobalRdrEnv global_env occ
+         mb_local = lookupLocalRdrOcc local_env occ
+          gres     = lookupGRE_RdrName (mkRdrUnqual occ) global_env
+               -- Make an Unqualified RdrName and look that up, so that
+               -- we don't find any GREs that are in scope qualified-only
 \end{code}
 
 
@@ -995,9 +1019,14 @@ shadowedNameWarn doc occ shadowed_locs
     $$ doc
 
 unknownNameErr rdr_name
-  = sep [ptext SLIT("Not in scope:"), 
-        nest 2 $ pprNonVarNameSpace (occNameSpace (rdrNameOcc rdr_name))
-                 <+> quotes (ppr rdr_name)]
+  = vcat [ hang (ptext SLIT("Not in scope:")) 
+             2 (pprNonVarNameSpace (occNameSpace (rdrNameOcc rdr_name))
+                         <+> quotes (ppr rdr_name))
+        , extra ]
+  where
+    extra | rdr_name == forall_tv_RDR 
+         = ptext SLIT("Perhaps you intended to use -XRankNTypes or similar flag")
+         | otherwise = empty
 
 unknownSubordinateErr doc op   -- Doc is "method of class" or 
                                -- "field of constructor"