about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2022-07-29 06:02:11 +0000
committerMichael Goulet <michael@errs.io>2022-07-29 06:02:11 +0000
commitdec29b158258d5a0fd2362feee707ff416fc9787 (patch)
treea31615b36c1f1ffef1864ab618c4565d32f6583f
parent9de747483029ec3b0c050f7af0dc56765035ff98 (diff)
downloadrust-dec29b158258d5a0fd2362feee707ff416fc9787.tar.gz
rust-dec29b158258d5a0fd2362feee707ff416fc9787.zip
Adjust an expr span to account for macros
-rw-r--r--compiler/rustc_typeck/src/check/_match.rs3
-rw-r--r--compiler/rustc_typeck/src/check/fn_ctxt/checks.rs4
-rw-r--r--src/test/ui/suggestions/pattern-slice-vec.fixed4
-rw-r--r--src/test/ui/suggestions/pattern-slice-vec.rs4
-rw-r--r--src/test/ui/suggestions/pattern-slice-vec.stderr10
5 files changed, 22 insertions, 3 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.
         };
 
diff --git a/src/test/ui/suggestions/pattern-slice-vec.fixed b/src/test/ui/suggestions/pattern-slice-vec.fixed
index 447337c39c4..f8144641f3c 100644
--- a/src/test/ui/suggestions/pattern-slice-vec.fixed
+++ b/src/test/ui/suggestions/pattern-slice-vec.fixed
@@ -24,4 +24,8 @@ fn main() {
         //~^ ERROR: expected an array or slice
         _ => {}
     }
+
+    let [..] = vec![1, 2, 3][..];
+    //~^ ERROR: expected an array or slice
+    //~| HELP: consider slicing here
 }
diff --git a/src/test/ui/suggestions/pattern-slice-vec.rs b/src/test/ui/suggestions/pattern-slice-vec.rs
index 1153ca026bb..444687c8578 100644
--- a/src/test/ui/suggestions/pattern-slice-vec.rs
+++ b/src/test/ui/suggestions/pattern-slice-vec.rs
@@ -24,4 +24,8 @@ fn main() {
         //~^ ERROR: expected an array or slice
         _ => {}
     }
+
+    let [..] = vec![1, 2, 3];
+    //~^ ERROR: expected an array or slice
+    //~| HELP: consider slicing here
 }
diff --git a/src/test/ui/suggestions/pattern-slice-vec.stderr b/src/test/ui/suggestions/pattern-slice-vec.stderr
index 403a816ba11..f69e7de971a 100644
--- a/src/test/ui/suggestions/pattern-slice-vec.stderr
+++ b/src/test/ui/suggestions/pattern-slice-vec.stderr
@@ -31,6 +31,14 @@ LL |
 LL |         [5] => {}
    |         ^^^ pattern cannot match with input type `Vec<_>`
 
-error: aborting due to 4 previous errors
+error[E0529]: expected an array or slice, found `Vec<{integer}>`
+  --> $DIR/pattern-slice-vec.rs:28:9
+   |
+LL |     let [..] = vec![1, 2, 3];
+   |         ^^^^   ------------- help: consider slicing here: `vec![1, 2, 3][..]`
+   |         |
+   |         pattern cannot match with input type `Vec<{integer}>`
+
+error: aborting due to 5 previous errors
 
 For more information about this error, try `rustc --explain E0529`.