-- 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
-> (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
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]
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