From 026de54b89f5018c9a29ac3494686cd86ea845df Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Mon, 21 Dec 2009 15:55:09 +0000 Subject: [PATCH] Fix Trac #3776 An easy fix. See Note [Usage for sub-bndrs] in RnEnv. --- compiler/rename/RnEnv.lhs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/compiler/rename/RnEnv.lhs b/compiler/rename/RnEnv.lhs index c81d701..2f5743a 100644 --- a/compiler/rename/RnEnv.lhs +++ b/compiler/rename/RnEnv.lhs @@ -284,12 +284,12 @@ lookupSubBndr parent doc rdr_name | otherwise -- Find all the things the rdr-name maps to = do { -- and pick the one with the right parent name ; env <- getGlobalRdrEnv - ; let gres = (lookupGlobalRdrEnv env (rdrNameOcc rdr_name)) + ; let gres = lookupGlobalRdrEnv env (rdrNameOcc rdr_name) ; case pick parent gres of -- NB: lookupGlobalRdrEnv, not lookupGRE_RdrName! -- The latter does pickGREs, but we want to allow 'x' -- even if only 'M.x' is in scope - [gre] -> do { addUsedRdrName gre rdr_name + [gre] -> do { addUsedRdrNames (used_rdr_names gre) ; return (gre_name gre) } [] -> do { addErr (unknownSubordinateErr doc rdr_name) ; traceRn (text "RnEnv.lookup_sub_bndr" <+> (ppr rdr_name $$ ppr gres)) @@ -306,6 +306,15 @@ lookupSubBndr parent doc rdr_name right_parent p (GRE { gre_par = ParentIs p' }) = p==p' right_parent _ _ = False + -- Note [Usage for sub-bndrs] + used_rdr_names gre + | isQual rdr_name = [rdr_name] + | otherwise = case gre_prov gre of + LocalDef -> [rdr_name] + Imported is -> map mk_qual_rdr is + mk_qual_rdr imp_spec = mkRdrQual (is_as (is_decl imp_spec)) rdr_occ + rdr_occ = rdrNameOcc rdr_name + newIPNameRn :: IPName RdrName -> TcRnIf m n (IPName Name) newIPNameRn ip_rdr = newIPName (mapIPName rdrNameOcc ip_rdr) @@ -320,12 +329,25 @@ lookupFamInstDeclBndr tyclGroupEnv (L loc rdr_name) (gre:_) -> return $ gre_name gre -- if there is more than one, an error will be raised elsewhere [] -> lookupOccRn rdr_name +\end{code} +Note [Usage for sub-bndrs] +~~~~~~~~~~~~~~~~~~~~~~~~~~ +If you have this + import qualified M( C( f ) ) + intance M.C T where + f x = x +then is the qualified import M.f used? Obviously yes. +But the RdrName used in the instance decl is unqualified. In effect, +we fill in the qualification by looking for f's whose class is M.C +But when adding to the UsedRdrNames we must make that qualification +explicit, otherwise we get "Redundant import of M.C". -------------------------------------------------- -- Occurrences -------------------------------------------------- +\begin{code} getLookupOccRn :: RnM (Name -> Maybe Name) getLookupOccRn = getLocalRdrEnv `thenM` \ local_env -> -- 1.7.10.4