Skip to content

Commit

Permalink
Rollup merge of #97531 - compiler-errors:for-loop-pat-mismatch, r=dav…
Browse files Browse the repository at this point in the history
…idtwco

Note pattern mismatch coming from `for` loop desugaring

Fixes #97163
  • Loading branch information
Dylan-DPC authored May 30, 2022
2 parents 9bb3832 + 2e25c23 commit 65bdfe3
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 1 deletion.
9 changes: 8 additions & 1 deletion compiler/rustc_infer/src/infer/error_reporting/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,14 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
if !matches!(ty.kind(), ty::Infer(ty::InferTy::TyVar(_) | ty::InferTy::FreshTy(_)))
{
// don't show type `_`
err.span_label(span, format!("this expression has type `{}`", ty));
if span.desugaring_kind() == Some(DesugaringKind::ForLoop)
&& let ty::Adt(def, substs) = ty.kind()
&& Some(def.did()) == self.tcx.get_diagnostic_item(sym::Option)
{
err.span_label(span, format!("this is an iterator with items of type `{}`", substs.type_at(0)));
} else {
err.span_label(span, format!("this expression has type `{}`", ty));
}
}
if let Some(ty::error::ExpectedFound { found, .. }) = exp_found
&& ty.is_box() && ty.boxed_ty() == found
Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/pattern/for-loop-bad-item.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
struct Qux(i32);

fn bad() {
let mut map = std::collections::HashMap::new();
map.insert(('a', 'b'), ('c', 'd'));

for ((_, _), (&mut c, _)) in &mut map {
//~^ ERROR mismatched types
if c == 'e' {}
}
}

fn bad2() {
for Some(Qux(_)) | None in [Some(""), None] {
//~^ ERROR mismatched types
todo!();
}
}

fn main() {}
23 changes: 23 additions & 0 deletions src/test/ui/pattern/for-loop-bad-item.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
error[E0308]: mismatched types
--> $DIR/for-loop-bad-item.rs:7:19
|
LL | for ((_, _), (&mut c, _)) in &mut map {
| ^^^^^^ -------- this is an iterator with items of type `(&(char, char), &mut (char, char))`
| |
| expected `char`, found `&mut _`
| help: you can probably remove the explicit borrow: `c`
|
= note: expected type `char`
found mutable reference `&mut _`

error[E0308]: mismatched types
--> $DIR/for-loop-bad-item.rs:14:14
|
LL | for Some(Qux(_)) | None in [Some(""), None] {
| ^^^^^^ ---------------- this is an iterator with items of type `Option<&str>`
| |
| expected `str`, found struct `Qux`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.

0 comments on commit 65bdfe3

Please sign in to comment.