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
-
fc3b5bd7
by Apoorv Ingle at 2025-06-08T01:20:45-05:00
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:
... | ... | @@ -5327,7 +5327,7 @@ pprArising :: CtLoc -> SDoc |
5327 | 5327 | -- Used for the main, top-level error message
|
5328 | 5328 | -- We've done special processing for TypeEq, KindEq, givens
|
5329 | 5329 | pprArising ct_loc
|
5330 | - | in_generated_code = empty -- See Note ["Arising from" messages in generated code]
|
|
5330 | + | in_generated_code = pprCtOrigin orig -- TODO ANI: maybe should go way
|
|
5331 | 5331 | | suppress_origin = empty
|
5332 | 5332 | | otherwise = pprCtOrigin orig
|
5333 | 5333 | where
|
1 | - |
|
2 | 1 | {-# LANGUAGE DataKinds #-}
|
3 | 2 | {-# LANGUAGE FlexibleContexts #-}
|
4 | 3 | {-# LANGUAGE GADTs #-}
|
... | ... | @@ -189,8 +188,8 @@ tcExprSigma inst fun_orig rn_expr |
189 | 188 | = do { (fun@(rn_fun,fun_ctxt), rn_args) <- splitHsApps rn_expr
|
190 | 189 | ; do_ql <- wantQuickLook rn_fun
|
191 | 190 | ; (tc_fun, fun_sigma) <- tcInferAppHead fun
|
192 | - ; (inst_args, app_res_sigma) <- tcInstFun do_ql inst fun_orig (tc_fun, fun_ctxt) fun_sigma rn_args
|
|
193 | - ; tc_args <- tcValArgs do_ql inst_args
|
|
191 | + ; (inst_args, app_res_sigma) <- tcInstFun do_ql inst fun_orig (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args
|
|
192 | + ; tc_args <- tcValArgs do_ql rn_fun inst_args
|
|
194 | 193 | ; let tc_expr = rebuildHsApps (tc_fun, fun_ctxt) tc_args
|
195 | 194 | ; return (tc_expr, app_res_sigma) }
|
196 | 195 | |
... | ... | @@ -422,7 +421,7 @@ tcApp fun_orig rn_expr exp_res_ty |
422 | 421 | , text "do_ql:" <+> ppr do_ql]
|
423 | 422 | |
424 | 423 | ; (inst_args, app_res_rho)
|
425 | - <- tcInstFun do_ql True fun_orig (tc_fun, fun_ctxt) fun_sigma rn_args
|
|
424 | + <- tcInstFun do_ql True fun_orig (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args
|
|
426 | 425 | |
427 | 426 | ; case do_ql of
|
428 | 427 | NoQL -> do { traceTc "tcApp:NoQL" (ppr rn_fun $$ ppr app_res_rho)
|
... | ... | @@ -433,7 +432,7 @@ tcApp fun_orig rn_expr exp_res_ty |
433 | 432 | app_res_rho exp_res_ty
|
434 | 433 | |
435 | 434 | -- Step 4.2: typecheck the arguments
|
436 | - ; tc_args <- tcValArgs NoQL inst_args
|
|
435 | + ; tc_args <- tcValArgs NoQL rn_fun inst_args
|
|
437 | 436 | -- Step 4.3: wrap up
|
438 | 437 | ; finishApp tc_head tc_args app_res_rho res_wrap }
|
439 | 438 | |
... | ... | @@ -443,7 +442,7 @@ tcApp fun_orig rn_expr exp_res_ty |
443 | 442 | ; quickLookResultType app_res_rho exp_res_ty
|
444 | 443 | -- Step 5.2: typecheck the arguments, and monomorphise
|
445 | 444 | -- any un-unified instantiation variables
|
446 | - ; tc_args <- tcValArgs DoQL inst_args
|
|
445 | + ; tc_args <- tcValArgs DoQL rn_fun inst_args
|
|
447 | 446 | -- Step 5.3: typecheck the arguments
|
448 | 447 | ; app_res_rho <- liftZonkM $ zonkTcType app_res_rho
|
449 | 448 | -- 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) |
529 | 528 | thing_inside
|
530 | 529 | |
531 | 530 | ----------------
|
532 | -tcValArgs :: QLFlag -> [HsExprArg 'TcpInst] -> TcM [HsExprArg 'TcpTc]
|
|
531 | +tcValArgs :: QLFlag -> HsExpr GhcRn -> [HsExprArg 'TcpInst] -> TcM [HsExprArg 'TcpTc]
|
|
533 | 532 | -- Importantly, tcValArgs works left-to-right, so that by the time we
|
534 | 533 | -- encounter an argument, we have monomorphised all the instantiation
|
535 | 534 | -- variables that its type contains. All that is left to do is an ordinary
|
536 | 535 | -- zonkTcType. See Note [Monomorphise instantiation variables].
|
537 | -tcValArgs do_ql args = mapM (tcValArg do_ql) args
|
|
536 | +tcValArgs do_ql fun args = go do_ql 0 args
|
|
537 | + where
|
|
538 | + go _ _ [] = return []
|
|
539 | + go do_ql pos (arg : args) =
|
|
540 | + do { arg' <- tcValArg do_ql pos' fun arg
|
|
541 | + ; args' <- go do_ql pos' args
|
|
542 | + ; return (arg' : args')
|
|
543 | + }
|
|
544 | + where
|
|
545 | + -- increment position if the argument is user written type or value argument
|
|
546 | + pos' | EValArg { ea_ctxt = l } <- arg
|
|
547 | + , not (isGeneratedSrcSpan l) = pos + 1
|
|
548 | + | EValArgQL { eaql_ctxt = l } <- arg
|
|
549 | + , not (isGeneratedSrcSpan l) = pos + 1
|
|
550 | + | ETypeArg{ ea_ctxt = l } <- arg
|
|
551 | + , not (isGeneratedSrcSpan l) = pos + 1
|
|
552 | + | otherwise = pos
|
|
538 | 553 | |
539 | -tcValArg :: QLFlag -> HsExprArg 'TcpInst -- Actual argument
|
|
554 | + |
|
555 | +tcValArg :: QLFlag -> Int -> HsExpr GhcRn -> HsExprArg 'TcpInst -- Actual argument
|
|
540 | 556 | -> TcM (HsExprArg 'TcpTc) -- Resulting argument
|
541 | -tcValArg _ (EPrag l p) = return (EPrag l (tcExprPrag p))
|
|
542 | -tcValArg _ (ETypeArg l hty ty) = return (ETypeArg l hty ty)
|
|
543 | -tcValArg do_ql (EWrap (EHsWrap w)) = do { whenQL do_ql $ qlMonoHsWrapper w
|
|
544 | - ; return (EWrap (EHsWrap w)) }
|
|
557 | +tcValArg _ _ _ (EPrag l p) = return (EPrag l (tcExprPrag p))
|
|
558 | +tcValArg _ _ _ (ETypeArg l hty ty) = return (ETypeArg l hty ty)
|
|
559 | +tcValArg do_ql _ _ (EWrap (EHsWrap w)) = do { whenQL do_ql $ qlMonoHsWrapper w
|
|
560 | + ; return (EWrap (EHsWrap w)) }
|
|
545 | 561 | -- qlMonoHsWrapper: see Note [Monomorphise instantiation variables]
|
546 | -tcValArg _ (EWrap ew) = return (EWrap ew)
|
|
562 | +tcValArg _ _ _ (EWrap ew) = return (EWrap ew)
|
|
547 | 563 | |
548 | -tcValArg do_ql (EValArg { ea_ctxt = ctxt
|
|
549 | - , ea_arg = larg@(L arg_loc arg)
|
|
550 | - , ea_arg_ty = sc_arg_ty })
|
|
551 | - = addArgCtxt ctxt larg $
|
|
564 | +tcValArg do_ql pos fun (EValArg { ea_ctxt = ctxt
|
|
565 | + , ea_arg = larg@(L arg_loc arg)
|
|
566 | + , ea_arg_ty = sc_arg_ty })
|
|
567 | + = addArgCtxt pos ctxt fun larg $
|
|
552 | 568 | do { -- Crucial step: expose QL results before checking exp_arg_ty
|
553 | 569 | -- So far as the paper is concerned, this step applies
|
554 | 570 | -- the poly-substitution Theta, learned by QL, so that we
|
... | ... | @@ -577,7 +593,7 @@ tcValArg do_ql (EValArg { ea_ctxt = ctxt |
577 | 593 | , ea_arg = L arg_loc arg'
|
578 | 594 | , ea_arg_ty = noExtField }) }
|
579 | 595 | |
580 | -tcValArg _ (EValArgQL { eaql_wanted = wanted
|
|
596 | +tcValArg _ pos fun (EValArgQL { eaql_wanted = wanted
|
|
581 | 597 | , eaql_ctxt = ctxt
|
582 | 598 | , eaql_arg_ty = sc_arg_ty
|
583 | 599 | , eaql_larg = larg@(L arg_loc rn_expr)
|
... | ... | @@ -586,7 +602,7 @@ tcValArg _ (EValArgQL { eaql_wanted = wanted |
586 | 602 | , eaql_args = inst_args
|
587 | 603 | , eaql_encl = arg_influences_enclosing_call
|
588 | 604 | , eaql_res_rho = app_res_rho })
|
589 | - = addArgCtxt ctxt larg $
|
|
605 | + = addArgCtxt pos ctxt fun larg $
|
|
590 | 606 | do { -- Expose QL results to tcSkolemise, as in EValArg case
|
591 | 607 | Scaled mult exp_arg_ty <- liftZonkM $ zonkScaledTcType sc_arg_ty
|
592 | 608 | |
... | ... | @@ -611,7 +627,7 @@ tcValArg _ (EValArgQL { eaql_wanted = wanted |
611 | 627 | ; unless arg_influences_enclosing_call $ -- Don't repeat
|
612 | 628 | qlUnify app_res_rho exp_arg_rho -- the qlUnify
|
613 | 629 | |
614 | - ; tc_args <- tcValArgs DoQL inst_args
|
|
630 | + ; tc_args <- tcValArgs DoQL fun inst_args
|
|
615 | 631 | ; app_res_rho <- liftZonkM $ zonkTcType app_res_rho
|
616 | 632 | ; res_wrap <- checkResultTy rn_expr tc_head inst_args
|
617 | 633 | app_res_rho (mkCheckExpType exp_arg_rho)
|
... | ... | @@ -656,14 +672,14 @@ tcInstFun :: QLFlag |
656 | 672 | -- Otherwise we do eager instantiation; in Fig 5 of the paper
|
657 | 673 | -- |-inst returns a rho-type
|
658 | 674 | -> CtOrigin
|
659 | - -> (HsExpr GhcTc, AppCtxt)
|
|
675 | + -> (HsExpr GhcTc, HsExpr GhcRn, AppCtxt)
|
|
660 | 676 | -> TcSigmaType -> [HsExprArg 'TcpRn]
|
661 | 677 | -> TcM ( [HsExprArg 'TcpInst]
|
662 | 678 | , TcSigmaType )
|
663 | 679 | -- This crucial function implements the |-inst judgement in Fig 4, plus the
|
664 | 680 | -- modification in Fig 5, of the QL paper:
|
665 | 681 | -- "A quick look at impredicativity" (ICFP'20).
|
666 | -tcInstFun do_ql inst_final fun_orig (tc_fun, fun_ctxt) fun_sigma rn_args
|
|
682 | +tcInstFun do_ql inst_final fun_orig (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args
|
|
667 | 683 | = do { traceTc "tcInstFun" (vcat [ text "origin" <+> ppr fun_orig
|
668 | 684 | , text "tc_fun" <+> ppr tc_fun
|
669 | 685 | , 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 |
845 | 861 | (Just $ HsExprTcThing tc_fun)
|
846 | 862 | (n_val_args, fun_sigma) fun_ty
|
847 | 863 | |
848 | - ; arg' <- quickLookArg do_ql ctxt arg arg_ty
|
|
864 | + ; arg' <- quickLookArg do_ql pos ctxt rn_fun arg arg_ty
|
|
849 | 865 | ; let acc' = arg' : addArgWrap wrap acc
|
850 | 866 | ; go (pos+1) acc' res_ty rest_args }
|
851 | 867 | |
... | ... | @@ -889,7 +905,7 @@ looks_like_type_arg EValArg{ ea_arg = L _ e } = |
889 | 905 | _ -> False
|
890 | 906 | looks_like_type_arg _ = False
|
891 | 907 | |
892 | -addArgCtxt :: AppCtxt -> LHsExpr GhcRn
|
|
908 | +addArgCtxt :: Int -> AppCtxt -> HsExpr GhcRn -> LHsExpr GhcRn
|
|
893 | 909 | -> TcM a -> TcM a
|
894 | 910 | -- There are 2 cases:
|
895 | 911 | -- 1. In the normal case, we add an informative context
|
... | ... | @@ -901,20 +917,18 @@ addArgCtxt :: AppCtxt -> LHsExpr GhcRn |
901 | 917 | -- Unless the arg is also a generated thing, in which case do nothing.
|
902 | 918 | -- See Note [Rebindable syntax and XXExprGhcRn] in GHC.Hs.Expr
|
903 | 919 | -- See Note [Expanding HsDo with XXExprGhcRn] in GHC.Tc.Gen.Do
|
904 | -addArgCtxt ctxt (L arg_loc arg) thing_inside
|
|
920 | +addArgCtxt arg_no ctxt fun (L arg_loc arg) thing_inside
|
|
905 | 921 | = do { in_generated_code <- inGeneratedCode
|
906 | 922 | ; traceTc "addArgCtxt" (vcat [ text "generated:" <+> ppr in_generated_code
|
907 | 923 | , text "arg: " <+> ppr arg
|
908 | 924 | , text "arg_loc" <+> ppr arg_loc])
|
909 | - ; case ctxt of
|
|
910 | - VACall fun arg_no _ | not in_generated_code
|
|
911 | - -> do setSrcSpanA arg_loc $
|
|
912 | - addErrCtxt (FunAppCtxt (FunAppCtxtExpr fun arg) arg_no) $
|
|
913 | - thing_inside
|
|
914 | - |
|
915 | - _ -> setSrcSpanA arg_loc $
|
|
916 | - addExprCtxt arg $ -- Auto-suppressed if arg_loc is generated
|
|
917 | - thing_inside }
|
|
925 | + ; if in_generated_code
|
|
926 | + then do setSrcSpanA arg_loc $
|
|
927 | + addExprCtxt arg $ -- Auto-suppressed if arg_loc is generated
|
|
928 | + thing_inside
|
|
929 | + else do setSrcSpanA arg_loc $
|
|
930 | + addErrCtxt (FunAppCtxt (FunAppCtxtExpr fun arg) arg_no) $
|
|
931 | + thing_inside }
|
|
918 | 932 | |
919 | 933 | {- *********************************************************************
|
920 | 934 | * *
|
... | ... | @@ -1690,19 +1704,19 @@ This turned out to be more subtle than I expected. Wrinkles: |
1690 | 1704 | |
1691 | 1705 | -}
|
1692 | 1706 | |
1693 | -quickLookArg :: QLFlag -> AppCtxt
|
|
1707 | +quickLookArg :: QLFlag -> Int -> AppCtxt -> HsExpr GhcRn
|
|
1694 | 1708 | -> LHsExpr GhcRn -- ^ Argument
|
1695 | 1709 | -> Scaled TcSigmaTypeFRR -- ^ Type expected by the function
|
1696 | 1710 | -> TcM (HsExprArg 'TcpInst)
|
1697 | 1711 | -- See Note [Quick Look at value arguments]
|
1698 | -quickLookArg NoQL ctxt larg orig_arg_ty
|
|
1712 | +quickLookArg NoQL _ ctxt _ larg orig_arg_ty
|
|
1699 | 1713 | = skipQuickLook ctxt larg orig_arg_ty
|
1700 | -quickLookArg DoQL ctxt larg orig_arg_ty
|
|
1714 | +quickLookArg DoQL pos ctxt fun larg orig_arg_ty
|
|
1701 | 1715 | = do { is_rho <- tcIsDeepRho (scaledThing orig_arg_ty)
|
1702 | 1716 | ; traceTc "qla" (ppr orig_arg_ty $$ ppr is_rho)
|
1703 | 1717 | ; if not is_rho
|
1704 | 1718 | then skipQuickLook ctxt larg orig_arg_ty
|
1705 | - else quickLookArg1 ctxt larg orig_arg_ty }
|
|
1719 | + else quickLookArg1 pos ctxt fun larg orig_arg_ty }
|
|
1706 | 1720 | |
1707 | 1721 | skipQuickLook :: AppCtxt -> LHsExpr GhcRn -> Scaled TcRhoType
|
1708 | 1722 | -> TcM (HsExprArg 'TcpInst)
|
... | ... | @@ -1745,12 +1759,12 @@ isGuardedTy ty |
1745 | 1759 | | Just {} <- tcSplitAppTy_maybe ty = True
|
1746 | 1760 | | otherwise = False
|
1747 | 1761 | |
1748 | -quickLookArg1 :: AppCtxt -> LHsExpr GhcRn
|
|
1762 | +quickLookArg1 :: Int -> AppCtxt -> HsExpr GhcRn -> LHsExpr GhcRn
|
|
1749 | 1763 | -> Scaled TcRhoType -- Deeply skolemised
|
1750 | 1764 | -> TcM (HsExprArg 'TcpInst)
|
1751 | 1765 | -- quickLookArg1 implements the "QL Argument" judgement in Fig 5 of the paper
|
1752 | -quickLookArg1 ctxt larg@(L _ arg) sc_arg_ty@(Scaled _ orig_arg_rho)
|
|
1753 | - = addArgCtxt ctxt larg $ -- Context needed for constraints
|
|
1766 | +quickLookArg1 pos ctxt fun larg@(L _ arg) sc_arg_ty@(Scaled _ orig_arg_rho)
|
|
1767 | + = addArgCtxt pos ctxt fun larg $ -- Context needed for constraints
|
|
1754 | 1768 | -- generated by calls in arg
|
1755 | 1769 | do { ((rn_fun, fun_ctxt), rn_args) <- splitHsApps arg
|
1756 | 1770 | |
... | ... | @@ -1776,7 +1790,7 @@ quickLookArg1 ctxt larg@(L _ arg) sc_arg_ty@(Scaled _ orig_arg_rho) |
1776 | 1790 | ; do_ql <- wantQuickLook rn_fun
|
1777 | 1791 | ; ((inst_args, app_res_rho), wanted)
|
1778 | 1792 | <- captureConstraints $
|
1779 | - tcInstFun do_ql True (exprCtOrigin arg) (tc_fun, fun_ctxt) fun_sigma rn_args
|
|
1793 | + tcInstFun do_ql True (exprCtOrigin arg) (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args
|
|
1780 | 1794 | -- We must capture type-class and equality constraints here, but
|
1781 | 1795 | -- not equality constraints. See (QLA6) in Note [Quick Look at
|
1782 | 1796 | -- value arguments]
|
1 | - |
|
2 | 1 | {-# LANGUAGE DataKinds #-}
|
3 | 2 | {-# LANGUAGE FlexibleContexts #-}
|
4 | 3 | {-# LANGUAGE ScopedTypeVariables #-}
|
... | ... | @@ -295,7 +294,7 @@ tcExpr :: HsExpr GhcRn |
295 | 294 | -- These constructors are the union of
|
296 | 295 | -- - ones taken apart by GHC.Tc.Gen.Head.splitHsApps
|
297 | 296 | -- - ones understood by GHC.Tc.Gen.Head.tcInferAppHead_maybe
|
298 | --- See Note [Application chains and heads] in GHC.Tc.Gen.Ap
|
|
297 | +-- See Note [Application chains and heads] in GHC.Tc.Gen.App
|
|
299 | 298 | tcExpr e@(HsVar {}) res_ty = tcApp (exprCtOrigin e) e res_ty
|
300 | 299 | tcExpr e@(HsApp {}) res_ty = tcApp (exprCtOrigin e) e res_ty
|
301 | 300 | tcExpr e@(OpApp {}) res_ty = tcApp (exprCtOrigin e) e res_ty
|
... | ... | @@ -905,7 +904,7 @@ tcSyntaxOpGen :: CtOrigin |
905 | 904 | -> ([TcSigmaTypeFRR] -> [Mult] -> TcM a)
|
906 | 905 | -> TcM (a, SyntaxExprTc)
|
907 | 906 | tcSyntaxOpGen orig (SyntaxExprRn op) arg_tys res_ty thing_inside
|
908 | - = do { (expr, sigma) <- tcInferAppHead (op, VACall op 0 noSrcSpan)
|
|
907 | + = do { (expr, sigma) <- tcInferAppHead (op, noSrcSpan)
|
|
909 | 908 | -- Ugh!! But all this code is scheduled for demolition anyway
|
910 | 909 | ; traceTc "tcSyntaxOpGen" (ppr op $$ ppr expr $$ ppr sigma)
|
911 | 910 | ; (result, expr_wrap, arg_wraps, res_wrap)
|
1 | - |
|
2 | 1 | {-# LANGUAGE DataKinds #-}
|
3 | 2 | {-# LANGUAGE FlexibleContexts #-}
|
4 | 3 | {-# LANGUAGE GADTs #-}
|
... | ... | @@ -17,7 +16,7 @@ |
17 | 16 | |
18 | 17 | module GHC.Tc.Gen.Head
|
19 | 18 | ( HsExprArg(..), TcPass(..), QLFlag(..), EWrap(..)
|
20 | - , AppCtxt(..), appCtxtLoc, insideExpansion, appCtxtExpr
|
|
19 | + , AppCtxt, appCtxtLoc, insideExpansion
|
|
21 | 20 | , splitHsApps, rebuildHsApps
|
22 | 21 | , addArgWrap, isHsValArg
|
23 | 22 | , leadingValArgs, isVisibleArg
|
... | ... | @@ -209,11 +208,11 @@ data EWrap = EPar AppCtxt |
209 | 208 | | EExpand (HsExpr GhcRn)
|
210 | 209 | | EHsWrap HsWrapper
|
211 | 210 | |
212 | -data AppCtxt =
|
|
213 | - VACall
|
|
214 | - (HsExpr GhcRn) Int -- In the third argument of function f
|
|
215 | - SrcSpan -- The SrcSpan of the application (f e1 e2 e3)
|
|
216 | - -- noSrcSpan if outermost; see Note [AppCtxt]
|
|
211 | +type AppCtxt = SrcSpan
|
|
212 | + -- VACall
|
|
213 | + -- (HsExpr GhcRn) Int -- In the third argument of function f
|
|
214 | + -- SrcSpan -- The SrcSpan of the application (f e1 e2 e3)
|
|
215 | + -- -- noSrcSpan if outermost; see Note [AppCtxt]
|
|
217 | 216 | |
218 | 217 | |
219 | 218 | {- Note [AppCtxt]
|
... | ... | @@ -244,21 +243,15 @@ a second time. |
244 | 243 | -}
|
245 | 244 | |
246 | 245 | appCtxtLoc :: AppCtxt -> SrcSpan
|
247 | -appCtxtLoc (VACall _ _ l) = l
|
|
246 | +appCtxtLoc l = l
|
|
248 | 247 | |
249 | 248 | insideExpansion :: AppCtxt -> Bool
|
250 | -insideExpansion ctxt = isGeneratedSrcSpan (appCtxtLoc ctxt)
|
|
251 | - |
|
252 | -appCtxtExpr :: AppCtxt -> HsExpr GhcRn
|
|
253 | -appCtxtExpr (VACall e _ _) = e
|
|
249 | +insideExpansion l = isGeneratedSrcSpan l
|
|
254 | 250 | |
255 | 251 | instance Outputable QLFlag where
|
256 | 252 | ppr DoQL = text "DoQL"
|
257 | 253 | ppr NoQL = text "NoQL"
|
258 | 254 | |
259 | -instance Outputable AppCtxt where
|
|
260 | - ppr (VACall f n l) = text "VACall" <+> int n <+> ppr f <+> ppr l
|
|
261 | - |
|
262 | 255 | type family XPass (p :: TcPass) where
|
263 | 256 | XPass 'TcpRn = 'Renamed
|
264 | 257 | XPass 'TcpInst = 'Renamed
|
... | ... | @@ -288,29 +281,15 @@ splitHsApps :: HsExpr GhcRn |
288 | 281 | -- This uses the TcM monad solely because we must run modFinalizers when looking
|
289 | 282 | -- through HsUntypedSplices
|
290 | 283 | -- (see Note [Looking through Template Haskell splices in splitHsApps]).
|
291 | -splitHsApps e = go e (top_ctxt 0 e) []
|
|
284 | +splitHsApps e = go e noSrcSpan []
|
|
292 | 285 | where
|
293 | - top_ctxt :: Int -> HsExpr GhcRn -> AppCtxt
|
|
294 | - -- Always returns VACall fun n_val_args noSrcSpan
|
|
295 | - -- to initialise the argument splitting in 'go'
|
|
296 | - -- See Note [AppCtxt]
|
|
297 | - top_ctxt n (HsPar _ fun) = top_lctxt n fun
|
|
298 | - top_ctxt n (HsPragE _ _ fun) = top_lctxt n fun
|
|
299 | - top_ctxt n (HsAppType _ fun _) = top_lctxt (n+1) fun
|
|
300 | - top_ctxt n (HsApp _ fun _) = top_lctxt (n+1) fun
|
|
301 | - top_ctxt n (XExpr (PopErrCtxt fun)) = top_ctxt n fun
|
|
302 | - top_ctxt n other_fun = VACall other_fun n noSrcSpan
|
|
303 | - |
|
304 | - top_lctxt :: Int -> LHsExpr GhcRn -> AppCtxt
|
|
305 | - top_lctxt n (L _ fun) = top_ctxt n fun
|
|
306 | - |
|
307 | 286 | go :: HsExpr GhcRn -> AppCtxt -> [HsExprArg 'TcpRn]
|
308 | 287 | -> TcM ((HsExpr GhcRn, AppCtxt), [HsExprArg 'TcpRn])
|
309 | 288 | -- Modify the AppCtxt as we walk inwards, so it describes the next argument
|
310 | - go (HsPar _ (L l fun)) ctxt args = go fun (set l ctxt) (EWrap (EPar ctxt) : args)
|
|
311 | - go (HsPragE _ p (L l fun)) ctxt args = go fun (set l ctxt) (EPrag ctxt p : args)
|
|
312 | - go (HsAppType _ (L l fun) ty) ctxt args = go fun (dec l ctxt) (mkETypeArg ctxt ty : args)
|
|
313 | - go (HsApp _ (L l fun) arg) ctxt args = go fun (dec l ctxt) (mkEValArg ctxt arg : args)
|
|
289 | + go (HsPar _ (L l fun)) ctxt args = go fun (locA l) (EWrap (EPar ctxt) : args)
|
|
290 | + go (HsPragE _ p (L l fun)) ctxt args = go fun (locA l) (EPrag ctxt p : args)
|
|
291 | + go (HsAppType _ (L l fun) ty) ctxt args = go fun ctxt (mkETypeArg ctxt ty : args)
|
|
292 | + go (HsApp _ (L l fun) arg) ctxt args = go fun ctxt (mkEValArg ctxt arg : args)
|
|
314 | 293 | |
315 | 294 | -- See Note [Looking through Template Haskell splices in splitHsApps]
|
316 | 295 | go e@(HsUntypedSplice splice_res splice) ctxt args
|
... | ... | @@ -319,14 +298,14 @@ splitHsApps e = go e (top_ctxt 0 e) [] |
319 | 298 | where
|
320 | 299 | ctxt' :: AppCtxt
|
321 | 300 | ctxt' = case splice of
|
322 | - HsUntypedSpliceExpr _ (L l _) -> set l ctxt -- l :: SrcAnn AnnListItem
|
|
323 | - HsQuasiQuote _ _ (L l _) -> set l ctxt -- l :: SrcAnn NoEpAnns
|
|
301 | + HsUntypedSpliceExpr _ (L l _) -> locA l -- l :: SrcAnn AnnListItem
|
|
302 | + HsQuasiQuote _ _ (L l _) -> locA l -- l :: SrcAnn NoEpAnns
|
|
324 | 303 | |
325 | 304 | -- See Note [Desugar OpApp in the typechecker]
|
326 | 305 | go e@(OpApp _ arg1 (L l op) arg2) _ args
|
327 | - = pure ( (op, VACall op 0 (locA l))
|
|
328 | - , mkEValArg (VACall op 1 generatedSrcSpan) arg1
|
|
329 | - : mkEValArg (VACall op 2 generatedSrcSpan) arg2
|
|
306 | + = pure ( (op, locA l)
|
|
307 | + , mkEValArg generatedSrcSpan arg1
|
|
308 | + : mkEValArg generatedSrcSpan arg2
|
|
330 | 309 | -- generatedSrcSpan because this the span of the call,
|
331 | 310 | -- and its hard to say exactly what that is
|
332 | 311 | : EWrap (EExpand e)
|
... | ... | @@ -337,11 +316,6 @@ splitHsApps e = go e (top_ctxt 0 e) [] |
337 | 316 | |
338 | 317 | go e ctxt args = pure ((e,ctxt), args)
|
339 | 318 | |
340 | - set :: EpAnn ann -> AppCtxt -> AppCtxt
|
|
341 | - set l (VACall f n _) = VACall f n (locA l)
|
|
342 | - |
|
343 | - dec :: EpAnn ann -> AppCtxt -> AppCtxt
|
|
344 | - dec l (VACall f n _) = VACall f (n-1) (locA l)
|
|
345 | 319 | |
346 | 320 | -- | Rebuild an application: takes a type-checked application head
|
347 | 321 | -- expression together with arguments in the form of typechecked 'HsExprArg's
|
... | ... | @@ -545,13 +519,12 @@ tcInferAppHead_maybe fun = |
545 | 519 | HsOverLit _ lit -> Just <$> tcInferOverLit lit
|
546 | 520 | _ -> return Nothing
|
547 | 521 | |
548 | -addHeadCtxt :: AppCtxt -> TcM a -> TcM a
|
|
549 | -addHeadCtxt fun_ctxt thing_inside
|
|
522 | +addHeadCtxt :: AppCtxt -> TcM a -> TcM a --TODO ANI: Why not just setSrcSpan?
|
|
523 | +addHeadCtxt fun_loc thing_inside
|
|
550 | 524 | | not (isGoodSrcSpan fun_loc) -- noSrcSpan => no arguments
|
551 | 525 | = thing_inside -- => context is already set
|
552 | 526 | | otherwise
|
553 | 527 | = setSrcSpan fun_loc thing_inside
|
554 | - where fun_loc = appCtxtLoc fun_ctxt
|
|
555 | 528 | |
556 | 529 | |
557 | 530 | {- *********************************************************************
|
... | ... | @@ -1730,6 +1730,7 @@ mkErrCtxt env ctxts |
1730 | 1730 | -- else go dbg 0 env ctxts
|
1731 | 1731 | = go False 0 env ctxts -- regular error ctx
|
1732 | 1732 | where
|
1733 | + go :: Bool -> Int -> TidyEnv -> [ErrCtxt] -> TcM [ErrCtxtMsg]
|
|
1733 | 1734 | go _ _ _ [] = return []
|
1734 | 1735 | go dbg n env ((is_landmark, ctxt) : ctxts)
|
1735 | 1736 | | is_landmark || n < mAX_CONTEXTS -- Too verbose || dbg
|
1 | - |
|
2 | 1 | T5439.hs:83:33: error: [GHC-83865]
|
3 | 2 | • Couldn't match expected type: Attempt (HElemOf rs)
|
4 | 3 | with actual type: Attempt (HHead (HDrop n0 l0))
|
... | ... | @@ -6,8 +5,7 @@ T5439.hs:83:33: error: [GHC-83865] |
6 | 5 | • Probable cause: ‘($)’ is applied to too few arguments
|
7 | 6 | In the second argument of ‘($)’, namely
|
8 | 7 | ‘inj $ Failure (e :: SomeException)’
|
9 | - In a stmt of a 'do' block:
|
|
10 | - c <- complete ev $ inj $ Failure (e :: SomeException)
|
|
8 | + In the expression: complete ev $ inj $ Failure (e :: SomeException)
|
|
11 | 9 | In the expression:
|
12 | 10 | do c <- complete ev $ inj $ Failure (e :: SomeException)
|
13 | 11 | return $ c || not first
|
... | ... | @@ -28,5 +26,5 @@ T5439.hs:83:39: error: [GHC-83865] |
28 | 26 | ‘Failure (e :: SomeException)’
|
29 | 27 | In the second argument of ‘($)’, namely
|
30 | 28 | ‘inj $ Failure (e :: SomeException)’
|
31 | - In a stmt of a 'do' block:
|
|
32 | - c <- complete ev $ inj $ Failure (e :: SomeException) |
|
29 | + In the expression: complete ev $ inj $ Failure (e :: SomeException)
|
|
30 | + |