Apoorv Ingle pushed to branch wip/spj-apporv-Oct24 at Glasgow Haskell Compiler / GHC
Commits:
-
9bf56452
by Apoorv Ingle at 2025-06-08T19:23:41-05:00
-
38dbe018
by Apoorv Ingle at 2025-06-08T19:23:58-05:00
5 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
Changes:
| ... | ... | @@ -5328,6 +5328,7 @@ pprArising :: CtLoc -> SDoc |
| 5328 | 5328 | -- We've done special processing for TypeEq, KindEq, givens
|
| 5329 | 5329 | pprArising ct_loc
|
| 5330 | 5330 | | suppress_origin = empty
|
| 5331 | + | in_generated_code = pprCtOrigin orig -- TODO ANI: maybe should go way
|
|
| 5331 | 5332 | | otherwise = pprCtOrigin orig
|
| 5332 | 5333 | where
|
| 5333 | 5334 | orig = ctLocOrigin ct_loc
|
| 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
|
| ... | ... | @@ -458,7 +457,7 @@ quickLookResultType :: TcRhoType -> ExpRhoType -> TcM () |
| 458 | 457 | quickLookResultType app_res_rho (Check exp_rho) = qlUnify app_res_rho exp_rho
|
| 459 | 458 | quickLookResultType _ _ = return ()
|
| 460 | 459 | |
| 461 | -finishApp :: (HsExpr GhcTc, AppCtxt) -> [HsExprArg 'TcpTc]
|
|
| 460 | +finishApp :: (HsExpr GhcTc, SrcSpan) -> [HsExprArg 'TcpTc]
|
|
| 462 | 461 | -> TcRhoType -> HsWrapper
|
| 463 | 462 | -> TcM (HsExpr GhcTc)
|
| 464 | 463 | -- Do final checks and wrap up the result
|
| ... | ... | @@ -473,7 +472,7 @@ finishApp tc_head@(tc_fun,_) tc_args app_res_rho res_wrap |
| 473 | 472 | ; return (mkHsWrap res_wrap res_expr) }
|
| 474 | 473 | |
| 475 | 474 | checkResultTy :: HsExpr GhcRn
|
| 476 | - -> (HsExpr GhcTc, AppCtxt) -- Head
|
|
| 475 | + -> (HsExpr GhcTc, SrcSpan) -- Head
|
|
| 477 | 476 | -> [HsExprArg p] -- Arguments, just error messages
|
| 478 | 477 | -> TcRhoType -- Inferred type of the application; zonked to
|
| 479 | 478 | -- expose foralls, but maybe not deeply instantiated
|
| ... | ... | @@ -522,33 +521,50 @@ checkResultTy rn_expr (tc_fun, fun_ctxt) inst_args app_res_rho (Check res_ty) |
| 522 | 521 | -- the source program; it was added by the renamer. See
|
| 523 | 522 | -- Note [Handling overloaded and rebindable constructs] in GHC.Rename.Expr
|
| 524 | 523 | perhaps_add_res_ty_ctxt thing_inside
|
| 525 | - | insideExpansion fun_ctxt
|
|
| 524 | + | isGeneratedSrcSpan fun_ctxt
|
|
| 526 | 525 | = thing_inside
|
| 527 | 526 | | otherwise
|
| 528 | 527 | = addFunResCtxt tc_fun inst_args app_res_rho (mkCheckExpType 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{} <- arg
|
|
| 547 | + = pos + 1
|
|
| 548 | + | EValArgQL{} <- arg
|
|
| 549 | + = 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 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,23 +593,26 @@ 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)
|
| 584 | 600 | , eaql_tc_fun = tc_head
|
| 601 | + , eaql_rn_fun = rn_fun
|
|
| 585 | 602 | , eaql_fun_ue = head_ue
|
| 586 | 603 | , eaql_args = inst_args
|
| 587 | 604 | , eaql_encl = arg_influences_enclosing_call
|
| 588 | 605 | , eaql_res_rho = app_res_rho })
|
| 589 | - = addArgCtxt ctxt larg $
|
|
| 606 | + = addArgCtxt pos fun larg $
|
|
| 590 | 607 | do { -- Expose QL results to tcSkolemise, as in EValArg case
|
| 591 | 608 | Scaled mult exp_arg_ty <- liftZonkM $ zonkScaledTcType sc_arg_ty
|
| 592 | 609 | |
| 593 | 610 | ; traceTc "tcEValArgQL {" (vcat [ text "app_res_rho:" <+> ppr app_res_rho
|
| 594 | 611 | , text "exp_arg_ty:" <+> ppr exp_arg_ty
|
| 595 | 612 | , text "args:" <+> ppr inst_args
|
| 596 | - , text "mult:" <+> ppr mult])
|
|
| 613 | + , text "mult:" <+> ppr mult
|
|
| 614 | + , text "fun" <+> ppr fun
|
|
| 615 | + , text "tc_head" <+> ppr tc_head])
|
|
| 597 | 616 | |
| 598 | 617 | ; ds_flag <- getDeepSubsumptionFlag
|
| 599 | 618 | ; (wrap, arg')
|
| ... | ... | @@ -611,7 +630,7 @@ tcValArg _ (EValArgQL { eaql_wanted = wanted |
| 611 | 630 | ; unless arg_influences_enclosing_call $ -- Don't repeat
|
| 612 | 631 | qlUnify app_res_rho exp_arg_rho -- the qlUnify
|
| 613 | 632 | |
| 614 | - ; tc_args <- tcValArgs DoQL inst_args
|
|
| 633 | + ; tc_args <- tcValArgs DoQL rn_fun inst_args
|
|
| 615 | 634 | ; app_res_rho <- liftZonkM $ zonkTcType app_res_rho
|
| 616 | 635 | ; res_wrap <- checkResultTy rn_expr tc_head inst_args
|
| 617 | 636 | app_res_rho (mkCheckExpType exp_arg_rho)
|
| ... | ... | @@ -656,14 +675,14 @@ tcInstFun :: QLFlag |
| 656 | 675 | -- Otherwise we do eager instantiation; in Fig 5 of the paper
|
| 657 | 676 | -- |-inst returns a rho-type
|
| 658 | 677 | -> CtOrigin
|
| 659 | - -> (HsExpr GhcTc, AppCtxt)
|
|
| 678 | + -> (HsExpr GhcTc, HsExpr GhcRn, SrcSpan)
|
|
| 660 | 679 | -> TcSigmaType -> [HsExprArg 'TcpRn]
|
| 661 | 680 | -> TcM ( [HsExprArg 'TcpInst]
|
| 662 | 681 | , TcSigmaType )
|
| 663 | 682 | -- This crucial function implements the |-inst judgement in Fig 4, plus the
|
| 664 | 683 | -- modification in Fig 5, of the QL paper:
|
| 665 | 684 | -- "A quick look at impredicativity" (ICFP'20).
|
| 666 | -tcInstFun do_ql inst_final fun_orig (tc_fun, fun_ctxt) fun_sigma rn_args
|
|
| 685 | +tcInstFun do_ql inst_final fun_orig (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args
|
|
| 667 | 686 | = do { traceTc "tcInstFun" (vcat [ text "origin" <+> ppr fun_orig
|
| 668 | 687 | , text "tc_fun" <+> ppr tc_fun
|
| 669 | 688 | , text "fun_sigma" <+> ppr fun_sigma
|
| ... | ... | @@ -845,7 +864,7 @@ tcInstFun do_ql inst_final fun_orig (tc_fun, fun_ctxt) fun_sigma rn_args |
| 845 | 864 | (Just $ HsExprTcThing tc_fun)
|
| 846 | 865 | (n_val_args, fun_sigma) fun_ty
|
| 847 | 866 | |
| 848 | - ; arg' <- quickLookArg do_ql ctxt arg arg_ty
|
|
| 867 | + ; arg' <- quickLookArg do_ql pos ctxt rn_fun arg arg_ty
|
|
| 849 | 868 | ; let acc' = arg' : addArgWrap wrap acc
|
| 850 | 869 | ; go (pos+1) acc' res_ty rest_args }
|
| 851 | 870 | |
| ... | ... | @@ -889,7 +908,7 @@ looks_like_type_arg EValArg{ ea_arg = L _ e } = |
| 889 | 908 | _ -> False
|
| 890 | 909 | looks_like_type_arg _ = False
|
| 891 | 910 | |
| 892 | -addArgCtxt :: AppCtxt -> LHsExpr GhcRn
|
|
| 911 | +addArgCtxt :: Int -> HsExpr GhcRn -> LHsExpr GhcRn
|
|
| 893 | 912 | -> TcM a -> TcM a
|
| 894 | 913 | -- There are 2 cases:
|
| 895 | 914 | -- 1. In the normal case, we add an informative context
|
| ... | ... | @@ -901,20 +920,18 @@ addArgCtxt :: AppCtxt -> LHsExpr GhcRn |
| 901 | 920 | -- Unless the arg is also a generated thing, in which case do nothing.
|
| 902 | 921 | -- See Note [Rebindable syntax and XXExprGhcRn] in GHC.Hs.Expr
|
| 903 | 922 | -- See Note [Expanding HsDo with XXExprGhcRn] in GHC.Tc.Gen.Do
|
| 904 | -addArgCtxt ctxt (L arg_loc arg) thing_inside
|
|
| 923 | +addArgCtxt arg_no fun (L arg_loc arg) thing_inside
|
|
| 905 | 924 | = do { in_generated_code <- inGeneratedCode
|
| 906 | 925 | ; traceTc "addArgCtxt" (vcat [ text "generated:" <+> ppr in_generated_code
|
| 907 | 926 | , text "arg: " <+> ppr arg
|
| 908 | 927 | , 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 }
|
|
| 928 | + ; if in_generated_code
|
|
| 929 | + then do setSrcSpanA arg_loc $
|
|
| 930 | + addExprCtxt arg $ -- Auto-suppressed if arg_loc is generated
|
|
| 931 | + thing_inside
|
|
| 932 | + else do setSrcSpanA arg_loc $
|
|
| 933 | + addErrCtxt (FunAppCtxt (FunAppCtxtExpr fun arg) arg_no) $
|
|
| 934 | + thing_inside }
|
|
| 918 | 935 | |
| 919 | 936 | {- *********************************************************************
|
| 920 | 937 | * *
|
| ... | ... | @@ -1690,21 +1707,21 @@ This turned out to be more subtle than I expected. Wrinkles: |
| 1690 | 1707 | |
| 1691 | 1708 | -}
|
| 1692 | 1709 | |
| 1693 | -quickLookArg :: QLFlag -> AppCtxt
|
|
| 1710 | +quickLookArg :: QLFlag -> Int -> SrcSpan -> HsExpr GhcRn
|
|
| 1694 | 1711 | -> LHsExpr GhcRn -- ^ Argument
|
| 1695 | 1712 | -> Scaled TcSigmaTypeFRR -- ^ Type expected by the function
|
| 1696 | 1713 | -> TcM (HsExprArg 'TcpInst)
|
| 1697 | 1714 | -- See Note [Quick Look at value arguments]
|
| 1698 | -quickLookArg NoQL ctxt larg orig_arg_ty
|
|
| 1715 | +quickLookArg NoQL _ ctxt _ larg orig_arg_ty
|
|
| 1699 | 1716 | = skipQuickLook ctxt larg orig_arg_ty
|
| 1700 | -quickLookArg DoQL ctxt larg orig_arg_ty
|
|
| 1717 | +quickLookArg DoQL pos ctxt fun larg orig_arg_ty
|
|
| 1701 | 1718 | = do { is_rho <- tcIsDeepRho (scaledThing orig_arg_ty)
|
| 1702 | 1719 | ; traceTc "qla" (ppr orig_arg_ty $$ ppr is_rho)
|
| 1703 | 1720 | ; if not is_rho
|
| 1704 | 1721 | then skipQuickLook ctxt larg orig_arg_ty
|
| 1705 | - else quickLookArg1 ctxt larg orig_arg_ty }
|
|
| 1722 | + else quickLookArg1 pos ctxt fun larg orig_arg_ty }
|
|
| 1706 | 1723 | |
| 1707 | -skipQuickLook :: AppCtxt -> LHsExpr GhcRn -> Scaled TcRhoType
|
|
| 1724 | +skipQuickLook :: SrcSpan -> LHsExpr GhcRn -> Scaled TcRhoType
|
|
| 1708 | 1725 | -> TcM (HsExprArg 'TcpInst)
|
| 1709 | 1726 | skipQuickLook ctxt larg arg_ty
|
| 1710 | 1727 | = return (EValArg { ea_ctxt = ctxt
|
| ... | ... | @@ -1745,12 +1762,12 @@ isGuardedTy ty |
| 1745 | 1762 | | Just {} <- tcSplitAppTy_maybe ty = True
|
| 1746 | 1763 | | otherwise = False
|
| 1747 | 1764 | |
| 1748 | -quickLookArg1 :: AppCtxt -> LHsExpr GhcRn
|
|
| 1765 | +quickLookArg1 :: Int -> SrcSpan -> HsExpr GhcRn -> LHsExpr GhcRn
|
|
| 1749 | 1766 | -> Scaled TcRhoType -- Deeply skolemised
|
| 1750 | 1767 | -> TcM (HsExprArg 'TcpInst)
|
| 1751 | 1768 | -- 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
|
|
| 1769 | +quickLookArg1 pos ctxt fun larg@(L _ arg) sc_arg_ty@(Scaled _ orig_arg_rho)
|
|
| 1770 | + = addArgCtxt pos fun larg $ -- Context needed for constraints
|
|
| 1754 | 1771 | -- generated by calls in arg
|
| 1755 | 1772 | do { ((rn_fun, fun_ctxt), rn_args) <- splitHsApps arg
|
| 1756 | 1773 | |
| ... | ... | @@ -1776,7 +1793,7 @@ quickLookArg1 ctxt larg@(L _ arg) sc_arg_ty@(Scaled _ orig_arg_rho) |
| 1776 | 1793 | ; do_ql <- wantQuickLook rn_fun
|
| 1777 | 1794 | ; ((inst_args, app_res_rho), wanted)
|
| 1778 | 1795 | <- captureConstraints $
|
| 1779 | - tcInstFun do_ql True (exprCtOrigin arg) (tc_fun, fun_ctxt) fun_sigma rn_args
|
|
| 1796 | + tcInstFun do_ql True (exprCtOrigin arg) (tc_fun, rn_fun, fun_ctxt) fun_sigma rn_args
|
|
| 1780 | 1797 | -- We must capture type-class and equality constraints here, but
|
| 1781 | 1798 | -- not equality constraints. See (QLA6) in Note [Quick Look at
|
| 1782 | 1799 | -- value arguments]
|
| ... | ... | @@ -1812,6 +1829,7 @@ quickLookArg1 ctxt larg@(L _ arg) sc_arg_ty@(Scaled _ orig_arg_rho) |
| 1812 | 1829 | , eaql_arg_ty = sc_arg_ty
|
| 1813 | 1830 | , eaql_larg = larg
|
| 1814 | 1831 | , eaql_tc_fun = tc_head
|
| 1832 | + , eaql_rn_fun = rn_fun
|
|
| 1815 | 1833 | , eaql_fun_ue = fun_ue
|
| 1816 | 1834 | , eaql_args = inst_args
|
| 1817 | 1835 | , eaql_wanted = wanted
|
| ... | ... | @@ -2187,7 +2205,7 @@ isTagToEnum :: HsExpr GhcTc -> Bool |
| 2187 | 2205 | isTagToEnum (HsVar _ (L _ fun_id)) = fun_id `hasKey` tagToEnumKey
|
| 2188 | 2206 | isTagToEnum _ = False
|
| 2189 | 2207 | |
| 2190 | -tcTagToEnum :: (HsExpr GhcTc, AppCtxt) -> [HsExprArg 'TcpTc]
|
|
| 2208 | +tcTagToEnum :: (HsExpr GhcTc, SrcSpan) -> [HsExprArg 'TcpTc]
|
|
| 2191 | 2209 | -> TcRhoType
|
| 2192 | 2210 | -> TcM (HsExpr GhcTc)
|
| 2193 | 2211 | -- tagToEnum# :: forall a. Int# -> a
|
| ... | ... | @@ -2314,7 +2332,7 @@ Wrinkle [Representation-polymorphic lambdas] in Note [Typechecking data construc |
| 2314 | 2332 | -- if the representation of its argument isn't known.
|
| 2315 | 2333 | --
|
| 2316 | 2334 | -- See Note [Eta-expanding rep-poly unlifted newtypes].
|
| 2317 | -rejectRepPolyNewtypes :: (HsExpr GhcTc, AppCtxt)
|
|
| 2335 | +rejectRepPolyNewtypes :: (HsExpr GhcTc, SrcSpan)
|
|
| 2318 | 2336 | -> TcRhoType
|
| 2319 | 2337 | -> TcM ()
|
| 2320 | 2338 | rejectRepPolyNewtypes (fun,_) app_res_rho = case fun of
|
| 1 | - |
|
| 2 | 1 | {-# LANGUAGE DataKinds #-}
|
| 3 | 2 | {-# LANGUAGE FlexibleContexts #-}
|
| 4 | 3 | {-# LANGUAGE ScopedTypeVariables #-}
|
| ... | ... | @@ -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,6 @@ |
| 17 | 16 | |
| 18 | 17 | module GHC.Tc.Gen.Head
|
| 19 | 18 | ( HsExprArg(..), TcPass(..), QLFlag(..), EWrap(..)
|
| 20 | - , AppCtxt(..), appCtxtLoc, insideExpansion, appCtxtExpr
|
|
| 21 | 19 | , splitHsApps, rebuildHsApps
|
| 22 | 20 | , addArgWrap, isHsValArg
|
| 23 | 21 | , leadingValArgs, isVisibleArg
|
| ... | ... | @@ -167,18 +165,19 @@ data TcPass = TcpRn -- Arguments decomposed |
| 167 | 165 | data HsExprArg (p :: TcPass) where -- See Note [HsExprArg]
|
| 168 | 166 | |
| 169 | 167 | -- Data constructor EValArg represents a value argument
|
| 170 | - EValArg :: { ea_ctxt :: AppCtxt
|
|
| 168 | + EValArg :: { ea_ctxt :: SrcSpan
|
|
| 171 | 169 | , ea_arg_ty :: !(XEVAType p)
|
| 172 | 170 | , ea_arg :: LHsExpr (GhcPass (XPass p)) }
|
| 173 | 171 | -> HsExprArg p
|
| 174 | 172 | |
| 175 | 173 | -- Data constructor EValArgQL represents an argument that has been
|
| 176 | 174 | -- partly-type-checked by Quick Look; see Note [EValArgQL]
|
| 177 | - EValArgQL :: { eaql_ctxt :: AppCtxt
|
|
| 175 | + EValArgQL :: { eaql_ctxt :: SrcSpan
|
|
| 178 | 176 | , eaql_arg_ty :: Scaled TcSigmaType -- Argument type expected by function
|
| 179 | 177 | , eaql_larg :: LHsExpr GhcRn -- Original application, for
|
| 180 | 178 | -- location and error msgs
|
| 181 | - , eaql_tc_fun :: (HsExpr GhcTc, AppCtxt) -- Typechecked head
|
|
| 179 | + , eaql_rn_fun :: HsExpr GhcRn -- Head of the argument if it is an application
|
|
| 180 | + , eaql_tc_fun :: (HsExpr GhcTc, SrcSpan) -- Typechecked head
|
|
| 182 | 181 | , eaql_fun_ue :: UsageEnv -- Usage environment of the typechecked head (QLA5)
|
| 183 | 182 | , eaql_args :: [HsExprArg 'TcpInst] -- Args: instantiated, not typechecked
|
| 184 | 183 | , eaql_wanted :: WantedConstraints
|
| ... | ... | @@ -187,12 +186,12 @@ data HsExprArg (p :: TcPass) where -- See Note [HsExprArg] |
| 187 | 186 | , eaql_res_rho :: TcRhoType } -- Result type of the application
|
| 188 | 187 | -> HsExprArg 'TcpInst -- Only exists in TcpInst phase
|
| 189 | 188 | |
| 190 | - ETypeArg :: { ea_ctxt :: AppCtxt
|
|
| 189 | + ETypeArg :: { ea_ctxt :: SrcSpan
|
|
| 191 | 190 | , ea_hs_ty :: LHsWcType GhcRn -- The type arg
|
| 192 | 191 | , ea_ty_arg :: !(XETAType p) } -- Kind-checked type arg
|
| 193 | 192 | -> HsExprArg p
|
| 194 | 193 | |
| 195 | - EPrag :: AppCtxt -> (HsPragE (GhcPass (XPass p))) -> HsExprArg p
|
|
| 194 | + EPrag :: SrcSpan -> (HsPragE (GhcPass (XPass p))) -> HsExprArg p
|
|
| 196 | 195 | EWrap :: EWrap -> HsExprArg p
|
| 197 | 196 | |
| 198 | 197 | type family XETAType (p :: TcPass) where -- Type arguments
|
| ... | ... | @@ -205,70 +204,25 @@ type family XEVAType (p :: TcPass) where -- Value arguments |
| 205 | 204 | |
| 206 | 205 | data QLFlag = DoQL | NoQL
|
| 207 | 206 | |
| 208 | -data EWrap = EPar AppCtxt
|
|
| 207 | +data EWrap = EPar SrcSpan
|
|
| 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]
|
|
| 217 | - |
|
| 218 | - |
|
| 219 | -{- Note [AppCtxt]
|
|
| 220 | -~~~~~~~~~~~~~~~~~
|
|
| 221 | -In a call (f e1 ... en), we pair up each argument with an AppCtxt. For
|
|
| 222 | -example, the AppCtxt for e3 allows us to say
|
|
| 223 | - "In the third argument of `f`"
|
|
| 224 | -See splitHsApps.
|
|
| 225 | - |
|
| 226 | -To do this we must take a quick look into the expression to find the
|
|
| 227 | -function at the head (`f` in this case) and how many arguments it
|
|
| 228 | -has. That is what the funcion top_ctxt does.
|
|
| 229 | - |
|
| 230 | -If the function part is an expansion, we don't want to look further.
|
|
| 231 | -For example, with rebindable syntax the expression
|
|
| 232 | - (if e1 then e2 else e3) e4 e5
|
|
| 233 | -might expand to
|
|
| 234 | - (ifThenElse e1 e2 e3) e4 e5
|
|
| 235 | -For e4 we an AppCtxt that says "In the first argument of (if ...)",
|
|
| 236 | -not "In the fourth argument of ifThenElse". So top_ctxt stops
|
|
| 237 | -at expansions.
|
|
| 238 | - |
|
| 239 | -The SrcSpan in an AppCtxt describes the whole call. We initialise
|
|
| 240 | -it to noSrcSpan, because splitHsApps deals in HsExpr not LHsExpr, so
|
|
| 241 | -we don't have a span for the whole call; and we use that noSrcSpan in
|
|
| 242 | -GHC.Tc.Gen.App.tcInstFun (set_fun_ctxt) to avoid pushing "In the expression `f`"
|
|
| 243 | -a second time.
|
|
| 244 | --}
|
|
| 245 | - |
|
| 246 | -appCtxtLoc :: AppCtxt -> SrcSpan
|
|
| 247 | -appCtxtLoc (VACall _ _ l) = l
|
|
| 248 | - |
|
| 249 | -insideExpansion :: AppCtxt -> Bool
|
|
| 250 | -insideExpansion ctxt = isGeneratedSrcSpan (appCtxtLoc ctxt)
|
|
| 251 | - |
|
| 252 | -appCtxtExpr :: AppCtxt -> HsExpr GhcRn
|
|
| 253 | -appCtxtExpr (VACall e _ _) = e
|
|
| 254 | 211 | |
| 255 | 212 | instance Outputable QLFlag where
|
| 256 | 213 | ppr DoQL = text "DoQL"
|
| 257 | 214 | ppr NoQL = text "NoQL"
|
| 258 | 215 | |
| 259 | -instance Outputable AppCtxt where
|
|
| 260 | - ppr (VACall f n l) = text "VACall" <+> int n <+> ppr f <+> ppr l
|
|
| 261 | - |
|
| 262 | 216 | type family XPass (p :: TcPass) where
|
| 263 | 217 | XPass 'TcpRn = 'Renamed
|
| 264 | 218 | XPass 'TcpInst = 'Renamed
|
| 265 | 219 | XPass 'TcpTc = 'Typechecked
|
| 266 | 220 | |
| 267 | -mkEValArg :: AppCtxt -> LHsExpr GhcRn -> HsExprArg 'TcpRn
|
|
| 221 | +mkEValArg :: SrcSpan -> LHsExpr GhcRn -> HsExprArg 'TcpRn
|
|
| 268 | 222 | mkEValArg ctxt e = EValArg { ea_arg = e, ea_ctxt = ctxt
|
| 269 | 223 | , ea_arg_ty = noExtField }
|
| 270 | 224 | |
| 271 | -mkETypeArg :: AppCtxt -> LHsWcType GhcRn -> HsExprArg 'TcpRn
|
|
| 225 | +mkETypeArg :: SrcSpan -> LHsWcType GhcRn -> HsExprArg 'TcpRn
|
|
| 272 | 226 | mkETypeArg ctxt hs_ty =
|
| 273 | 227 | ETypeArg { ea_ctxt = ctxt
|
| 274 | 228 | , ea_hs_ty = hs_ty
|
| ... | ... | @@ -281,52 +235,38 @@ addArgWrap wrap args |
| 281 | 235 | |
| 282 | 236 | |
| 283 | 237 | splitHsApps :: HsExpr GhcRn
|
| 284 | - -> TcM ( (HsExpr GhcRn, AppCtxt) -- Head
|
|
| 238 | + -> TcM ( (HsExpr GhcRn, SrcSpan) -- Head
|
|
| 285 | 239 | , [HsExprArg 'TcpRn]) -- Args
|
| 286 | 240 | -- See Note [splitHsApps].
|
| 287 | 241 | --
|
| 288 | 242 | -- This uses the TcM monad solely because we must run modFinalizers when looking
|
| 289 | 243 | -- through HsUntypedSplices
|
| 290 | 244 | -- (see Note [Looking through Template Haskell splices in splitHsApps]).
|
| 291 | -splitHsApps e = go e (top_ctxt 0 e) []
|
|
| 245 | +splitHsApps e = go e noSrcSpan []
|
|
| 292 | 246 | 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 | - go :: HsExpr GhcRn -> AppCtxt -> [HsExprArg 'TcpRn]
|
|
| 308 | - -> TcM ((HsExpr GhcRn, AppCtxt), [HsExprArg 'TcpRn])
|
|
| 309 | - -- 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)
|
|
| 247 | + go :: HsExpr GhcRn -> SrcSpan -> [HsExprArg 'TcpRn]
|
|
| 248 | + -> TcM ((HsExpr GhcRn, SrcSpan), [HsExprArg 'TcpRn])
|
|
| 249 | + -- Modify the SrcSpan as we walk inwards, so it describes the next argument
|
|
| 250 | + go (HsPar _ (L l fun)) ctxt args = go fun (locA l) (EWrap (EPar ctxt) : args)
|
|
| 251 | + go (HsPragE _ p (L l fun)) ctxt args = go fun (locA l) (EPrag ctxt p : args)
|
|
| 252 | + go (HsAppType _ (L l fun) ty) ctxt args = go fun (locA l) (mkETypeArg ctxt ty : args)
|
|
| 253 | + go (HsApp _ (L l fun) arg) ctxt args = go fun (locA l) (mkEValArg ctxt arg : args)
|
|
| 314 | 254 | |
| 315 | 255 | -- See Note [Looking through Template Haskell splices in splitHsApps]
|
| 316 | - go e@(HsUntypedSplice splice_res splice) ctxt args
|
|
| 256 | + go e@(HsUntypedSplice splice_res splice) _ args
|
|
| 317 | 257 | = do { fun <- getUntypedSpliceBody splice_res
|
| 318 | 258 | ; go fun ctxt' (EWrap (EExpand e) : args) }
|
| 319 | 259 | where
|
| 320 | - ctxt' :: AppCtxt
|
|
| 260 | + ctxt' :: SrcSpan
|
|
| 321 | 261 | ctxt' = case splice of
|
| 322 | - HsUntypedSpliceExpr _ (L l _) -> set l ctxt -- l :: SrcAnn AnnListItem
|
|
| 323 | - HsQuasiQuote _ _ (L l _) -> set l ctxt -- l :: SrcAnn NoEpAnns
|
|
| 262 | + HsUntypedSpliceExpr _ (L l _) -> locA l -- l :: SrcAnn AnnListItem
|
|
| 263 | + HsQuasiQuote _ _ (L l _) -> locA l -- l :: SrcAnn NoEpAnns
|
|
| 324 | 264 | |
| 325 | 265 | -- See Note [Desugar OpApp in the typechecker]
|
| 326 | 266 | 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
|
|
| 267 | + = pure ( (op, locA l)
|
|
| 268 | + , mkEValArg generatedSrcSpan arg1
|
|
| 269 | + : mkEValArg generatedSrcSpan arg2
|
|
| 330 | 270 | -- generatedSrcSpan because this the span of the call,
|
| 331 | 271 | -- and its hard to say exactly what that is
|
| 332 | 272 | : EWrap (EExpand e)
|
| ... | ... | @@ -337,11 +277,6 @@ splitHsApps e = go e (top_ctxt 0 e) [] |
| 337 | 277 | |
| 338 | 278 | go e ctxt args = pure ((e,ctxt), args)
|
| 339 | 279 | |
| 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 | 280 | |
| 346 | 281 | -- | Rebuild an application: takes a type-checked application head
|
| 347 | 282 | -- expression together with arguments in the form of typechecked 'HsExprArg's
|
| ... | ... | @@ -351,7 +286,7 @@ splitHsApps e = go e (top_ctxt 0 e) [] |
| 351 | 286 | -- representation-polymorphic unlifted newtypes have been eta-expanded.
|
| 352 | 287 | --
|
| 353 | 288 | -- See Note [Eta-expanding rep-poly unlifted newtypes].
|
| 354 | -rebuildHsApps :: (HsExpr GhcTc, AppCtxt)
|
|
| 289 | +rebuildHsApps :: (HsExpr GhcTc, SrcSpan)
|
|
| 355 | 290 | -- ^ the function being applied
|
| 356 | 291 | -> [HsExprArg 'TcpTc]
|
| 357 | 292 | -- ^ the arguments to the function
|
| ... | ... | @@ -372,7 +307,7 @@ rebuildHsApps (fun, ctxt) (arg : args) |
| 372 | 307 | EWrap (EHsWrap wrap)
|
| 373 | 308 | -> rebuildHsApps (mkHsWrap wrap fun, ctxt) args
|
| 374 | 309 | where
|
| 375 | - lfun = L (noAnnSrcSpan $ appCtxtLoc ctxt) fun
|
|
| 310 | + lfun = L (noAnnSrcSpan ctxt) fun
|
|
| 376 | 311 | |
| 377 | 312 | isHsValArg :: HsExprArg id -> Bool
|
| 378 | 313 | isHsValArg (EValArg {}) = True
|
| ... | ... | @@ -505,7 +440,7 @@ Wrinkle (UTS1): |
| 505 | 440 | * *
|
| 506 | 441 | ********************************************************************* -}
|
| 507 | 442 | |
| 508 | -tcInferAppHead :: (HsExpr GhcRn, AppCtxt)
|
|
| 443 | +tcInferAppHead :: (HsExpr GhcRn, SrcSpan)
|
|
| 509 | 444 | -> TcM (HsExpr GhcTc, TcSigmaType)
|
| 510 | 445 | -- Infer type of the head of an application
|
| 511 | 446 | -- i.e. the 'f' in (f e1 ... en)
|
| ... | ... | @@ -545,13 +480,12 @@ tcInferAppHead_maybe fun = |
| 545 | 480 | HsOverLit _ lit -> Just <$> tcInferOverLit lit
|
| 546 | 481 | _ -> return Nothing
|
| 547 | 482 | |
| 548 | -addHeadCtxt :: AppCtxt -> TcM a -> TcM a
|
|
| 549 | -addHeadCtxt fun_ctxt thing_inside
|
|
| 483 | +addHeadCtxt :: SrcSpan -> TcM a -> TcM a --TODO ANI: Why not just setSrcSpan?
|
|
| 484 | +addHeadCtxt fun_loc thing_inside
|
|
| 550 | 485 | | not (isGoodSrcSpan fun_loc) -- noSrcSpan => no arguments
|
| 551 | 486 | = thing_inside -- => context is already set
|
| 552 | 487 | | otherwise
|
| 553 | 488 | = setSrcSpan fun_loc thing_inside
|
| 554 | - where fun_loc = appCtxtLoc fun_ctxt
|
|
| 555 | 489 | |
| 556 | 490 | |
| 557 | 491 | {- *********************************************************************
|
| ... | ... | @@ -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
|