X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Frename%2FRnPat.lhs;h=01f621b792c4ea00a9e0e1be06e7d049a73f5829;hb=a8407757462804dfd51708d6cfdda0417a91bf8e;hp=bc174954787e022915dd776b2bb795f18bd47101;hpb=6f8ff0bbad3b9fa389c960ad1b5a267a1ae502f1;p=ghc-hetmet.git diff --git a/compiler/rename/RnPat.lhs b/compiler/rename/RnPat.lhs index bc17495..01f621b 100644 --- a/compiler/rename/RnPat.lhs +++ b/compiler/rename/RnPat.lhs @@ -40,13 +40,13 @@ import TcRnMonad import TcHsSyn ( hsOverLitName ) import RnEnv import RnTypes -import DynFlags ( DynFlag(..) ) +import DynFlags import PrelNames import Constants ( mAX_TUPLE_SIZE ) import Name import NameSet -import Module import RdrName +import BasicTypes import ListSetOps ( removeDups, minusList ) import Outputable import SrcLoc @@ -135,15 +135,14 @@ data NameMaker | LetMk -- Let bindings, incl top level -- Do *not* check for unused bindings - (Maybe Module) -- Just m => top level of module m - -- Nothing => not top level + TopLevelFlag MiniFixityEnv -topRecNameMaker :: Module -> MiniFixityEnv -> NameMaker -topRecNameMaker mod fix_env = LetMk (Just mod) fix_env +topRecNameMaker :: MiniFixityEnv -> NameMaker +topRecNameMaker fix_env = LetMk TopLevel fix_env localRecNameMaker :: MiniFixityEnv -> NameMaker -localRecNameMaker fix_env = LetMk Nothing fix_env +localRecNameMaker fix_env = LetMk NotTopLevel fix_env matchNameMaker :: HsMatchContext a -> NameMaker matchNameMaker ctxt = LamMk report_unused @@ -162,15 +161,17 @@ newName (LamMk report_unused) rdr_name ; when report_unused $ warnUnusedMatches [name] fvs ; return (res, name `delFV` fvs) }) -newName (LetMk mb_top fix_env) rdr_name +newName (LetMk is_top fix_env) rdr_name = CpsRn (\ thing_inside -> - do { name <- case mb_top of - Nothing -> newLocalBndrRn rdr_name - Just mod -> newTopSrcBinder mod rdr_name - ; bindLocalNamesFV_WithFixities [name] fix_env $ + do { name <- case is_top of + NotTopLevel -> newLocalBndrRn rdr_name + TopLevel -> newTopSrcBinder rdr_name + ; bindLocalName name $ -- Do *not* use bindLocalNameFV here + -- See Note [View pattern usage] + addLocalFixities fix_env [name] $ thing_inside name }) - -- Note: the bindLocalNamesFV_WithFixities is somewhat suspicious + -- Note: the bindLocalName is somewhat suspicious -- because it binds a top-level name as a local name. -- however, this binding seems to work, and it only exists for -- the duration of the patterns and the continuation; @@ -178,6 +179,14 @@ newName (LetMk mb_top fix_env) rdr_name -- before going on to the RHSes (see RnSource.lhs). \end{code} +Note [View pattern usage] +~~~~~~~~~~~~~~~~~~~~~~~~~ +Consider + let (r, (r -> x)) = x in ... +Here the pattern binds 'r', and then uses it *only* in the view pattern. +We want to "see" this use, and in let-bindings we collect all uses and +report unused variables at the binding level. So we must use bindLocalName +here, *not* bindLocalNameFV. Trac #3943. %********************************************************* %* * @@ -233,7 +242,8 @@ rnPats ctxt pats thing_inside rnPat :: HsMatchContext Name -- for error messages -> LPat RdrName -> (LPat Name -> RnM (a, FreeVars)) - -> RnM (a, FreeVars) + -> RnM (a, FreeVars) -- Variables bound by pattern do not + -- appear in the result FreeVars rnPat ctxt pat thing_inside = rnPats ctxt [pat] (\[pat'] -> thing_inside pat')