
Apoorv Ingle pushed to branch wip/spj-apporv-Oct24 at Glasgow Haskell Compiler / GHC Commits: 880146d6 by Apoorv Ingle at 2025-06-05T22:40:47-05:00 do not suppress pprArising - - - - - fc3b5bd7 by Apoorv Ingle at 2025-06-08T01:20:45-05:00 kill VACtxt - - - - - 6 changed files: - compiler/GHC/Tc/Errors/Ppr.hs - compiler/GHC/Tc/Gen/App.hs - compiler/GHC/Tc/Gen/Expr.hs - compiler/GHC/Tc/Gen/Head.hs - compiler/GHC/Tc/Utils/Monad.hs - testsuite/tests/indexed-types/should_fail/T5439.stderr Changes: ===================================== compiler/GHC/Tc/Errors/Ppr.hs ===================================== @@ -5327,7 +5327,7 @@ pprArising :: CtLoc -> SDoc -- Used for the main, top-level error message -- We've done special processing for TypeEq, KindEq, givens pprArising ct_loc - | in_generated_code = empty -- See Note ["Arising from" messages in generated code] + | in_generated_code = pprCtOrigin orig -- TODO ANI: maybe should go way | suppress_origin = empty | otherwise = pprCtOrigin orig where ===================================== compiler/GHC/Tc/Gen/App.hs ===================================== @@ -1,4 +1,3 @@ - {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs #-} @@ -189,8 +188,8 @@ tcExprSigma inst fun_orig rn_expr = do { (fun@(rn_fun,fun_ctxt), rn_args) <- splitHsApps rn_expr ; do_ql <- wantQuickLook rn_fun ; (tc_fun, fun_sigma) <- tcInferAppHead fun - ; (inst_args, app_res_sigma) <- tcInstFun do_ql inst fun_orig (tc_fun, fun_ctxt) fun_sigma rn_args - ; tc_args <- tcValArgs do_ql inst_args + ; (inst_args, app_res_sigma) <- tcInstFun do_ql inst fun_orig (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args + ; tc_args <- tcValArgs do_ql rn_fun inst_args ; let tc_expr = rebuildHsApps (tc_fun, fun_ctxt) tc_args ; return (tc_expr, app_res_sigma) } @@ -422,7 +421,7 @@ tcApp fun_orig rn_expr exp_res_ty , text "do_ql:" <+> ppr do_ql] ; (inst_args, app_res_rho) - <- tcInstFun do_ql True fun_orig (tc_fun, fun_ctxt) fun_sigma rn_args + <- tcInstFun do_ql True fun_orig (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args ; case do_ql of NoQL -> do { traceTc "tcApp:NoQL" (ppr rn_fun $$ ppr app_res_rho) @@ -433,7 +432,7 @@ tcApp fun_orig rn_expr exp_res_ty app_res_rho exp_res_ty -- Step 4.2: typecheck the arguments - ; tc_args <- tcValArgs NoQL inst_args + ; tc_args <- tcValArgs NoQL rn_fun inst_args -- Step 4.3: wrap up ; finishApp tc_head tc_args app_res_rho res_wrap } @@ -443,7 +442,7 @@ tcApp fun_orig rn_expr exp_res_ty ; quickLookResultType app_res_rho exp_res_ty -- Step 5.2: typecheck the arguments, and monomorphise -- any un-unified instantiation variables - ; tc_args <- tcValArgs DoQL inst_args + ; tc_args <- tcValArgs DoQL rn_fun inst_args -- Step 5.3: typecheck the arguments ; app_res_rho <- liftZonkM $ zonkTcType app_res_rho -- Step 5.4: subsumption check against the expected type @@ -529,26 +528,43 @@ checkResultTy rn_expr (tc_fun, fun_ctxt) inst_args app_res_rho (Check res_ty) thing_inside ---------------- -tcValArgs :: QLFlag -> [HsExprArg 'TcpInst] -> TcM [HsExprArg 'TcpTc] +tcValArgs :: QLFlag -> HsExpr GhcRn -> [HsExprArg 'TcpInst] -> TcM [HsExprArg 'TcpTc] -- Importantly, tcValArgs works left-to-right, so that by the time we -- encounter an argument, we have monomorphised all the instantiation -- variables that its type contains. All that is left to do is an ordinary -- zonkTcType. See Note [Monomorphise instantiation variables]. -tcValArgs do_ql args = mapM (tcValArg do_ql) args +tcValArgs do_ql fun args = go do_ql 0 args + where + go _ _ [] = return [] + go do_ql pos (arg : args) = + do { arg' <- tcValArg do_ql pos' fun arg + ; args' <- go do_ql pos' args + ; return (arg' : args') + } + where + -- increment position if the argument is user written type or value argument + pos' | EValArg { ea_ctxt = l } <- arg + , not (isGeneratedSrcSpan l) = pos + 1 + | EValArgQL { eaql_ctxt = l } <- arg + , not (isGeneratedSrcSpan l) = pos + 1 + | ETypeArg{ ea_ctxt = l } <- arg + , not (isGeneratedSrcSpan l) = pos + 1 + | otherwise = pos -tcValArg :: QLFlag -> HsExprArg 'TcpInst -- Actual argument + +tcValArg :: QLFlag -> Int -> HsExpr GhcRn -> HsExprArg 'TcpInst -- Actual argument -> TcM (HsExprArg 'TcpTc) -- Resulting argument -tcValArg _ (EPrag l p) = return (EPrag l (tcExprPrag p)) -tcValArg _ (ETypeArg l hty ty) = return (ETypeArg l hty ty) -tcValArg do_ql (EWrap (EHsWrap w)) = do { whenQL do_ql $ qlMonoHsWrapper w - ; return (EWrap (EHsWrap w)) } +tcValArg _ _ _ (EPrag l p) = return (EPrag l (tcExprPrag p)) +tcValArg _ _ _ (ETypeArg l hty ty) = return (ETypeArg l hty ty) +tcValArg do_ql _ _ (EWrap (EHsWrap w)) = do { whenQL do_ql $ qlMonoHsWrapper w + ; return (EWrap (EHsWrap w)) } -- qlMonoHsWrapper: see Note [Monomorphise instantiation variables] -tcValArg _ (EWrap ew) = return (EWrap ew) +tcValArg _ _ _ (EWrap ew) = return (EWrap ew) -tcValArg do_ql (EValArg { ea_ctxt = ctxt - , ea_arg = larg@(L arg_loc arg) - , ea_arg_ty = sc_arg_ty }) - = addArgCtxt ctxt larg $ +tcValArg do_ql pos fun (EValArg { ea_ctxt = ctxt + , ea_arg = larg@(L arg_loc arg) + , ea_arg_ty = sc_arg_ty }) + = addArgCtxt pos ctxt fun larg $ do { -- Crucial step: expose QL results before checking exp_arg_ty -- So far as the paper is concerned, this step applies -- the poly-substitution Theta, learned by QL, so that we @@ -577,7 +593,7 @@ tcValArg do_ql (EValArg { ea_ctxt = ctxt , ea_arg = L arg_loc arg' , ea_arg_ty = noExtField }) } -tcValArg _ (EValArgQL { eaql_wanted = wanted +tcValArg _ pos fun (EValArgQL { eaql_wanted = wanted , eaql_ctxt = ctxt , eaql_arg_ty = sc_arg_ty , eaql_larg = larg@(L arg_loc rn_expr) @@ -586,7 +602,7 @@ tcValArg _ (EValArgQL { eaql_wanted = wanted , eaql_args = inst_args , eaql_encl = arg_influences_enclosing_call , eaql_res_rho = app_res_rho }) - = addArgCtxt ctxt larg $ + = addArgCtxt pos ctxt fun larg $ do { -- Expose QL results to tcSkolemise, as in EValArg case Scaled mult exp_arg_ty <- liftZonkM $ zonkScaledTcType sc_arg_ty @@ -611,7 +627,7 @@ tcValArg _ (EValArgQL { eaql_wanted = wanted ; unless arg_influences_enclosing_call $ -- Don't repeat qlUnify app_res_rho exp_arg_rho -- the qlUnify - ; tc_args <- tcValArgs DoQL inst_args + ; tc_args <- tcValArgs DoQL fun inst_args ; app_res_rho <- liftZonkM $ zonkTcType app_res_rho ; res_wrap <- checkResultTy rn_expr tc_head inst_args app_res_rho (mkCheckExpType exp_arg_rho) @@ -656,14 +672,14 @@ tcInstFun :: QLFlag -- Otherwise we do eager instantiation; in Fig 5 of the paper -- |-inst returns a rho-type -> CtOrigin - -> (HsExpr GhcTc, AppCtxt) + -> (HsExpr GhcTc, HsExpr GhcRn, AppCtxt) -> TcSigmaType -> [HsExprArg 'TcpRn] -> TcM ( [HsExprArg 'TcpInst] , TcSigmaType ) -- This crucial function implements the |-inst judgement in Fig 4, plus the -- modification in Fig 5, of the QL paper: -- "A quick look at impredicativity" (ICFP'20). -tcInstFun do_ql inst_final fun_orig (tc_fun, fun_ctxt) fun_sigma rn_args +tcInstFun do_ql inst_final fun_orig (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args = do { traceTc "tcInstFun" (vcat [ text "origin" <+> ppr fun_orig , text "tc_fun" <+> ppr tc_fun , text "fun_sigma" <+> ppr fun_sigma @@ -845,7 +861,7 @@ tcInstFun do_ql inst_final fun_orig (tc_fun, fun_ctxt) fun_sigma rn_args (Just $ HsExprTcThing tc_fun) (n_val_args, fun_sigma) fun_ty - ; arg' <- quickLookArg do_ql ctxt arg arg_ty + ; arg' <- quickLookArg do_ql pos ctxt rn_fun arg arg_ty ; let acc' = arg' : addArgWrap wrap acc ; go (pos+1) acc' res_ty rest_args } @@ -889,7 +905,7 @@ looks_like_type_arg EValArg{ ea_arg = L _ e } = _ -> False looks_like_type_arg _ = False -addArgCtxt :: AppCtxt -> LHsExpr GhcRn +addArgCtxt :: Int -> AppCtxt -> HsExpr GhcRn -> LHsExpr GhcRn -> TcM a -> TcM a -- There are 2 cases: -- 1. In the normal case, we add an informative context @@ -901,20 +917,18 @@ addArgCtxt :: AppCtxt -> LHsExpr GhcRn -- Unless the arg is also a generated thing, in which case do nothing. -- See Note [Rebindable syntax and XXExprGhcRn] in GHC.Hs.Expr -- See Note [Expanding HsDo with XXExprGhcRn] in GHC.Tc.Gen.Do -addArgCtxt ctxt (L arg_loc arg) thing_inside +addArgCtxt arg_no ctxt fun (L arg_loc arg) thing_inside = do { in_generated_code <- inGeneratedCode ; traceTc "addArgCtxt" (vcat [ text "generated:" <+> ppr in_generated_code , text "arg: " <+> ppr arg , text "arg_loc" <+> ppr arg_loc]) - ; case ctxt of - VACall fun arg_no _ | not in_generated_code - -> do setSrcSpanA arg_loc $ - addErrCtxt (FunAppCtxt (FunAppCtxtExpr fun arg) arg_no) $ - thing_inside - - _ -> setSrcSpanA arg_loc $ - addExprCtxt arg $ -- Auto-suppressed if arg_loc is generated - thing_inside } + ; if in_generated_code + then do setSrcSpanA arg_loc $ + addExprCtxt arg $ -- Auto-suppressed if arg_loc is generated + thing_inside + else do setSrcSpanA arg_loc $ + addErrCtxt (FunAppCtxt (FunAppCtxtExpr fun arg) arg_no) $ + thing_inside } {- ********************************************************************* * * @@ -1690,19 +1704,19 @@ This turned out to be more subtle than I expected. Wrinkles: -} -quickLookArg :: QLFlag -> AppCtxt +quickLookArg :: QLFlag -> Int -> AppCtxt -> HsExpr GhcRn -> LHsExpr GhcRn -- ^ Argument -> Scaled TcSigmaTypeFRR -- ^ Type expected by the function -> TcM (HsExprArg 'TcpInst) -- See Note [Quick Look at value arguments] -quickLookArg NoQL ctxt larg orig_arg_ty +quickLookArg NoQL _ ctxt _ larg orig_arg_ty = skipQuickLook ctxt larg orig_arg_ty -quickLookArg DoQL ctxt larg orig_arg_ty +quickLookArg DoQL pos ctxt fun larg orig_arg_ty = do { is_rho <- tcIsDeepRho (scaledThing orig_arg_ty) ; traceTc "qla" (ppr orig_arg_ty $$ ppr is_rho) ; if not is_rho then skipQuickLook ctxt larg orig_arg_ty - else quickLookArg1 ctxt larg orig_arg_ty } + else quickLookArg1 pos ctxt fun larg orig_arg_ty } skipQuickLook :: AppCtxt -> LHsExpr GhcRn -> Scaled TcRhoType -> TcM (HsExprArg 'TcpInst) @@ -1745,12 +1759,12 @@ isGuardedTy ty | Just {} <- tcSplitAppTy_maybe ty = True | otherwise = False -quickLookArg1 :: AppCtxt -> LHsExpr GhcRn +quickLookArg1 :: Int -> AppCtxt -> HsExpr GhcRn -> LHsExpr GhcRn -> Scaled TcRhoType -- Deeply skolemised -> TcM (HsExprArg 'TcpInst) -- quickLookArg1 implements the "QL Argument" judgement in Fig 5 of the paper -quickLookArg1 ctxt larg@(L _ arg) sc_arg_ty@(Scaled _ orig_arg_rho) - = addArgCtxt ctxt larg $ -- Context needed for constraints +quickLookArg1 pos ctxt fun larg@(L _ arg) sc_arg_ty@(Scaled _ orig_arg_rho) + = addArgCtxt pos ctxt fun larg $ -- Context needed for constraints -- generated by calls in arg do { ((rn_fun, fun_ctxt), rn_args) <- splitHsApps arg @@ -1776,7 +1790,7 @@ quickLookArg1 ctxt larg@(L _ arg) sc_arg_ty@(Scaled _ orig_arg_rho) ; do_ql <- wantQuickLook rn_fun ; ((inst_args, app_res_rho), wanted) <- captureConstraints $ - tcInstFun do_ql True (exprCtOrigin arg) (tc_fun, fun_ctxt) fun_sigma rn_args + tcInstFun do_ql True (exprCtOrigin arg) (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args -- We must capture type-class and equality constraints here, but -- not equality constraints. See (QLA6) in Note [Quick Look at -- value arguments] ===================================== compiler/GHC/Tc/Gen/Expr.hs ===================================== @@ -1,4 +1,3 @@ - {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ScopedTypeVariables #-} @@ -295,7 +294,7 @@ tcExpr :: HsExpr GhcRn -- These constructors are the union of -- - ones taken apart by GHC.Tc.Gen.Head.splitHsApps -- - ones understood by GHC.Tc.Gen.Head.tcInferAppHead_maybe --- See Note [Application chains and heads] in GHC.Tc.Gen.Ap +-- See Note [Application chains and heads] in GHC.Tc.Gen.App tcExpr e@(HsVar {}) res_ty = tcApp (exprCtOrigin e) e res_ty tcExpr e@(HsApp {}) res_ty = tcApp (exprCtOrigin e) e res_ty tcExpr e@(OpApp {}) res_ty = tcApp (exprCtOrigin e) e res_ty @@ -905,7 +904,7 @@ tcSyntaxOpGen :: CtOrigin -> ([TcSigmaTypeFRR] -> [Mult] -> TcM a) -> TcM (a, SyntaxExprTc) tcSyntaxOpGen orig (SyntaxExprRn op) arg_tys res_ty thing_inside - = do { (expr, sigma) <- tcInferAppHead (op, VACall op 0 noSrcSpan) + = do { (expr, sigma) <- tcInferAppHead (op, noSrcSpan) -- Ugh!! But all this code is scheduled for demolition anyway ; traceTc "tcSyntaxOpGen" (ppr op $$ ppr expr $$ ppr sigma) ; (result, expr_wrap, arg_wraps, res_wrap) ===================================== compiler/GHC/Tc/Gen/Head.hs ===================================== @@ -1,4 +1,3 @@ - {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs #-} @@ -17,7 +16,7 @@ module GHC.Tc.Gen.Head ( HsExprArg(..), TcPass(..), QLFlag(..), EWrap(..) - , AppCtxt(..), appCtxtLoc, insideExpansion, appCtxtExpr + , AppCtxt, appCtxtLoc, insideExpansion , splitHsApps, rebuildHsApps , addArgWrap, isHsValArg , leadingValArgs, isVisibleArg @@ -209,11 +208,11 @@ data EWrap = EPar AppCtxt | EExpand (HsExpr GhcRn) | EHsWrap HsWrapper -data AppCtxt = - VACall - (HsExpr GhcRn) Int -- In the third argument of function f - SrcSpan -- The SrcSpan of the application (f e1 e2 e3) - -- noSrcSpan if outermost; see Note [AppCtxt] +type AppCtxt = SrcSpan + -- VACall + -- (HsExpr GhcRn) Int -- In the third argument of function f + -- SrcSpan -- The SrcSpan of the application (f e1 e2 e3) + -- -- noSrcSpan if outermost; see Note [AppCtxt] {- Note [AppCtxt] @@ -244,21 +243,15 @@ a second time. -} appCtxtLoc :: AppCtxt -> SrcSpan -appCtxtLoc (VACall _ _ l) = l +appCtxtLoc l = l insideExpansion :: AppCtxt -> Bool -insideExpansion ctxt = isGeneratedSrcSpan (appCtxtLoc ctxt) - -appCtxtExpr :: AppCtxt -> HsExpr GhcRn -appCtxtExpr (VACall e _ _) = e +insideExpansion l = isGeneratedSrcSpan l instance Outputable QLFlag where ppr DoQL = text "DoQL" ppr NoQL = text "NoQL" -instance Outputable AppCtxt where - ppr (VACall f n l) = text "VACall" <+> int n <+> ppr f <+> ppr l - type family XPass (p :: TcPass) where XPass 'TcpRn = 'Renamed XPass 'TcpInst = 'Renamed @@ -288,29 +281,15 @@ splitHsApps :: HsExpr GhcRn -- This uses the TcM monad solely because we must run modFinalizers when looking -- through HsUntypedSplices -- (see Note [Looking through Template Haskell splices in splitHsApps]). -splitHsApps e = go e (top_ctxt 0 e) [] +splitHsApps e = go e noSrcSpan [] where - top_ctxt :: Int -> HsExpr GhcRn -> AppCtxt - -- Always returns VACall fun n_val_args noSrcSpan - -- to initialise the argument splitting in 'go' - -- See Note [AppCtxt] - top_ctxt n (HsPar _ fun) = top_lctxt n fun - top_ctxt n (HsPragE _ _ fun) = top_lctxt n fun - top_ctxt n (HsAppType _ fun _) = top_lctxt (n+1) fun - top_ctxt n (HsApp _ fun _) = top_lctxt (n+1) fun - top_ctxt n (XExpr (PopErrCtxt fun)) = top_ctxt n fun - top_ctxt n other_fun = VACall other_fun n noSrcSpan - - top_lctxt :: Int -> LHsExpr GhcRn -> AppCtxt - top_lctxt n (L _ fun) = top_ctxt n fun - go :: HsExpr GhcRn -> AppCtxt -> [HsExprArg 'TcpRn] -> TcM ((HsExpr GhcRn, AppCtxt), [HsExprArg 'TcpRn]) -- Modify the AppCtxt as we walk inwards, so it describes the next argument - go (HsPar _ (L l fun)) ctxt args = go fun (set l ctxt) (EWrap (EPar ctxt) : args) - go (HsPragE _ p (L l fun)) ctxt args = go fun (set l ctxt) (EPrag ctxt p : args) - go (HsAppType _ (L l fun) ty) ctxt args = go fun (dec l ctxt) (mkETypeArg ctxt ty : args) - go (HsApp _ (L l fun) arg) ctxt args = go fun (dec l ctxt) (mkEValArg ctxt arg : args) + go (HsPar _ (L l fun)) ctxt args = go fun (locA l) (EWrap (EPar ctxt) : args) + go (HsPragE _ p (L l fun)) ctxt args = go fun (locA l) (EPrag ctxt p : args) + go (HsAppType _ (L l fun) ty) ctxt args = go fun ctxt (mkETypeArg ctxt ty : args) + go (HsApp _ (L l fun) arg) ctxt args = go fun ctxt (mkEValArg ctxt arg : args) -- See Note [Looking through Template Haskell splices in splitHsApps] go e@(HsUntypedSplice splice_res splice) ctxt args @@ -319,14 +298,14 @@ splitHsApps e = go e (top_ctxt 0 e) [] where ctxt' :: AppCtxt ctxt' = case splice of - HsUntypedSpliceExpr _ (L l _) -> set l ctxt -- l :: SrcAnn AnnListItem - HsQuasiQuote _ _ (L l _) -> set l ctxt -- l :: SrcAnn NoEpAnns + HsUntypedSpliceExpr _ (L l _) -> locA l -- l :: SrcAnn AnnListItem + HsQuasiQuote _ _ (L l _) -> locA l -- l :: SrcAnn NoEpAnns -- See Note [Desugar OpApp in the typechecker] go e@(OpApp _ arg1 (L l op) arg2) _ args - = pure ( (op, VACall op 0 (locA l)) - , mkEValArg (VACall op 1 generatedSrcSpan) arg1 - : mkEValArg (VACall op 2 generatedSrcSpan) arg2 + = pure ( (op, locA l) + , mkEValArg generatedSrcSpan arg1 + : mkEValArg generatedSrcSpan arg2 -- generatedSrcSpan because this the span of the call, -- and its hard to say exactly what that is : EWrap (EExpand e) @@ -337,11 +316,6 @@ splitHsApps e = go e (top_ctxt 0 e) [] go e ctxt args = pure ((e,ctxt), args) - set :: EpAnn ann -> AppCtxt -> AppCtxt - set l (VACall f n _) = VACall f n (locA l) - - dec :: EpAnn ann -> AppCtxt -> AppCtxt - dec l (VACall f n _) = VACall f (n-1) (locA l) -- | Rebuild an application: takes a type-checked application head -- expression together with arguments in the form of typechecked 'HsExprArg's @@ -545,13 +519,12 @@ tcInferAppHead_maybe fun = HsOverLit _ lit -> Just <$> tcInferOverLit lit _ -> return Nothing -addHeadCtxt :: AppCtxt -> TcM a -> TcM a -addHeadCtxt fun_ctxt thing_inside +addHeadCtxt :: AppCtxt -> TcM a -> TcM a --TODO ANI: Why not just setSrcSpan? +addHeadCtxt fun_loc thing_inside | not (isGoodSrcSpan fun_loc) -- noSrcSpan => no arguments = thing_inside -- => context is already set | otherwise = setSrcSpan fun_loc thing_inside - where fun_loc = appCtxtLoc fun_ctxt {- ********************************************************************* ===================================== compiler/GHC/Tc/Utils/Monad.hs ===================================== @@ -1730,6 +1730,7 @@ mkErrCtxt env ctxts -- else go dbg 0 env ctxts = go False 0 env ctxts -- regular error ctx where + go :: Bool -> Int -> TidyEnv -> [ErrCtxt] -> TcM [ErrCtxtMsg] go _ _ _ [] = return [] go dbg n env ((is_landmark, ctxt) : ctxts) | is_landmark || n < mAX_CONTEXTS -- Too verbose || dbg ===================================== testsuite/tests/indexed-types/should_fail/T5439.stderr ===================================== @@ -1,4 +1,3 @@ - T5439.hs:83:33: error: [GHC-83865] • Couldn't match expected type: Attempt (HElemOf rs) with actual type: Attempt (HHead (HDrop n0 l0)) @@ -6,8 +5,7 @@ T5439.hs:83:33: error: [GHC-83865] • Probable cause: ‘($)’ is applied to too few arguments In the second argument of ‘($)’, namely ‘inj $ Failure (e :: SomeException)’ - In a stmt of a 'do' block: - c <- complete ev $ inj $ Failure (e :: SomeException) + In the expression: complete ev $ inj $ Failure (e :: SomeException) In the expression: do c <- complete ev $ inj $ Failure (e :: SomeException) return $ c || not first @@ -28,5 +26,5 @@ T5439.hs:83:39: error: [GHC-83865] ‘Failure (e :: SomeException)’ In the second argument of ‘($)’, namely ‘inj $ Failure (e :: SomeException)’ - In a stmt of a 'do' block: - c <- complete ev $ inj $ Failure (e :: SomeException) + In the expression: complete ev $ inj $ Failure (e :: SomeException) + View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/4dc259608b090707ad7de9ea12067aa... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/4dc259608b090707ad7de9ea12067aa... You're receiving this email because of your account on gitlab.haskell.org.