[Git][ghc/ghc][wip/expansions-appdo] add location information to expanded expression

Apoorv Ingle (@ani) gitlab at gitlab.haskell.org
Mon Jul 29 03:40:24 UTC 2024



Apoorv Ingle pushed to branch wip/expansions-appdo at Glasgow Haskell Compiler / GHC


Commits:
13149cd7 by Apoorv Ingle at 2024-07-28T22:39:55-05:00
add location information to expanded expression

- - - - -


7 changed files:

- compiler/GHC/Hs/Expr.hs
- compiler/GHC/HsToCore/Quote.hs
- compiler/GHC/Rename/Expr.hs
- compiler/GHC/Tc/Gen/App.hs
- compiler/GHC/Tc/Gen/Do.hs
- compiler/GHC/Tc/Gen/Expr.hs
- compiler/GHC/Tc/Gen/Head.hs


Changes:

=====================================
compiler/GHC/Hs/Expr.hs
=====================================
@@ -476,7 +476,7 @@ type instance XXExpr GhcTc = XXExprGhcTc
 -- | The different source constructs that we use to instantiate the "original" field
 --   in an `XXExprGhcRn original expansion`
 --   See Note [Handling overloaded and rebindable constructs] in `GHC.Rename.Expr`
-data HsThingRn = OrigExpr (HsExpr GhcRn)                -- ^ The source, user written, expression
+data HsThingRn = OrigExpr (HsExpr GhcRn)               -- ^ The source, user written, expression
                | OrigStmt (ExprLStmt GhcRn) HsDoFlavour -- ^ which kind of do-block did this statement come from
                | OrigPat  (LPat GhcRn)              -- ^ The source, user written, pattern
                           HsDoFlavour               -- ^ which kind of do-block did this statement come from
@@ -494,7 +494,7 @@ isHsThingRnPat _ = False
 
 data XXExprGhcRn
   = ExpandedThingRn { xrn_orig     :: HsThingRn       -- The original source thing to be used for error messages
-                    , xrn_expanded :: HsExpr GhcRn    -- The compiler generated expanded thing
+                    , xrn_expanded :: LHsExpr GhcRn   -- The expanded thing can be user written or compiler generated
                     , xrn_doTcApp  :: Bool    }       -- A Hint to the type checker of how to proceed
                                                       --      True  <=> use GHC.Tc.Gen.Expr.tcApp on xrn_expanded
                                                       --      False <=> use GHC.Tc.Gen.Expr.tcExpr on xrn_expanded
@@ -519,7 +519,7 @@ mkPopErrCtxtExprAt loc a = L loc $ mkPopErrCtxtExpr a
 --   expanded expressions.
 mkExpandedExpr
   :: HsExpr GhcRn         -- ^ source expression
-  -> HsExpr GhcRn         -- ^ expanded expression
+  -> LHsExpr GhcRn        -- ^ expanded expression
   -> HsExpr GhcRn         -- ^ suitably wrapped 'XXExprGhcRn'
 mkExpandedExpr oExpr eExpr = XExpr (ExpandedThingRn { xrn_orig = OrigExpr oExpr
                                                     , xrn_expanded = eExpr
@@ -532,7 +532,7 @@ mkExpandedStmt
   :: ExprLStmt GhcRn      -- ^ source statement
   -> HsDoFlavour          -- ^ source statement do flavour
   -> Bool                 -- ^ should this be type checked using tcApp?
-  -> HsExpr GhcRn         -- ^ expanded expression
+  -> LHsExpr GhcRn        -- ^ expanded expression
   -> HsExpr GhcRn         -- ^ suitably wrapped 'XXExprGhcRn'
 mkExpandedStmt oStmt flav doTcApp eExpr = XExpr (ExpandedThingRn { xrn_orig = OrigStmt oStmt flav
                                                                  , xrn_expanded = eExpr
@@ -542,7 +542,7 @@ mkExpandedPatRn
   :: LPat   GhcRn             -- ^ source pattern
   -> HsDoFlavour              -- ^ source statement do flavour
   -> Maybe (ExprLStmt GhcRn)  -- ^ pattern statement origin
-  -> HsExpr GhcRn             -- ^ expanded expression
+  -> LHsExpr GhcRn            -- ^ expanded expression
   -> HsExpr GhcRn             -- ^ suitably wrapped 'XXExprGhcRn'
 mkExpandedPatRn oPat flav mb_stmt eExpr = XExpr (ExpandedThingRn { xrn_orig = OrigPat oPat flav mb_stmt
                                                                  , xrn_expanded = eExpr
@@ -553,17 +553,17 @@ mkExpandedPatRn oPat flav mb_stmt eExpr = XExpr (ExpandedThingRn { xrn_orig = Or
 --   expanded expression and associate it with a provided location
 mkExpandedStmtAt
   :: Bool                 -- ^ Wrap this expansion with a pop?
-  -> SrcSpanAnnA          -- ^ Location for the expansion expression
   -> ExprLStmt GhcRn      -- ^ source statement
   -> HsDoFlavour          -- ^ the flavour of the statement
   -> Bool                 -- ^ should type check with tcApp?
-  -> HsExpr GhcRn         -- ^ expanded expression
+  -> LHsExpr GhcRn        -- ^ expanded expression
   -> LHsExpr GhcRn        -- ^ suitably wrapped located 'XXExprGhcRn'
-mkExpandedStmtAt addPop loc oStmt flav doTcApp eExpr
+mkExpandedStmtAt addPop oStmt flav doTcApp eExpr
   | addPop
-  = mkPopErrCtxtExprAt loc (L loc $ mkExpandedStmt oStmt flav doTcApp eExpr)
+  = L (noAnnSrcSpan generatedSrcSpan) (mkPopErrCtxtExpr (L (noAnnSrcSpan generatedSrcSpan)
+                                                         $ mkExpandedStmt oStmt flav doTcApp eExpr))
   | otherwise
-  = L loc $ mkExpandedStmt oStmt flav doTcApp eExpr
+  = L (noAnnSrcSpan generatedSrcSpan) (mkExpandedStmt oStmt flav doTcApp eExpr)
 
 data XXExprGhcTc
   = WrapExpr        -- Type and evidence application and abstractions
@@ -572,7 +572,7 @@ data XXExprGhcTc
   | ExpandedThingTc                         -- See Note [Rebindable syntax and XXExprGhcRn]
                                             -- See Note [Expanding HsDo with XXExprGhcRn] in `GHC.Tc.Gen.Do`
          { xtc_orig     :: HsThingRn        -- The original user written thing
-         , xtc_expanded :: HsExpr GhcTc }   -- The expanded typechecked expression
+         , xtc_expanded :: HsExpr GhcTc }  -- The expanded typechecked expression
 
   | ConLikeTc      -- Result of typechecking a data-con
                    -- See Note [Typechecking data constructors] in
@@ -607,7 +607,7 @@ mkExpandedExprTc oExpr eExpr = XExpr (ExpandedThingTc (OrigExpr oExpr) eExpr)
 --   expanded typechecked expression.
 mkExpandedStmtTc
   :: ExprLStmt GhcRn        -- ^ source do statement
-  -> HsDoFlavour
+  -> HsDoFlavour            -- ^ the flavour of this statement
   -> HsExpr GhcTc           -- ^ expanded typechecked expression
   -> HsExpr GhcTc           -- ^ suitably wrapped 'XXExprGhcRn'
 mkExpandedStmtTc oStmt flav eExpr = XExpr (ExpandedThingTc (OrigStmt oStmt flav) eExpr)


=====================================
compiler/GHC/HsToCore/Quote.hs
=====================================
@@ -1683,7 +1683,7 @@ repE (HsProjection _ xs) = repProjection (fmap (field_label . unLoc . dfoLabel .
 repE (HsEmbTy _ t) = do
   t1 <- repLTy (hswc_body t)
   rep2 typeEName [unC t1]
-repE e@(XExpr (ExpandedThingRn o x _))
+repE e@(XExpr (ExpandedThingRn o (L _ x) _))
   | OrigExpr e <- o
   = do { rebindable_on <- lift $ xoptM LangExt.RebindableSyntax
        ; if rebindable_on  -- See Note [Quotation and rebindable syntax]


=====================================
compiler/GHC/Rename/Expr.hs
=====================================
@@ -360,7 +360,7 @@ rnExpr (HsUnboundVar _ v)
 rnExpr (HsOverLabel src v)
   = do { (from_label, fvs) <- lookupSyntaxName fromLabelClassOpName
        ; return ( mkExpandedExpr (HsOverLabel src v) $
-                  HsAppType noExtField (genLHsVar from_label) hs_ty_arg
+                  wrapGenSpan (HsAppType noExtField (genLHsVar from_label) hs_ty_arg)
                 , fvs ) }
   where
     hs_ty_arg = mkEmptyWildCardBndrs $ wrapGenSpan $
@@ -435,7 +435,7 @@ rnExpr (HsGetField _ e f)
       ; let f' = rnDotFieldOcc f
       ; return ( mkExpandedExpr
                    (HsGetField noExtField e f')
-                   (mkGetField getField e (fmap (unLoc . dfoLabel) f'))
+                   (wrapGenSpan (mkGetField getField e (fmap (unLoc . dfoLabel) f')))
                , fv_e `plusFV` fv_getField ) }
 
 rnExpr (HsProjection _ fs)
@@ -444,7 +444,7 @@ rnExpr (HsProjection _ fs)
        ; let fs' = fmap rnDotFieldOcc fs
        ; return ( mkExpandedExpr
                     (HsProjection noExtField fs')
-                    (mkProjection getField circ (fmap (fmap (unLoc . dfoLabel)) fs'))
+                    (wrapGenSpan ((mkProjection getField circ (fmap (fmap (unLoc . dfoLabel)) fs'))))
                 , unitFV circ `plusFV` fv_getField) }
 
 ------------------------------------------
@@ -516,7 +516,7 @@ rnExpr (ExplicitList _ exps)
              lit_n    = mkIntegralLit (length exps)
              hs_lit   = genHsIntegralLit lit_n
              exp_list = genHsApps' (L (noAnnSrcSpan loc) from_list_n_name) [hs_lit, wrapGenSpan rn_list]
-       ; return ( mkExpandedExpr rn_list exp_list
+       ; return ( mkExpandedExpr rn_list (wrapGenSpan exp_list)
                 , fvs `plusFV` fvs') } }
 
 rnExpr (ExplicitTuple _ tup_args boxity)
@@ -578,7 +578,7 @@ rnExpr (RecordUpd { rupd_expr = L l expr, rupd_flds = rbinds })
                             , olRecUpdFields  = us }
             ; return ( mkExpandedExpr
                          (RecordUpd noExtField (L l e) upd_flds)
-                         (mkRecordDotUpd getField setField (L l e) us)
+                         (wrapGenSpan $ mkRecordDotUpd getField setField (L l e) us)
                         , plusFVs [fv_getField, fv_setField, fv_e, fv_us] ) }
 
 rnExpr (HsRecSel x _) = dataConCantHappen x
@@ -669,17 +669,17 @@ rnSection :: HsExpr GhcPs -> RnM (HsExpr GhcRn, FreeVars)
 -- See Note [Parsing sections] in GHC.Parser
 -- Also see Note [Handling overloaded and rebindable constructs]
 
-rnSection section@(SectionR x op expr)
+rnSection section@(SectionR x op@(L op_loc _) expr@(L expr_loc _))
   -- See Note [Left and right sections]
   = do  { (op', fvs_op)     <- rnLExpr op
         ; (expr', fvs_expr) <- rnLExpr expr
         ; checkSectionPrec InfixR section op' expr'
         ; let rn_section = SectionR x op' expr'
-              ds_section = genHsApps rightSectionName [op',expr']
+              ds_section = L (combineSrcSpansA op_loc expr_loc) (genHsApps rightSectionName [op',expr'])
         ; return ( mkExpandedExpr rn_section ds_section
                  , fvs_op `plusFV` fvs_expr) }
 
-rnSection section@(SectionL x expr op)
+rnSection section@(SectionL x expr@(L expr_loc _) op@(L op_loc _))
   -- See Note [Left and right sections]
   = do  { (expr', fvs_expr) <- rnLExpr expr
         ; (op', fvs_op)     <- rnLExpr op
@@ -691,7 +691,7 @@ rnSection section@(SectionL x expr op)
                 | postfix_ops = HsApp noExtField op' expr'
                 | otherwise   = genHsApps leftSectionName
                                    [wrapGenSpan $ HsApp noExtField op' expr']
-        ; return ( mkExpandedExpr rn_section ds_section
+        ; return ( mkExpandedExpr rn_section (L (combineSrcSpansA expr_loc op_loc) ds_section)
                  , fvs_op `plusFV` fvs_expr) }
 
 rnSection other = pprPanic "rnSection" (ppr other)
@@ -2806,7 +2806,7 @@ rnHsIf p b1 b2
               -> return (rn_if, fvs_if)
 
             Just ite_name   -- Rebindable-syntax case
-              -> do { let ds_if = genHsApps ite_name [p', b1', b2']
+              -> do { let ds_if = wrapGenSpan (genHsApps ite_name [p', b1', b2'])
                           fvs   = plusFVs [fvs_if, unitFV ite_name]
                     ; return (mkExpandedExpr rn_if ds_if, fvs) } }
 


=====================================
compiler/GHC/Tc/Gen/App.hs
=====================================
@@ -815,9 +815,7 @@ tcInstFun do_ql inst_final (tc_fun, fun_ctxt) fun_sigma rn_args
     -- Rule IARG from Fig 4 of the QL paper:
     go1 pos acc fun_ty
         (EValArg { ea_arg = arg, ea_ctxt = ctxt } : rest_args)
-      = do { let herald = case fun_ctxt of
-                             VAExpansion (OrigStmt{}) _ _ -> ExpectedFunTySyntaxOp DoOrigin tc_fun
-                             _ ->  ExpectedFunTyArg (HsExprTcThing tc_fun) (unLoc arg)
+      = do { let herald = ExpectedFunTyArg (HsExprTcThing tc_fun) (unLoc arg)
            ; (wrap, arg_ty, res_ty) <-
                 -- NB: matchActualFunTy does the rep-poly check.
                 -- For example, suppose we have f :: forall r (a::TYPE r). a -> Int
@@ -874,7 +872,7 @@ looks_like_type_arg _ = False
 
 addArgCtxt :: AppCtxt -> LHsExpr GhcRn
            -> TcM a -> TcM a
--- There are four cases:
+-- There are three cases:
 -- 1. In the normal case, we add an informative context
 --          "In the third argument of f, namely blah"
 -- 2. If we are deep inside generated code (`isGeneratedCode` is `True`)
@@ -883,18 +881,10 @@ addArgCtxt :: AppCtxt -> LHsExpr GhcRn
 --          "In the expression: arg"
 --   Unless the arg is also a generated thing, in which case do nothing.
 --   See Note [Rebindable syntax and XXExprGhcRn] in GHC.Hs.Expr
--- 3. We are in an expanded `do`-block's non-bind statement
+-- 3. We are in an expanded `do`-block's statement
 --    we simply add the statement context
 --       "In the statement of the `do`-block .."
--- 4. We are in an expanded do block's bind statement
---    a. Then either we are typechecking the first argument of the bind which is user located
---       so we set the location to be that of the argument
---    b. Or, we are typechecking the second argument which would be a generated lambda
---       so we set the location to be whatever the location in the context is
 --  See Note [Expanding HsDo with XXExprGhcRn] in GHC.Tc.Gen.Do
--- For future: we need a cleaner way of doing this bit of adding the right error context.
--- There is a delicate dance of looking at source locations and reconstructing
--- whether the piece of code is a `do`-expanded code or some other expanded code.
 addArgCtxt ctxt (L arg_loc arg) thing_inside
   = do { in_generated_code <- inGeneratedCode
        ; case ctxt of
@@ -903,18 +893,10 @@ addArgCtxt ctxt (L arg_loc arg) thing_inside
                      addErrCtxt (funAppCtxt fun arg arg_no) $
                      thing_inside
 
-           VAExpansion (OrigStmt (L _ stmt@(BindStmt {})) flav) _ loc
-             | isGeneratedSrcSpan (locA arg_loc) -- This arg is the second argument to generated (>>=)
-             -> setSrcSpan loc $
-                  addStmtCtxt stmt flav $
-                  thing_inside
-             | otherwise                         -- This arg is the first argument to generated (>>=)
-             -> setSrcSpanA arg_loc $
-                  addStmtCtxt stmt flav $
-                  thing_inside
            VAExpansion (OrigStmt (L loc stmt) flav) _ _
              -> setSrcSpanA loc $
                   addStmtCtxt stmt flav $
+                  setSrcSpanA arg_loc $
                   thing_inside
 
            _ -> setSrcSpanA arg_loc $


=====================================
compiler/GHC/Tc/Gen/Do.hs
=====================================
@@ -73,13 +73,13 @@ expand_do_stmts _ _ (stmt@(L _ (ParStmt {})):_) =
   pprPanic "expand_do_stmts: ParStmt" $ ppr stmt
   -- handeled by `GHC.Tc.Gen.Match.tcLcStmt`
 
-expand_do_stmts addPop flav [stmt@(L loc (LastStmt _ (L body_loc body) _ ret_expr))]
+expand_do_stmts addPop flav [stmt@(L _ (LastStmt _ (L body_loc body) _ ret_expr))]
 -- See  Note [Expanding HsDo with XXExprGhcRn] Equation (5) below
 -- last statement of a list comprehension, needs to explicitly return it
 -- See `checkLastStmt` and `Syntax.Expr.StmtLR.LastStmt`
    | NoSyntaxExprRn <- ret_expr
    -- Last statement is just body if we are not in ListComp context. See Syntax.Expr.LastStmt
-   = return $ mkExpandedStmtAt addPop loc stmt flav False body
+   = return $ mkExpandedStmtAt addPop stmt flav False (L body_loc body)
 
    | SyntaxExprRn ret <- ret_expr
    --
@@ -87,18 +87,18 @@ expand_do_stmts addPop flav [stmt@(L loc (LastStmt _ (L body_loc body) _ ret_exp
    --               return e  ~~> return e
    -- to make T18324 work
    = do let expansion = genHsApp ret (L body_loc body)
-        return $ mkExpandedStmtAt addPop loc stmt flav False expansion
+        return $ mkExpandedStmtAt addPop stmt flav False (L body_loc expansion)
 
-expand_do_stmts addPop doFlavour (stmt@(L loc (LetStmt _ bs)) : lstmts) =
+expand_do_stmts addPop doFlavour (stmt@(L _ (LetStmt _ bs)) : lstmts) =
 -- See  Note [Expanding HsDo with XXExprGhcRn] Equation (3) below
 --                      stmts ~~> stmts'
 --    ------------------------------------------------
 --       let x = e ; stmts ~~> let x = e in stmts'
   do expand_stmts <- expand_do_stmts True doFlavour lstmts
      let expansion = genHsLet bs expand_stmts
-     return $ mkExpandedStmtAt addPop loc stmt doFlavour False expansion
+     return $ mkExpandedStmtAt addPop stmt doFlavour False (wrapGenSpan expansion)
 
-expand_do_stmts addPop doFlavour (stmt@(L loc (BindStmt xbsrn pat e)): lstmts)
+expand_do_stmts addPop doFlavour (stmt@(L _ (BindStmt xbsrn pat e)): lstmts)
   | SyntaxExprRn bind_op <- xbsrn_bindOp xbsrn
   , fail_op              <- xbsrn_failOp xbsrn
 -- See  Note [Expanding HsDo with XXExprGhcRn] Equation (2) below
@@ -112,12 +112,12 @@ expand_do_stmts addPop doFlavour (stmt@(L loc (BindStmt xbsrn pat e)): lstmts)
        let expansion = genHsExpApps bind_op  -- (>>=)
                        [ e
                        , failable_expr ]
-       return $ mkExpandedStmtAt addPop loc stmt doFlavour True expansion
+       return $ mkExpandedStmtAt addPop stmt doFlavour True (wrapGenSpan expansion)
 
   | otherwise
   = pprPanic "expand_do_stmts: The impossible happened, missing bind operator from renamer" (text "stmt" <+> ppr  stmt)
 
-expand_do_stmts addPop doFlavour (stmt@(L loc (BodyStmt _ e (SyntaxExprRn then_op) _)) : lstmts) =
+expand_do_stmts addPop doFlavour (stmt@(L _ (BodyStmt _ e (SyntaxExprRn then_op) _)) : lstmts) =
 -- See Note [BodyStmt] in Language.Haskell.Syntax.Expr
 -- See  Note [Expanding HsDo with XXExprGhcRn] Equation (1) below
 --              stmts ~~> stmts'
@@ -127,7 +127,7 @@ expand_do_stmts addPop doFlavour (stmt@(L loc (BodyStmt _ e (SyntaxExprRn then_o
      let expansion = genHsExpApps then_op  -- (>>)
                                   [ e
                                   , expand_stmts_expr ]
-     return $ mkExpandedStmtAt addPop loc stmt doFlavour True expansion
+     return $ mkExpandedStmtAt addPop stmt doFlavour True (wrapGenSpan expansion)
 
 expand_do_stmts _ doFlavour
        ((L loc (RecStmt { recS_stmts = L stmts_loc rec_stmts
@@ -216,7 +216,7 @@ expand_do_stmts addPop doFlavour ((L _ (XStmtLR (ApplicativeStmt _ args mb_join)
             { xarg_app_arg_one = mb_fail_op
             , app_arg_pattern = pat
             , arg_expr        = (L rhs_loc rhs) }) =
-      do let xx_expr = mkExpandedStmtAt addPop (noAnnSrcSpan generatedSrcSpan) stmt doFlavour False rhs
+      do let xx_expr = mkExpandedStmtAt addPop stmt doFlavour False (L rhs_loc rhs)
          traceTc "do_arg" (text "OneArg" <+> vcat [ppr pat, ppr xx_expr])
          return ((pat, mb_fail_op)
                 , xx_expr)
@@ -247,7 +247,7 @@ expand_do_stmts _ _ stmts = pprPanic "expand_do_stmts: impossible happened" $ (p
 
 -- checks the pattern `pat` for irrefutability which decides if we need to wrap it with a fail block
 mk_failable_expr :: Bool -> HsDoFlavour -> Maybe (ExprLStmt GhcRn) -> LPat GhcRn -> LHsExpr GhcRn -> FailOperator GhcRn -> TcM (LHsExpr GhcRn)
-mk_failable_expr addPop doFlav mb_stmt lpat@(L loc pat) expr fail_op =
+mk_failable_expr addPop doFlav mb_stmt lpat@(L _ pat) expr fail_op =
   do { is_strict <- xoptM LangExt.Strict
      ; rdrEnv <- getGlobalRdrEnv
      ; comps <- getCompleteMatchesTcM
@@ -262,21 +262,21 @@ mk_failable_expr addPop doFlav mb_stmt lpat@(L loc pat) expr fail_op =
               (WildPat{}) -> return $ genHsLamDoExp doFlav [L noSrcSpanA pat] expr
               _ -> return $ case mb_stmt of
                               Nothing -> genHsLamDoExp doFlav [lpat] expr
-                              Just s  -> mkExpandedStmtAt addPop (noAnnSrcSpan generatedSrcSpan) s doFlav False
-                                                           (unLoc $ (genHsLamDoExp doFlav [lpat]
-                                                                      $ wrapGenSpan (mkPopErrCtxtExpr expr)))
-       else L loc <$> mk_fail_block doFlav mb_stmt lpat expr fail_op
+                              Just stmt  -> mkExpandedStmtAt addPop stmt doFlav False
+                                                           (genHsLamDoExp doFlav [lpat]
+                                                                      $ wrapGenSpan (mkPopErrCtxtExpr expr))
+       else mk_fail_block doFlav mb_stmt lpat expr fail_op
      }
 
 -- makes the fail block with a given fail_op
 mk_fail_block :: HsDoFlavour -> Maybe (ExprLStmt GhcRn)
-              -> LPat GhcRn -> LHsExpr GhcRn -> FailOperator GhcRn -> TcM (HsExpr GhcRn)
+              -> LPat GhcRn -> LHsExpr GhcRn -> FailOperator GhcRn -> TcM (LHsExpr GhcRn)
 mk_fail_block doFlav mb_stmt pat@(L ploc _) e (Just (SyntaxExprRn fail_op)) =
   do  dflags <- getDynFlags
-      return $ HsLam noAnn LamCases $ mkMatchGroup (doExpansionOrigin doFlav) -- \
-                (wrapGenSpan [ genHsCaseAltDoExp doFlav pat e                 --  pat -> expr
-                             , fail_alt_case dflags pat fail_op               --  _   -> fail "fail pattern"
-                             ])
+      return $ wrapGenSpan (HsLam noAnn LamCases $ mkMatchGroup (doExpansionOrigin doFlav) -- \
+                            (wrapGenSpan [ genHsCaseAltDoExp doFlav pat e                  --  pat -> expr
+                                         , fail_alt_case dflags pat fail_op                --  _   -> fail "fail pattern"
+                                         ]))
         where
           fail_alt_case :: DynFlags -> LPat GhcRn -> HsExpr GhcRn -> LMatch GhcRn (LHsExpr GhcRn)
           fail_alt_case dflags pat fail_op = genHsCaseAltDoExp doFlav (L ploc $ WildPat noExtField) $
@@ -285,7 +285,7 @@ mk_fail_block doFlav mb_stmt pat@(L ploc _) e (Just (SyntaxExprRn fail_op)) =
           fail_op_expr :: DynFlags -> LPat GhcRn -> HsExpr GhcRn -> HsExpr GhcRn
           fail_op_expr dflags pat fail_op
             = mkExpandedPatRn pat doFlav mb_stmt $
-                    genHsApp fail_op (mk_fail_msg_expr dflags pat)
+                    wrapGenSpan (genHsApp fail_op (mk_fail_msg_expr dflags pat))
 
           mk_fail_msg_expr :: DynFlags -> LPat GhcRn -> LHsExpr GhcRn
           mk_fail_msg_expr dflags pat


=====================================
compiler/GHC/Tc/Gen/Expr.hs
=====================================
@@ -621,7 +621,7 @@ tcExpr expr@(RecordUpd { rupd_expr = record_expr
 
           -- Typecheck the expanded expression.
         ; expr' <- addErrCtxt err_ctxt $
-                   tcExpr (mkExpandedExpr expr ds_expr) (Check ds_res_ty)
+                   tcExpr (mkExpandedExpr expr (wrapGenSpan ds_expr)) (Check ds_res_ty)
             -- NB: it's important to use ds_res_ty and not res_ty here.
             -- Test case: T18802b.
 
@@ -714,7 +714,7 @@ tcXExpr (PopErrCtxt (L loc e)) res_ty
       setSrcSpanA loc $
       tcExpr e res_ty
 
-tcXExpr xe@(ExpandedThingRn o e' doTcApp) res_ty
+tcXExpr xe@(ExpandedThingRn o (L _ e') doTcApp) res_ty
   | OrigPat (L loc _) flav (Just s) <- o   -- testcase T16628
   = setSrcSpanA loc $
     addStmtCtxt (unLoc s) flav $


=====================================
compiler/GHC/Tc/Gen/Head.hs
=====================================
@@ -325,8 +325,8 @@ splitHsApps e = go e (top_ctxt 0 e) []
             HsQuasiQuote _ _ (L l _)      -> set l ctxt -- l :: SrcAnn NoEpAnns
 
     -- See Note [Looking through ExpandedThingRn]
-    go (XExpr (ExpandedThingRn o e _)) ctxt args
-      = go e (VAExpansion o (appCtxtLoc ctxt) (appCtxtLoc ctxt))
+    go (XExpr (ExpandedThingRn o (L l e) _)) _ args
+      = go e (VAExpansion o (locA l) (locA l))
                (EWrap (EExpand o) : args)
 
     -- See Note [Desugar OpApp in the typechecker]
@@ -335,7 +335,7 @@ splitHsApps e = go e (top_ctxt 0 e) []
              ,   mkEValArg (VACall op 1 generatedSrcSpan) arg1
                : mkEValArg (VACall op 2 generatedSrcSpan) arg2
                     -- generatedSrcSpan because this the span of the call,
-                    -- and its hard to say exactly what that is
+                    -- Exand its hard to say exactly what that is
                : EWrap (EExpand (OrigExpr e))
                : args )
 
@@ -555,20 +555,25 @@ tcInferAppHead_maybe fun
       _                         -> return Nothing
 
 addHeadCtxt :: AppCtxt -> TcM a -> TcM a
-addHeadCtxt (VAExpansion (OrigStmt (L loc stmt) flav) _ _) thing_inside =
-  do setSrcSpanA loc $
-       addStmtCtxt stmt flav
-         thing_inside
 addHeadCtxt fun_ctxt thing_inside
+  | isGeneratedSrcSpan fun_loc
+  = case fun_ctxt of
+      VAExpansion (OrigStmt (L loc stmt) flav) _ _
+        -> do setSrcSpanA loc $
+                addStmtCtxt stmt flav $
+                thing_inside
+      VAExpansion (OrigPat (L loc _) _ _) _ _
+        -> setSrcSpanA loc $ thing_inside
+      _ -> thing_inside
+
   | not (isGoodSrcSpan fun_loc)   -- noSrcSpan => no arguments
   = thing_inside                  -- => context is already set
   | otherwise
   = setSrcSpan fun_loc $
-    do case fun_ctxt of
+    do traceTc "addHeadCtxt: fun_loc" (ppr fun_loc)
+       case fun_ctxt of
          VAExpansion (OrigExpr orig) _ _
            -> addExprCtxt orig thing_inside
-         VAExpansion (OrigPat _ flav (Just (L loc stmt))) _ _
-           -> setSrcSpanA loc $ addStmtCtxt stmt flav thing_inside
          _ -> thing_inside
   where
     fun_loc = appCtxtLoc fun_ctxt



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/13149cd7b388f12d311ae44ec4c74df41983b3e8

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/13149cd7b388f12d311ae44ec4c74df41983b3e8
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20240728/1c7ebbb6/attachment-0001.html>


More information about the ghc-commits mailing list