Vladislav Zavialov pushed to branch wip/int-index/out-of-scope at Glasgow Haskell Compiler / GHC Commits: e8b37cc8 by Vladislav Zavialov at 2026-03-06T21:56:52+03:00 WIP: Move error generation to mkHoleError - - - - - 12 changed files: - compiler/GHC/Tc/Errors.hs - compiler/GHC/Tc/Errors/Hole.hs - compiler/GHC/Tc/Errors/Ppr.hs - compiler/GHC/Tc/Errors/Types.hs - compiler/GHC/Tc/Gen/Expr.hs - compiler/GHC/Tc/Gen/Head.hs - compiler/GHC/Tc/Types/Constraint.hs - compiler/GHC/Tc/Utils/Env.hs - compiler/GHC/Tc/Utils/TcMType.hs - testsuite/tests/rename/should_compile/T19966.hs - testsuite/tests/rename/should_compile/T19966.stderr - testsuite/tests/rename/should_compile/T19966_main.stdout Changes: ===================================== compiler/GHC/Tc/Errors.hs ===================================== @@ -28,14 +28,13 @@ import GHC.Tc.Errors.Ppr import GHC.Tc.Types.Constraint import GHC.Tc.Types.CtLoc import GHC.Tc.Utils.TcMType -import GHC.Tc.Utils.Env (tcLookupId, tcLookupDataCon) +import GHC.Tc.Utils.Env import GHC.Tc.Zonk.Type import GHC.Tc.Utils.TcType import GHC.Tc.Zonk.TcType import GHC.Tc.Types.Origin import GHC.Tc.Types.Evidence import GHC.Tc.Instance.Family -import GHC.Tc.Utils.Instantiate import {-# SOURCE #-} GHC.Tc.Errors.Hole ( findValidHoleFits, getHoleFitDispConfig ) import GHC.Types.Name @@ -63,13 +62,14 @@ import GHC.Core.Class (className) import GHC.Core.ConLike (isExistentialRecordField, ConLike (..)) import GHC.Core.Coercion import GHC.Core.DataCon +import GHC.Core.TyCo.Rep import GHC.Core.TyCo.Ppr ( pprTyVars ) import GHC.Core.TyCo.Tidy import GHC.Core.InstEnv import GHC.Core.TyCon -import GHC.Utils.Error (diagReasonSeverity) +import GHC.Utils.Error (diagReasonSeverity, pprLocMsgEnvelope ) import GHC.Utils.Misc import GHC.Utils.Outputable as O import GHC.Utils.Panic @@ -1353,7 +1353,8 @@ addDeferredBinding ctxt supp hints msg (EI { ei_evdest = Just dest , ei_loc = loc }) -- if evdest is Just, then the constraint was from a wanted | deferringAnyBindings ctxt - = do { err_tm <- mkErrorTerm loc item_ty ctxt msg supp hints + = do { msg <- mkErrorReport (ctLocEnv loc) msg (Just ctxt) supp hints + ; err_tm <- mkErrorTerm item_ty msg ; let ev_binds_var = cec_binds ctxt ; case dest of @@ -1370,26 +1371,24 @@ addDeferredBinding _ _ _ _ _ = return () -- Do not set any evidence for Given mkSolverErrorTerm :: CtLoc -> Type -- of the error term -> SolverReport -> TcM EvTerm mkSolverErrorTerm ct_loc ty err - = mkErrorTerm ct_loc ty (reportContext . sr_important_msg $ err) - (TcRnSolverReport (sr_important_msg err) ErrorWithoutFlag) - (sr_supplementary err) - (sr_hints err) - -mkErrorTerm :: CtLoc -> Type -- of the error term - -> SolverReportErrCtxt -> TcRnMessage - -> [SupplementaryInfo] -> [GhcHint] -> TcM EvTerm -mkErrorTerm ct_loc ty ctxt msg supp hints = do { msg <- mkErrorReport (ctLocEnv ct_loc) - msg - (Just $ ctxt) - supp - hints + (TcRnSolverReport (sr_important_msg err) ErrorWithoutFlag) + (Just $ reportContext $ sr_important_msg err) + (sr_supplementary err) + (sr_hints err) -- This will be reported at runtime, so we always want "error:" in the report, never "warning:" - ; dflags <- getDynFlags - ; let msg_opts = initTcMessageOpts dflags - err_msg = showSDoc dflags $ pprDeferredTypeError msg_opts msg - ; return $ evDelayedError ty err_msg } + ; mkErrorTerm ty msg + } + +mkErrorTerm :: Type -> MsgEnvelope TcRnMessage -> TcM EvTerm +mkErrorTerm ty msg = + do { dflags <- getDynFlags + ; let err_msg = pprLocMsgEnvelope (initTcMessageOpts dflags) msg + err_str = showSDoc dflags $ + err_msg $$ text "(deferred type error)" + + ; return $ evDelayedError ty err_str } tryReporters :: SolverReportErrCtxt -> [ReporterSpec] -> [ErrorItem] -> TcM (SolverReportErrCtxt, [ErrorItem]) -- Use the first reporter in the list whose predicate says True @@ -1551,6 +1550,22 @@ See also 'reportUnsolved'. ---------------- -- | Constructs a new hole error, unless this is deferred. See Note [Constructing Hole Errors]. mkHoleError :: NameEnv Type -> [ErrorItem] -> SolverReportErrCtxt -> Hole -> TcM (MsgEnvelope TcRnMessage) +mkHoleError _ _ ctxt hole + | ExprHole (ExprHoleBoundToType t) (HER ref ref_ty _) <- hole_sort hole + = setCtLocM (hole_loc hole) $ + do { let reason = cec_out_of_scope_holes ctxt + ; msg <- case t of + TyVarTy tv -> mkIllegalTyVarMessage reason (WithUserRdr rdr (tyVarName tv)) + TyConApp tc [] -> mkIllegalTyConMessage reason WL_Term (WithUserRdr rdr (tyConName tc)) + _ -> pprPanic "mkHoleError" (ppr t) + ; msg <- mkErrorReport lcl_env msg (Just ctxt) [] noHints + ; when (deferringAnyBindings ctxt) $ do + err_tm <- mkErrorTerm ref_ty msg + writeMutVar ref err_tm + ; return msg } + where + rdr = hole_occ hole + lcl_env = ctLocEnv (hole_loc hole) mkHoleError _ _tidy_simples ctxt hole@(Hole { hole_sort = sort, hole_occ = occ, hole_loc = ct_loc }) | isOutOfScopeHole hole = do { (imp_errs, hints) @@ -1586,7 +1601,7 @@ mkHoleError lcl_name_cache tidy_simples ctxt ; show_hole_constraints <- goptM Opt_ShowHoleConstraints ; let relevant_cts - | ExprHole _ <- sort, show_hole_constraints + | ExprHole _ _ <- sort, show_hole_constraints = givenConstraints ctxt | otherwise = [] @@ -1596,8 +1611,8 @@ mkHoleError lcl_name_cache tidy_simples ctxt then validHoleFits ctxt tidy_simples hole else return (ctxt, noValidHoleFits) ; (grouped_skvs, other_tvs) <- liftZonkM $ zonkAndGroupSkolTvs hole_ty - ; let reason | ExprHole _ <- sort = cec_expr_holes ctxt - | otherwise = cec_type_holes ctxt + ; let reason | ExprHole _ _ <- sort = cec_expr_holes ctxt + | otherwise = cec_type_holes ctxt err = SolverReportWithCtxt ctxt $ ReportHoleError hole $ HoleError sort other_tvs grouped_skvs @@ -1650,7 +1665,7 @@ maybeAddDeferredBindings :: Hole -> TcM () maybeAddDeferredBindings hole report = do case hole_sort hole of - ExprHole (HER ref ref_ty _) -> do + ExprHole _ (HER ref ref_ty _) -> do -- Only add bindings for holes in expressions -- not for holes in partial type signatures -- cf. addDeferredBinding ===================================== compiler/GHC/Tc/Errors/Hole.hs ===================================== @@ -586,7 +586,7 @@ findValidHoleFits :: TidyEnv -- ^ The tidy_env for zonking -- the hole. -> Hole -> TcM (TidyEnv, ValidHoleFits) -findValidHoleFits tidy_env implics simples h@(Hole { hole_sort = ExprHole _ +findValidHoleFits tidy_env implics simples h@(Hole { hole_sort = ExprHole _ _ , hole_loc = ct_loc , hole_ty = hole_ty }) = do { rdr_env <- getGlobalRdrEnv ===================================== compiler/GHC/Tc/Errors/Ppr.hs ===================================== @@ -19,7 +19,6 @@ module GHC.Tc.Errors.Ppr , TcRnMessageOpts(..) , pprTyThingUsedWrong , pprUntouchableVariable - , pprDeferredTypeError -- , mismatchMsg_ExpectedActuals @@ -124,7 +123,6 @@ import GHC.Utils.Lexeme import GHC.Utils.Misc import GHC.Utils.Outputable import GHC.Utils.Panic -import GHC.Utils.Error import qualified GHC.LanguageExtensions as LangExt @@ -1151,7 +1149,7 @@ instance Diagnostic TcRnMessage where -> mkSimpleDecorated $ vcat [ text "The literal" <+> quotes (ppr lit) <+> text "cannot be promoted." , text "It is of the unpromotable type" <+> quotes (ppr (hsLitType lit)) <> dot ] - TcRnIllegalTermLevelUse simple_msg _ rdr name err + TcRnIllegalTermLevelUse simple_msg rdr name err _ -> mkSimpleDecorated $ if simple_msg then @@ -2380,8 +2378,8 @@ instance Diagnostic TcRnMessage where -> ErrorWithoutFlag TcRnUnpromotableLit{} -> ErrorWithoutFlag - TcRnIllegalTermLevelUse _ reason _ _ _ - -> reason -- Error, or a Warning if we are deferring type errors + TcRnIllegalTermLevelUse _ _ _ _ reason + -> reason TcRnMatchesHaveDiffNumArgs{} -> ErrorWithoutFlag TcRnCannotBindScopedTyVarInPatSig{} @@ -4462,11 +4460,6 @@ pprUntouchableVariable tv (Implic { ic_given = given, ic_info = skol_info, ic_en , nest 2 $ text "bound by" <+> ppr skol_info , nest 2 $ text "at" <+> ppr (getCtLocEnvLoc env) ] -pprDeferredTypeError :: DiagnosticOpts TcRnMessage -> MsgEnvelope TcRnMessage -> SDoc -pprDeferredTypeError opts msg = - pprLocMsgEnvelope opts msg $$ - text "(deferred type error)" - -- | Which invisible bits of types should be displayed to the user when -- rendering a 'MismatchMsg'? -- ===================================== compiler/GHC/Tc/Errors/Types.hs ===================================== @@ -2495,11 +2495,10 @@ data TcRnMessage where TcRnIllegalTermLevelUse :: !Bool -- ^ should we give a simple "out of scope" message, -- instead of a full-blown "Illegal term level use" message? - - -> !DiagnosticReason -> !RdrName -- ^ the user-written identifier -> !Name -- ^ the type-level 'Name' we resolved it to -> !TermLevelUseErr + -> !DiagnosticReason -- ^ Whether to defer this error or fail -> TcRnMessage {-| TcRnMatchesHaveDiffNumArgs is an error occurring when something has matches @@ -5956,6 +5955,7 @@ data HoleError -- -- Test cases: T9177a. = OutOfScopeHole + -- | Report a typed hole, or wildcard, with additional information. | HoleError HoleSort [TcTyVar] -- Other type variables which get computed on the way. ===================================== compiler/GHC/Tc/Gen/Expr.hs ===================================== @@ -51,6 +51,7 @@ import GHC.Tc.Utils.Instantiate import GHC.Tc.Utils.Env import GHC.Tc.Types.Origin import GHC.Tc.Types.Evidence +import GHC.Tc.Types.Constraint import GHC.Tc.Errors.Types hiding (HoleError) import GHC.Core.Multiplicity @@ -322,9 +323,8 @@ tcExpr (XExpr e) res_ty = tcXExpr e res_ty -- Others might simply be variables that accidentally have no binding site. tcExpr (HsHole (HoleVar locc@(L _ occ))) res_ty = do { ty <- expTypeToType res_ty -- Allow Int# etc (#12531) - ; her <- emitNewExprHole occ ty - ; tcEmitBindingUsage bottomUE -- Holes fit any usage environment - -- (#18491) + ; her <- emitNewExprHole ExprHoleUnbound occ ty + ; tcEmitBindingUsage bottomUE -- Holes fit any usage environment (#18491) ; return (HsHole (HoleVar locc, her)) } tcExpr (HsHole HoleError) _ = ===================================== compiler/GHC/Tc/Gen/Head.hs ===================================== @@ -39,12 +39,11 @@ import GHC.Tc.Utils.Unify import GHC.Tc.Utils.Instantiate import GHC.Tc.Instance.Family ( tcLookupDataFamInst ) import GHC.Tc.Errors.Types -import GHC.Tc.Errors.Ppr ( pprDeferredTypeError ) import GHC.Tc.Solver ( InferMode(..), simplifyInfer ) import GHC.Tc.Utils.Env import GHC.Tc.Utils.TcMType import GHC.Tc.Types.Origin -import GHC.Tc.Types.Constraint( WantedConstraints ) +import GHC.Tc.Types.Constraint( WantedConstraints, ExprHoleVariant(..) ) import GHC.Tc.Utils.TcType as TcType import GHC.Tc.Types.Evidence import GHC.Tc.Zonk.TcType @@ -68,8 +67,6 @@ import GHC.Types.Error import GHC.Builtin.Names import GHC.Driver.DynFlags -import GHC.Driver.Ppr (showSDoc) -import GHC.Driver.Config.Diagnostic (initTcMessageOpts) import GHC.Utils.Misc import GHC.Utils.Outputable as Outputable import GHC.Utils.Panic @@ -802,7 +799,7 @@ tcInferId lname@(L loc (WithUserRdr rdr id_name)) = tc_infer_id lname tc_infer_id :: LocatedN (WithUserRdr Name) -> TcM (HsExpr GhcTc, TcSigmaType) -tc_infer_id (L loc qnm@(WithUserRdr rdr id_name)) +tc_infer_id (L loc (WithUserRdr rdr id_name)) = do { thing <- tcLookup id_name ; (expr,ty) <- case thing of ATcId { tct_id = id } @@ -816,9 +813,8 @@ tc_infer_id (L loc qnm@(WithUserRdr rdr id_name)) AGlobal (AConLike cl) -> tcInferConLike cl - (tcTyThingTyCon_maybe -> Just _) - -> defer_or_fail $ \reason -> mkIllegalTyConMessage reason WL_Term qnm - ATyVar _ _ -> defer_or_fail $ \reason -> mkIllegalTyVarMessage reason qnm + (tcTyThingTyCon_maybe -> Just tc) -> mk_hole (mkTyConTy tc) + ATyVar _ tv -> mk_hole (mkTyVarTy tv) _ -> failWithTc $ TcRnExpectedValueId thing @@ -827,26 +823,12 @@ tc_infer_id (L loc qnm@(WithUserRdr rdr id_name)) where return_id id = return (mkHsVar (L loc id), idType id) - defer_or_fail :: (DiagnosticReason -> TcM TcRnMessage) -> TcM (HsExpr GhcTc, TcSigmaType) - defer_or_fail mk_msg = do - defer_out_of_scope <- goptM Opt_DeferOutOfScopeVariables - let reason | defer_out_of_scope = WarningWithFlag Opt_WarnDeferredOutOfScopeVariables - | otherwise = ErrorWithoutFlag - msg <- mk_msg reason - addDiagnosticTc msg - msg_to_hole msg - - msg_to_hole :: TcRnMessage -> TcM (HsExpr GhcTc, TcType) - msg_to_hole msg = do - dflags <- getDynFlags - let lrdr = L loc rdr - msg_envelope <- mkTcRnMessage (locA loc) msg - let msg_opts = initTcMessageOpts dflags - err_msg = showSDoc dflags $ pprDeferredTypeError msg_opts msg_envelope - ty <- newOpenFlexiTyVarTy - her <- newExprHoleRef ty (evDelayedError ty err_msg) - tcEmitBindingUsage bottomUE -- Holes fit any usage environment (#18491) - return (HsHole (HoleVar lrdr, her), ty) + mk_hole :: TcType -> TcM (HsExpr GhcTc, TcSigmaType) + mk_hole ty + = do { hole_ty <- newOpenFlexiTyVarTy + ; her <- emitNewExprHole (ExprHoleBoundToType ty) rdr hole_ty + ; tcEmitBindingUsage bottomUE -- Holes fit any usage environment (#18491) + ; return (HsHole (HoleVar (L loc rdr), her), hole_ty) } {- Note [Overview of assertions] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ===================================== compiler/GHC/Tc/Types/Constraint.hs ===================================== @@ -50,6 +50,7 @@ module GHC.Tc.Types.Constraint ( -- Holes Hole(..), HoleSort(..), isOutOfScopeHole, + ExprHoleVariant(..), DelayedError(..), NotConcreteError(..), WantedConstraints(..), insolubleWC, emptyWC, isEmptyWC, @@ -409,9 +410,12 @@ data Hole -- might get reported to the user if reducing type families in a -- hole type loops. +data ExprHoleVariant + = ExprHoleUnbound + | ExprHoleBoundToType TcType -- | Used to indicate which sort of hole we have. -data HoleSort = ExprHole HoleExprRef +data HoleSort = ExprHole ExprHoleVariant HoleExprRef -- ^ Either an out-of-scope variable or a "true" hole in an -- expression (TypedHoles). -- The HoleExprRef says where to write the @@ -425,7 +429,7 @@ data HoleSort = ExprHole HoleExprRef -- Note [Do not simplify ConstraintHoles] in GHC.Tc.Solver. instance Outputable Hole where - ppr (Hole { hole_sort = ExprHole ref + ppr (Hole { hole_sort = ExprHole _ ref , hole_occ = occ , hole_ty = ty }) = parens $ (braces $ ppr occ <> colon <> ppr ref) <+> dcolon <+> ppr ty @@ -435,9 +439,9 @@ instance Outputable Hole where = braces $ ppr occ <> colon <> ppr ty instance Outputable HoleSort where - ppr (ExprHole ref) = text "ExprHole:" <+> ppr ref - ppr TypeHole = text "TypeHole" - ppr ConstraintHole = text "ConstraintHole" + ppr (ExprHole _ ref) = text "ExprHole:" <+> ppr ref + ppr TypeHole = text "TypeHole" + ppr ConstraintHole = text "ConstraintHole" -- | Why did we require that a certain type be concrete? data NotConcreteError ===================================== compiler/GHC/Tc/Utils/Env.hs ===================================== @@ -399,15 +399,13 @@ mkIllegalTyVarMessage :: DiagnosticReason -> WithUserRdr Name -> TcM TcRnMessage fail_tyvar reason (WithUserRdr rdr nm) = fail_with_msg reason WL_Term varName rdr nm (Just TermLevelUseTyVar) TyVarTE - fail_with_msg :: DiagnosticReason -> WhatLooking -> NameSpace -> RdrName -> Name - -> Maybe TermLevelUseCtxt -> TermLevelUseErr -> TcM TcRnMessage fail_with_msg reason what_looking whatName rdr nm pprov err = do (imp_errs, hints) <- get_suggestions what_looking whatName rdr hfdc <- getHoleFitDispConfig unit_state <- hsc_units <$> getTopEnv let want_simple = want_simple_msg hints - msg = TcRnIllegalTermLevelUse want_simple reason rdr nm err + msg = TcRnIllegalTermLevelUse want_simple rdr nm err reason info = ErrInfo { errInfoContext = if want_simple then [] @@ -417,8 +415,7 @@ mkIllegalTyVarMessage :: DiagnosticReason -> WithUserRdr Name -> TcM TcRnMessage NE.nonEmpty imp_errs , errInfoHints = hints } - msg_w_info = TcRnMessageWithInfo unit_state (mkDetailedMessage info msg) - return msg_w_info + return $ TcRnMessageWithInfo unit_state (mkDetailedMessage info msg) get_suggestions what_looking ns rdr = do required_type_arguments <- xoptM LangExt.RequiredTypeArguments ===================================== compiler/GHC/Tc/Utils/TcMType.hs ===================================== @@ -45,8 +45,6 @@ module GHC.Tc.Utils.TcMType ( emitWantedEqs, emitNewExprHole, newTcEvBinds, newNoTcEvBinds, addTcEvBind, - newExprHoleRef, - newCoercionHole, fillCoercionHole, isFilledCoercionHole, checkCoercionHole, @@ -300,28 +298,23 @@ emitWantedEvVar origin ty ; return new_cv } -- | Emit a new wanted expression hole -emitNewExprHole :: RdrName -- of the hole +emitNewExprHole :: ExprHoleVariant + -> RdrName -- of the hole -> Type -> TcM HoleExprRef -emitNewExprHole occ ty +emitNewExprHole variant occ ty = do { u <- newUnique ; ref <- newTcRef (pprPanic "unfilled unbound-variable evidence" (ppr u)) ; let her = HER ref ty u ; loc <- getCtLocM (ExprHoleOrigin (Just occ)) (Just TypeLevel) - ; let hole = Hole { hole_sort = ExprHole her + ; let hole = Hole { hole_sort = ExprHole variant her , hole_occ = occ , hole_ty = ty , hole_loc = loc } ; emitHole hole ; return her } -newExprHoleRef :: Type -> EvTerm -> TcM HoleExprRef -newExprHoleRef ty ev - = do { u <- newUnique - ; ref <- newTcRef ev - ; return $ HER ref ty u } - newDict :: Class -> [TcType] -> TcM DictId newDict cls tys = do { name <- newSysName (mkDictOcc (getOccName cls)) ===================================== testsuite/tests/rename/should_compile/T19966.hs ===================================== @@ -3,7 +3,6 @@ module T19966 where -import Control.Exception (evaluate) import Data.Proxy -- "I" is out of scope, but we accept the definition ===================================== testsuite/tests/rename/should_compile/T19966.stderr ===================================== @@ -1,16 +1,16 @@ -T19966.hs:11:7: warning: [GHC-88464] [-Wdeferred-out-of-scope-variables (in -Wdefault)] +T19966.hs:10:7: warning: [GHC-88464] [-Wdeferred-out-of-scope-variables (in -Wdefault)] Data constructor not in scope: I -T19966.hs:18:7: warning: [GHC-01928] [-Wdeferred-out-of-scope-variables (in -Wdefault)] +T19966.hs:17:7: warning: [GHC-01928] [-Wdeferred-out-of-scope-variables (in -Wdefault)] • Data constructor out of scope: ‘Bool’. NB: the type constructor ‘Bool’ cannot appear in this position. • In the expression: Bool In an equation for ‘ex2’: ex2 = Bool - Suggested fix: Perhaps use ‘Boo1’ (line 21) + Suggested fix: Perhaps use ‘Boo1’ (line 20) -T19966.hs:29:13: warning: [GHC-01928] [-Wdeferred-out-of-scope-variables (in -Wdefault)] +T19966.hs:28:13: warning: [GHC-01928] [-Wdeferred-out-of-scope-variables (in -Wdefault)] • Illegal term-level use of the type variable ‘a’ - • bound at T19966.hs:28:15 + • bound at T19966.hs:27:1 • In the first argument of ‘not’, namely ‘a’ In the expression: not a In an equation for ‘ex3’: ex3 _ = not a ===================================== testsuite/tests/rename/should_compile/T19966_main.stdout ===================================== @@ -1,12 +1,17 @@ -T19966.hs:11:7: error: [GHC-88464] +T19966.hs:10:7: error: [GHC-88464] • Data constructor not in scope: I • In an equation for ‘ex1’: ex1 = I (deferred type error) -T19966.hs:18:7: warning: [GHC-01928] [-Wdeferred-out-of-scope-variables (in -Wdefault)] - Data constructor out of scope: ‘Bool’. - NB: the type constructor ‘Bool’ cannot appear in this position. +T19966.hs:17:7: warning: [GHC-01928] [-Wdeferred-out-of-scope-variables (in -Wdefault)] + • Data constructor out of scope: ‘Bool’. + NB: the type constructor ‘Bool’ cannot appear in this position. + • In the expression: Bool + In an equation for ‘ex2’: ex2 = Bool (deferred type error) -T19966.hs:29:13: warning: [GHC-01928] [-Wdeferred-out-of-scope-variables (in -Wdefault)] +T19966.hs:28:13: warning: [GHC-01928] [-Wdeferred-out-of-scope-variables (in -Wdefault)] • Illegal term-level use of the type variable ‘a’ - • bound at T19966.hs:28:15 + • bound at T19966.hs:27:1 + • In the first argument of ‘not’, namely ‘a’ + In the expression: not a + In an equation for ‘ex3’: ex3 _ = not a (deferred type error) View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/e8b37cc86bb5d411a7270c98d8e0941e... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/e8b37cc86bb5d411a7270c98d8e0941e... You're receiving this email because of your account on gitlab.haskell.org.
participants (1)
-
Vladislav Zavialov (@int-index)