Simon Peyton Jones pushed to branch wip/T24464 at Glasgow Haskell Compiler / GHC Commits: c8978c05 by Simon Peyton Jones at 2025-11-07T00:31:51+00:00 Yet more [skip ci] - - - - - 10 changed files: - compiler/GHC/Hs/Binds.hs - compiler/GHC/HsToCore/Expr.hs - compiler/GHC/HsToCore/Monad.hs - compiler/GHC/HsToCore/Quote.hs - compiler/GHC/Tc/Gen/Bind.hs - compiler/GHC/Tc/Gen/Expr.hs - compiler/GHC/Tc/Module.hs - compiler/GHC/Tc/TyCl/Utils.hs - compiler/GHC/Tc/Types/BasicTypes.hs - compiler/GHC/Tc/Utils/Env.hs Changes: ===================================== compiler/GHC/Hs/Binds.hs ===================================== @@ -38,13 +38,16 @@ import Language.Haskell.Syntax.Expr( LHsExpr ) import {-# SOURCE #-} GHC.Hs.Expr ( pprExpr, pprLExpr, pprFunBind, pprPatBind ) import {-# SOURCE #-} GHC.Hs.Pat (pprLPat ) -import GHC.Data.BooleanFormula ( LBooleanFormula, pprBooleanFormulaNormal ) -import GHC.Types.Tickish import GHC.Hs.Extension -import GHC.Parser.Annotation import GHC.Hs.Type + import GHC.Tc.Types.Evidence + import GHC.Core.Type + +import GHC.Parser.Annotation + +import GHC.Types.Tickish import GHC.Types.Name.Set import GHC.Types.Basic import GHC.Types.SourceText @@ -52,6 +55,8 @@ import GHC.Types.SrcLoc as SrcLoc import GHC.Types.Var import GHC.Types.Name +import GHC.Data.BooleanFormula ( LBooleanFormula, pprBooleanFormulaNormal ) + import GHC.Utils.Outputable import GHC.Utils.Panic import GHC.Utils.Misc @@ -89,7 +94,18 @@ data HsValBindGroups p -- Divided into strongly connected components type family HsValBindGroup p type instance HsValBindGroup GhcPs = () type instance HsValBindGroup GhcRn = (RecFlag, LHsBinds GhcRn) -type instance HsValBindGroup GhcTc = (RecFlag, LHsBinds GhcTc, TopLevelFlag) +type instance HsValBindGroup GhcTc = (RecFlag, LHsBinds GhcTc, StaticFlag) + +data StaticFlag + = IsStatic | NotStatic + deriving( Data ) + -- IsStatic <=> this binding consists only code; all free + -- vars are top level (or themselves static). + -- So it can be moved to top level + +instance Outputable StaticFlag where + ppr IsStatic = text "static" + ppr NotStatic = text "not-static" -- --------------------------------------------------------------------- ===================================== compiler/GHC/HsToCore/Expr.hs ===================================== @@ -95,9 +95,9 @@ dsLocalBinds (HsIPBinds _ binds) body = dsIPBinds binds body ------------------------- -- caller sets location dsValBinds :: HsValBinds GhcTc -> CoreExpr -> DsM CoreExpr -dsValBinds (XValBindsLR (NValBinds binds _)) body +dsValBinds (XValBindsLR (HsVBG grps _)) body = do { dflags <- getDynFlags - ; foldrM (ds_val_bind dflags) body binds } + ; foldrM (ds_val_bind dflags) body grps } dsValBinds (ValBinds {}) _ = panic "dsValBinds ValBindsIn" ------------------------- @@ -119,12 +119,14 @@ dsIPBinds (IPBinds ev_binds ip_binds) body ------------------------- -- caller sets location -ds_val_bind :: DynFlags -> (RecFlag, LHsBinds GhcTc) -> CoreExpr -> DsM CoreExpr +ds_val_bind :: DynFlags + -> (RecFlag, LHsBinds GhcTc, StaticFlag) -> CoreExpr + -> DsM CoreExpr -- Special case for bindings which bind unlifted variables -- We need to do a case right away, rather than building -- a tuple and doing selections. -- Silently ignore INLINE and SPECIALISE pragmas... -ds_val_bind _ (NonRecursive, hsbinds) body +ds_val_bind _ (NonRecursive, hsbinds, _) body | [L loc bind] <- hsbinds -- Non-recursive, non-overloaded bindings only come in ones -- ToDo: in some bizarre case it's conceivable that there @@ -158,7 +160,7 @@ ds_val_bind _ (NonRecursive, hsbinds) body is_polymorphic _ = False -ds_val_bind _ (is_rec, binds) _body +ds_val_bind _ (is_rec, binds, _) _body | any (isUnliftedHsBind . unLoc) binds -- see Note [Strict binds checks] in GHC.HsToCore.Binds = assert (isRec is_rec ) errDsCoreExpr $ DsRecBindsNotAllowedForUnliftedTys binds @@ -168,7 +170,7 @@ ds_val_bind _ (is_rec, binds) _body -- linear, but selectors as used in the general case aren't. So the general case -- would transform a linear definition into a non-linear one. See Wrinkle 2 -- Note [Desugar Strict binds] in GHC.HsToCore.Binds. -ds_val_bind dflags (NonRecursive, hsbinds) body +ds_val_bind dflags (NonRecursive, hsbinds, _) body | [L _loc (PatBind { pat_lhs = pat, pat_rhs = grhss, pat_mult = mult_ann , pat_ext = (ty, (rhs_tick, _var_ticks))})] <- hsbinds -- Non-recursive, non-overloaded bindings only come in ones @@ -190,21 +192,26 @@ ds_val_bind dflags (NonRecursive, hsbinds) body -- problem? -- Ordinary case for bindings; none should be unlifted -ds_val_bind _ (is_rec, binds) body +ds_val_bind _ (is_rec, binds, static_flag) body = do { massert (isRec is_rec || isSingleton binds) - -- we should never produce a non-recursive list of multiple binds + -- We should never produce a non-recursive list of multiple binds ; (force_vars,prs) <- dsLHsBinds binds - ; let body' = foldr seqVar body force_vars + ; assertPpr (not (any (isUnliftedType . idType . fst) prs)) (ppr is_rec $$ ppr binds) $ -- NB: bindings have a fixed RuntimeRep, so it's OK to call isUnliftedType case prs of [] -> return body - _ -> return (mkLets (mk_binds is_rec prs) body') } + _ -> case static_flag of + NotStatic -> return (mkLets (mk_binds is_rec prs) body') + IsStatic -> do { emitStaticBinds prs; return body' } + where + body' = foldr seqVar body force_vars -- We can make a non-recursive let because we make sure to return -- the bindings in dependency order in dsLHsBinds, -- see Note [Return non-recursive bindings in dependency order] in -- GHC.HsToCore.Binds + } -- | Helper function. You can use the result of 'mk_binds' with 'mkLets' for -- instance. @@ -494,7 +501,7 @@ dsExpr (HsStatic (_, whole_ty) expr@(L loc _)) ; static_id <- newStaticId (mkSpecForAllTys static_fvs whole_ty) - ; emitStaticBind static_id static_rhs + ; emitStaticBinds [(static_id, static_rhs)] ; return (mkVarApps (Var static_id) static_fvs) } ===================================== compiler/GHC/HsToCore/Monad.hs ===================================== @@ -34,7 +34,7 @@ module GHC.HsToCore.Monad ( DsMetaEnv, DsMetaVal(..), dsGetMetaEnv, dsLookupMetaEnv, dsExtendMetaEnv, -- Static bindings - emitStaticBind, getStaticBinds, + emitStaticBinds, getStaticBinds, -- Getting and setting pattern match oracle states getPmNablas, updPmNablas, @@ -643,10 +643,10 @@ pprRuntimeTrace str doc expr = do getCCIndexDsM :: FastString -> DsM CostCentreIndex getCCIndexDsM = getCCIndexM ds_cc_st -emitStaticBind :: Id -> CoreExpr -> DsM () -emitStaticBind static_id rhs +emitStaticBinds :: [(Id,CoreExpr)] -> DsM () +emitStaticBinds static_binds = do { env <- getGblEnv - ; liftIO $ modifyIORef' (ds_static_binds env) (`snocOL` (static_id,rhs)) } + ; liftIO $ modifyIORef' (ds_static_binds env) (`appOL` toOL static_binds) } getStaticBinds :: DsM (OrdList (Id,CoreExpr)) getStaticBinds = do { env <- getGblEnv ===================================== compiler/GHC/HsToCore/Quote.hs ===================================== @@ -341,8 +341,8 @@ hsScopedTvBinders binds = concatMap get_scoped_tvs sigs where sigs = case binds of - ValBinds _ _ sigs -> sigs - XValBindsLR (NValBinds _ sigs) -> sigs + ValBinds _ _ sigs -> sigs + XValBindsLR (HsVBG _ sigs) -> sigs get_scoped_tvs :: LSig GhcRn -> [Name] get_scoped_tvs (L _ signature) @@ -1987,7 +1987,7 @@ rep_implicit_param_name (HsIPName name) = coreStringLit name rep_val_binds :: HsValBinds GhcRn -> MetaM [(SrcSpan, Core (M TH.Dec))] -- Assumes: all the binders of the binding are already in the meta-env -rep_val_binds (XValBindsLR (NValBinds binds sigs)) +rep_val_binds (XValBindsLR (HsVBG binds sigs)) = do { core1 <- rep_binds (concatMap snd binds) ; core2 <- rep_sigs sigs ; return (core1 ++ core2) } ===================================== compiler/GHC/Tc/Gen/Bind.hs ===================================== @@ -260,7 +260,7 @@ tcLocalBinds (HsIPBinds x (IPBinds _ ip_binds)) thing_inside tcValBinds :: TopLevelFlag -> [(RecFlag, LHsBinds GhcRn)] -> [LSig GhcRn] -> TcM thing - -> TcM ([(RecFlag, LHsBinds GhcTc, TopLevelFlag)], thing) + -> TcM ([(RecFlag, LHsBinds GhcTc, StaticFlag)], thing) tcValBinds top_lvl grps sigs thing_inside = do { -- Typecheck the signatures @@ -285,7 +285,7 @@ tcValBinds top_lvl grps sigs thing_inside -- See Note [Pattern synonym builders don't yield dependencies] -- in GHC.Rename.Bind ; patsyn_builders <- mapM (tcPatSynBuilderBind prag_fn) patsyns - ; let extra_binds = [ (NonRecursive, builder, TopLevel) + ; let extra_binds = [ (NonRecursive, builder, IsStatic) | builder <- patsyn_builders ] ; return (extra_binds, thing) } ; return (binds' ++ extra_binds', thing) }} @@ -297,7 +297,7 @@ tcValBinds top_lvl grps sigs thing_inside tcBindGroups :: TopLevelFlag -> TcSigFun -> TcPragEnv -> [(RecFlag, LHsBinds GhcRn)] -> TcM thing - -> TcM ([(RecFlag, LHsBinds GhcTc, TopLevelFlag)], thing) + -> TcM ([(RecFlag, LHsBinds GhcTc, StaticFlag)], thing) -- Typecheck a whole lot of value bindings, -- one strongly-connected component at a time -- Here a "strongly connected component" has the straightforward @@ -334,7 +334,7 @@ before we sub-divide it based on what type signatures it has. tc_group :: forall thing. TopLevelFlag -> TcSigFun -> TcPragEnv -> (RecFlag, LHsBinds GhcRn) -> TcM thing - -> TcM ((RecFlag, LHsBinds GhcTc, TopLevelFlag), thing) + -> TcM ((RecFlag, LHsBinds GhcTc, StaticFlag), thing) -- Typecheck one strongly-connected component of the original program. tc_group top_lvl sig_fn prag_fn (rec_flag, binds) thing_inside = case rec_flag of @@ -345,12 +345,12 @@ tc_group top_lvl sig_fn prag_fn (rec_flag, binds) thing_inside tc_nonrec_group :: forall thing. TopLevelFlag -> TcSigFun -> TcPragEnv -> LHsBinds GhcRn -> TcM thing - -> TcM ((RecFlag, LHsBinds GhcTc, TopLevelFlag), thing) + -> TcM ((RecFlag, LHsBinds GhcTc, StaticFlag), thing) tc_nonrec_group top_lvl sig_fn prag_fn [lbind] thing_inside | L loc (PatSynBind _ psb) <- lbind = do { (aux_binds, tcg_env) <- tcPatSynDecl (L loc psb) sig_fn prag_fn ; thing <- setGblEnv tcg_env thing_inside - ; return ((NonRecursive, aux_binds, TopLevel), thing) } + ; return ((NonRecursive, aux_binds, IsStatic), thing) } | otherwise = -- A single non-recursive binding @@ -375,7 +375,7 @@ tc_nonrec_group _ _ _ binds _ -- Non-rec groups should always be a singleton tc_rec_group :: forall thing. TopLevelFlag -> TcSigFun -> TcPragEnv -> LHsBinds GhcRn -> TcM thing - -> TcM ((RecFlag, LHsBinds GhcTc, TopLevelFlag), thing) + -> TcM ((RecFlag, LHsBinds GhcTc, StaticFlag), thing) tc_rec_group top_lvl sig_fn prag_fn binds thing_inside = -- For a recursive group, to maximise polymorphism, we do a new -- strongly-connected-component analysis, this time omitting @@ -1855,7 +1855,7 @@ decideGeneralisationPlan dflags top_lvl closed sig_fn lbinds isClosedBndrGroup :: TcTypeEnv -> [LHsBind GhcRn] -> IsGroupClosed isClosedBndrGroup type_env binds - = IsGroupClosed is_top fv_env type_closed + = IsGroupClosed is_static fv_env type_closed where fv_env :: NameEnv NameSet fv_env = mkNameEnv $ [ (b,fvs) | (bs,fvs) <- bind_fvs, b <-bs ] @@ -1875,16 +1875,20 @@ isClosedBndrGroup type_env binds `delListFromNameSet` all_bndrs -- all_fvs does not include the binders of this group - is_top | nameSetAll id_is_top all_fvs = TopLevel - | otherwise = NotTopLevel + is_static | not (any (is_pat_bind . unLoc) binds) + , nameSetAll id_is_static all_fvs = IsStatic + | otherwise = NotStatic - id_is_top :: Name -> Bool - id_is_top name + is_pat_bind (PatBind {}) = True + is_pat_bind _ = False + + id_is_static :: Name -> Bool + id_is_static name | Just thing <- lookupNameEnv type_env name = case thing of - AGlobal {} -> True - ATcId { tct_info = LetBound { lb_top = top } } -> isTopLevel top - _ -> False + AGlobal {} -> True + ATcId { tct_info = LetBound { lb_top = IsStatic } } -> True + _ -> False | otherwise -- Imported Ids = True @@ -1897,10 +1901,12 @@ isClosedBndrGroup type_env binds is_closed_type_id name | Just thing <- lookupNameEnv type_env name = case thing of - AGlobal {} -> True - ATcId { tct_info = info } -> lb_closed info - ATyVar {} -> False - -- In-scope type variables are not closed! + AGlobal {} -> True + ATyVar {} -> False -- In-scope type variables are not closed! + ATcId { tct_info = info} + -> case info of + LetBound { lb_closed = closed } -> closed + NotLetBound -> False _ -> pprPanic "is_closed_id" (ppr name) | otherwise @@ -1911,13 +1917,13 @@ isClosedBndrGroup type_env binds adjustClosedForUnlifted :: IsGroupClosed -> [Scaled TcId] -> IsGroupClosed adjustClosedForUnlifted closed@(IsGroupClosed top_lvl fv_env type_closed) ids - | TopLevel <- top_lvl + | IsStatic <- top_lvl , all definitely_lifted ids = closed - | otherwise = IsGroupClosed NotTopLevel fv_env type_closed + | otherwise = IsGroupClosed NotStatic fv_env type_closed where definitely_lifted (Scaled _ id) = definitelyLiftedType (idType id) -sendToTopLevel :: IsGroupClosed -> TopLevelFlag +sendToTopLevel :: IsGroupClosed -> StaticFlag sendToTopLevel (IsGroupClosed top _ _) = top lHsBindFreeVars :: LHsBind GhcRn -> NameSet ===================================== compiler/GHC/Tc/Gen/Expr.hs ===================================== @@ -1506,7 +1506,7 @@ expandRecordUpd record_expr possible_parents rbnds res_ty let_binds :: HsLocalBindsLR GhcRn GhcRn let_binds = HsValBinds noAnn $ XValBindsLR - $ NValBinds upd_ids_lhs (map mk_idSig upd_ids) + $ HsVBG upd_ids_lhs (map mk_idSig upd_ids) upd_ids_lhs :: [(RecFlag, LHsBindsLR GhcRn GhcRn)] upd_ids_lhs = [ (NonRecursive, [genSimpleFunBind (idName id) [] rhs]) | (_, (id, rhs)) <- upd_ids ] @@ -1821,9 +1821,8 @@ checkClosedInStaticForm name = do -- visited nodes, so we avoid repeating cycles in the traversal. case lookupNameEnv type_env n of Just (ATcId { tct_id = tcid, tct_info = info }) -> case info of - ClosedLet -> Nothing NotLetBound -> Just NotLetBoundReason - NonClosedLet fvs type_closed -> listToMaybe $ + LetBound { lb_fvs = fvs, lb_closed = type_closed } -> listToMaybe $ -- Look for a non-closed variable in fvs [ NotClosed n' reason | n' <- nameSetElemsStable fvs ===================================== compiler/GHC/Tc/Module.hs ===================================== @@ -791,7 +791,7 @@ tcRnHsBootDecls boot_or_sig decls , hs_defds = def_decls , hs_ruleds = rule_decls , hs_annds = _ - , hs_valds = XValBindsLR (NValBinds val_binds val_sigs) }) + , hs_valds = XValBindsLR (HsVBG val_binds val_sigs) }) <- rnTopSrcDecls first_group ; (gbl_env, lie) <- setGblEnv tcg_env $ captureTopConstraints $ do { @@ -1707,7 +1707,7 @@ tcTopSrcDecls (HsGroup { hs_tyclds = tycl_decls, hs_annds = annotation_decls, hs_ruleds = rule_decls, hs_valds = hs_val_binds@(XValBindsLR - (NValBinds val_binds val_sigs)) }) + (HsVBG val_binds val_sigs)) }) = do { -- Type-check the type and class decls, and all imported decls -- The latter come in via tycl_decls traceTc "Tc2 (src)" empty ; @@ -1716,7 +1716,7 @@ tcTopSrcDecls (HsGroup { hs_tyclds = tycl_decls, -- and import the supporting declarations traceTc "Tc3" empty ; (tcg_env, inst_infos, th_bndrs, - XValBindsLR (NValBinds deriv_binds deriv_sigs)) + XValBindsLR (HsVBG deriv_binds deriv_sigs)) <- tcTyClsInstDecls tycl_decls deriv_decls default_decls val_binds ; updLclCtxt (\tcl_env -> tcl_env { tcl_th_bndrs = th_bndrs `plusNameEnv` tcl_th_bndrs tcl_env }) $ @@ -2316,7 +2316,7 @@ tcUserStmt (L loc (BodyStmt _ expr _ _)) -- [let it = expr] let_stmt = L loc $ LetStmt noAnn $ HsValBinds noAnn $ XValBindsLR - (NValBinds [(NonRecursive,[the_bind])] []) + (HsVBG [(NonRecursive,[the_bind])] []) -- [it <- e] bind_stmt = L loc $ BindStmt ===================================== compiler/GHC/Tc/TyCl/Utils.hs ===================================== @@ -846,7 +846,7 @@ tcRecSelBinds sel_bind_prs -- See Note [Impredicative record selectors] setXOptM LangExt.ImpredicativeTypes $ tcValBinds TopLevel binds sigs getGblEnv - ; return (tcg_env `addTypecheckedBinds` map snd rec_sel_binds) } + ; return (tcg_env `addTypecheckedBinds` map sndOf3 rec_sel_binds) } where sigs = [ L (noAnnSrcSpan loc) (XSig $ IdSig sel_id) | (sel_id, _) <- sel_bind_prs ===================================== compiler/GHC/Tc/Types/BasicTypes.hs ===================================== @@ -37,6 +37,7 @@ import GHC.Types.Name.Env import GHC.Types.Name.Set import GHC.Hs.Extension ( GhcRn ) +import GHC.Hs.Binds ( StaticFlag ) import Language.Haskell.Syntax.Type ( LHsSigWcType ) @@ -309,7 +310,7 @@ data TcTyThing | ATcId -- Ids defined in this module; may not be fully zonked { tct_id :: Id - , tct_info :: IdBindingInfo -- See Note [Meaning of IdBindingInfo] + , tct_info :: IdBindingInfo } | ATyVar Name TcTyVar -- See Note [Type variables in the type environment] @@ -346,16 +347,16 @@ instance Outputable TcTyThing where -- Debugging only -- b) to figure out when a nested binding can be generalised, -- in 'GHC.Tc.Gen.Bind.decideGeneralisationPlan'. -- -data IdBindingInfo -- See Note [Meaning of IdBindingInfo] +data IdBindingInfo = NotLetBound | LetBound - { lb_top :: TopLevelFlag - -- TopLevel <=> this binding may safely be moved to top level + { lb_top :: StaticFlag + -- IsStatic <=> this binding may safely be moved to top level -- E.g f x = let ys = reverse [1,2] -- zs = reverse ys -- in ... - -- Both ys and zs count as TopLevel + -- Both ys and zs count as IsStatic , lb_fvs :: RhsNames -- Free vars of the RHS that are NotLetBound, or LetBound NotTopLevel @@ -372,7 +373,7 @@ data IdBindingInfo -- See Note [Meaning of IdBindingInfo] -- mutually-recursive /renamed/ (but not yet typechecked) bindings data IsGroupClosed = IsGroupClosed - TopLevelFlag -- TopLevel <=> all free vars are themselves TopLevel + StaticFlag -- IsStatic <=> all free vars of the group are top-level or static (NameEnv RhsNames) -- Frees for the RHS of each binding in the group -- (includes free vars of RHS bound in the same group) ClosedTypeId -- True <=> all the free vars of the group have closed types @@ -383,8 +384,21 @@ type RhsNames = NameSet -- Names of variables, mentioned on the RHS of type ClosedTypeId = Bool -- See Note [Meaning of IdBindingInfo] -{- Note [Meaning of IdBindingInfo] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +{- Note [Static bindings and StaticFlag] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +A (possibly-recursive) binding is /static/ iff + * It is syntactically top-level +OR + * It is not a PatBind + * Its free variables are all static + * It has a lifted type + +Static bindings are important for static forms (static e): + * The free vars of `e` must all be static + * All static bindings are immediately floated to top level by the desugarer + * The desugarer also floats `e` to top level, and replaces (static e) +Static bindings can all float to top level, and the de + * NotLetBound means that - the Id is not let-bound (e.g. it is bound in a lambda-abstraction or in a case pattern) ===================================== compiler/GHC/Tc/Utils/Env.hs ===================================== @@ -675,7 +675,7 @@ tcExtendRecIds :: [(Name, TcId)] -> TcM a -> TcM a tcExtendRecIds pairs thing_inside = tc_extend_local_env NotTopLevel [ (name, ATcId { tct_id = let_id - , tct_info = LetBound { lb_top = NotTopLevel + , tct_info = LetBound { lb_top = NotStatic , lb_fvs = emptyNameSet , lb_closed = False } }) | (name, let_id) <- pairs ] $ @@ -691,7 +691,7 @@ tcExtendSigIds top_lvl sig_ids thing_inside , tct_info = info }) | id <- sig_ids , let closed = isTypeClosedLetBndr id - info = LetBound { lb_top = NotTopLevel + info = LetBound { lb_top = NotStatic , lb_fvs = emptyNameSet , lb_closed = closed } ] thing_inside @@ -703,7 +703,7 @@ tcExtendLetEnv :: TopLevelFlag -> TcSigFun -> IsGroupClosed -- Used for both top-level value bindings and nested let/where-bindings -- Used for a single NonRec or a single Rec -- Adds to the TcBinderStack too -tcExtendLetEnv top_lvl _sig_fn (IsGroupClosed group_top fv_env _) +tcExtendLetEnv top_lvl _sig_fn (IsGroupClosed group_static fv_env _) ids thing_inside = tcExtendBinderStack [TcIdBndr id top_lvl | Scaled _ id <- ids] $ tc_extend_local_env top_lvl @@ -713,7 +713,7 @@ tcExtendLetEnv top_lvl _sig_fn (IsGroupClosed group_top fv_env _) foldr check_usage thing_inside scaled_names where mk_tct_info id - = LetBound { lb_top = group_top + = LetBound { lb_top = group_static , lb_fvs = lookupNameEnv fv_env (idName id) `orElse` emptyNameSet , lb_closed = isTypeClosedLetBndr id } View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/c8978c0582898f2afa2a1313841bfe01... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/c8978c0582898f2afa2a1313841bfe01... You're receiving this email because of your account on gitlab.haskell.org.
participants (1)
-
Simon Peyton Jones (@simonpj)