From: simonpj Date: Tue, 18 Jul 2000 14:50:32 +0000 (+0000) Subject: [project @ 2000-07-18 14:50:32 by simonpj] X-Git-Tag: Approximately_9120_patches~3979 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=798374a5fa613d622b70cd4c37bb97f203abb6ba;p=ghc-hetmet.git [project @ 2000-07-18 14:50:32 by simonpj] Arrange that type signatures that have no "parent" signatures work right. For example module A f :: Int -> Int The panic in RnEnv.lookupBndrRn becomes an error message. Also RnBinds.rnTopMonoBinds and rnMonoBinds were wrongly ignoring all signatures altogether if there were no bindings! --- diff --git a/ghc/compiler/rename/RnBinds.lhs b/ghc/compiler/rename/RnBinds.lhs index ef5596b..c3c31c0 100644 --- a/ghc/compiler/rename/RnBinds.lhs +++ b/ghc/compiler/rename/RnBinds.lhs @@ -165,9 +165,6 @@ rnTopBinds (MonoBind bind sigs _) = rnTopMonoBinds bind sigs -- The parser doesn't produce other forms -rnTopMonoBinds EmptyMonoBinds sigs - = returnRn (EmptyBinds, emptyFVs) - rnTopMonoBinds mbinds sigs = mapRn lookupBndrRn binder_rdr_names `thenRn` \ binder_names -> let @@ -218,8 +215,6 @@ rnMonoBinds :: RdrNameMonoBinds -> (RenamedHsBinds -> RnMS (result, FreeVars)) -> RnMS (result, FreeVars) -rnMonoBinds EmptyMonoBinds sigs thing_inside = thing_inside EmptyBinds - rnMonoBinds mbinds sigs thing_inside -- Non-empty monobinds = -- Extract all the binders in this group, -- and extend current scope, inventing new names for the new binders @@ -284,7 +279,7 @@ rn_mono_binds siglist mbinds let edges = mkEdges (mbinds_info `zip` [(0::Int)..]) scc_result = stronglyConnComp edges - final_binds = foldr1 ThenBinds (map reconstructCycle scc_result) + final_binds = foldr (ThenBinds . reconstructCycle) EmptyBinds scc_result -- Deal with bound and free-var calculation rhs_fvs = plusFVs [fvs | (_,fvs,_,_) <- mbinds_info] diff --git a/ghc/compiler/rename/RnEnv.lhs b/ghc/compiler/rename/RnEnv.lhs index 15a46bf..80b6174 100644 --- a/ghc/compiler/rename/RnEnv.lhs +++ b/ghc/compiler/rename/RnEnv.lhs @@ -452,7 +452,14 @@ lookupBndrRn rdr_name case lookupRdrEnv global_env (qualifyRdrName mod rdr_name) of Just (name:rest) -> ASSERT( null rest ) returnRn name - Nothing -> pprPanic "lookupBndrRn" (ppr mod <+> ppr rdr_name) + Nothing -> -- Almost always this case is a compiler bug. + -- But consider a type signature that doesn't have + -- a corresponding binder: + -- module M where { f :: Int->Int } + -- We use lookupSigOccRn, which uses lookupBndrRn (for good reasons) + -- and we don't want to panic. So we report an out-of-scope error + failWithRn (mkUnboundName rdr_name) + (unknownNameErr rdr_name) } -- lookupOccRn looks up an occurrence of a RdrName