diff options
| author | Michael Goulet <michael@errs.io> | 2022-07-29 06:02:11 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-07-29 06:02:11 +0000 |
| commit | dec29b158258d5a0fd2362feee707ff416fc9787 (patch) | |
| tree | a31615b36c1f1ffef1864ab618c4565d32f6583f /compiler | |
| parent | 9de747483029ec3b0c050f7af0dc56765035ff98 (diff) | |
| download | rust-dec29b158258d5a0fd2362feee707ff416fc9787.tar.gz rust-dec29b158258d5a0fd2362feee707ff416fc9787.zip | |
Adjust an expr span to account for macros
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_typeck/src/check/_match.rs | 3 | ||||
| -rw-r--r-- | compiler/rustc_typeck/src/check/fn_ctxt/checks.rs | 4 |
2 files changed, 5 insertions, 2 deletions
diff --git a/compiler/rustc_typeck/src/check/_match.rs b/compiler/rustc_typeck/src/check/_match.rs index 147d87e7594..df315b8a3bc 100644 --- a/compiler/rustc_typeck/src/check/_match.rs +++ b/compiler/rustc_typeck/src/check/_match.rs @@ -39,8 +39,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let scrut_diverges = self.diverges.replace(Diverges::Maybe); // #55810: Type check patterns first so we get types for all bindings. + let scrut_span = scrut.span.find_ancestor_inside(expr.span).unwrap_or(scrut.span); for arm in arms { - self.check_pat_top(&arm.pat, scrutinee_ty, Some(scrut.span), true); + self.check_pat_top(&arm.pat, scrutinee_ty, Some(scrut_span), true); } // Now typecheck the blocks. diff --git a/compiler/rustc_typeck/src/check/fn_ctxt/checks.rs b/compiler/rustc_typeck/src/check/fn_ctxt/checks.rs index eb22938fb61..abde4d9acfe 100644 --- a/compiler/rustc_typeck/src/check/fn_ctxt/checks.rs +++ b/compiler/rustc_typeck/src/check/fn_ctxt/checks.rs @@ -1234,7 +1234,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // Does the expected pattern type originate from an expression and what is the span? let (origin_expr, ty_span) = match (decl.ty, decl.init) { (Some(ty), _) => (false, Some(ty.span)), // Bias towards the explicit user type. - (_, Some(init)) => (true, Some(init.span)), // No explicit type; so use the scrutinee. + (_, Some(init)) => { + (true, Some(init.span.find_ancestor_inside(decl.span).unwrap_or(init.span))) + } // No explicit type; so use the scrutinee. _ => (false, None), // We have `let $pat;`, so the expected type is unconstrained. }; |
