+ -- Extend the envt right away with all
+ -- the Ids declared with type signatures
+ ; (binds', thing) <- tcExtendIdEnv sig_ids $
+ tc_val_binds top_lvl sig_fn prag_fn
+ binds thing_inside
+
+ ; return (ValBindsOut binds' sigs, thing) }
+
+------------------------
+tc_val_binds :: TopLevelFlag -> TcSigFun -> TcPragFun
+ -> [(RecFlag, LHsBinds Name)] -> TcM thing
+ -> TcM ([(RecFlag, LHsBinds TcId)], thing)
+-- Typecheck a whole lot of value bindings,
+-- one strongly-connected component at a time
+
+tc_val_binds top_lvl sig_fn prag_fn [] thing_inside
+ = do { thing <- thing_inside
+ ; return ([], thing) }
+
+tc_val_binds top_lvl sig_fn prag_fn (group : groups) thing_inside
+ = do { (group', (groups', thing))
+ <- tc_group top_lvl sig_fn prag_fn group $
+ tc_val_binds top_lvl sig_fn prag_fn groups thing_inside
+ ; return (group' ++ groups', thing) }
+
+------------------------
+tc_group :: TopLevelFlag -> TcSigFun -> TcPragFun
+ -> (RecFlag, LHsBinds Name) -> TcM thing
+ -> TcM ([(RecFlag, LHsBinds TcId)], thing)
+
+-- Typecheck one strongly-connected component of the original program.
+-- We get a list of groups back, because there may
+-- be specialisations etc as well
+
+tc_group top_lvl sig_fn prag_fn (NonRecursive, binds) thing_inside
+ = -- A single non-recursive binding
+ -- We want to keep non-recursive things non-recursive
+ -- so that we desugar unlifted bindings correctly
+ do { (binds, thing) <- tcPolyBinds top_lvl NonRecursive NonRecursive
+ sig_fn prag_fn binds thing_inside
+ ; return ([(NonRecursive, b) | b <- binds], thing) }
+
+tc_group top_lvl sig_fn prag_fn (Recursive, binds) thing_inside
+ = -- A recursive strongly-connected component
+ -- To maximise polymorphism (with -fglasgow-exts), we do a new
+ -- strongly-connected component analysis, this time omitting
+ -- any references to variables with type signatures.
+ --
+ -- Then we bring into scope all the variables with type signatures
+ do { traceTc (text "tc_group rec" <+> pprLHsBinds binds)
+ ; gla_exts <- doptM Opt_GlasgowExts
+ ; (binds,thing) <- if gla_exts
+ then go new_sccs
+ else tc_binds Recursive binds thing_inside
+ ; return ([(Recursive, unionManyBags binds)], thing) }
+ -- Rec them all together