Rollup merge of #109433 - chenyukang:yukang/fix-109188-ice, r=lcnr

Return equal for two identical projections

Fixes #109188
This commit is contained in:
Matthias Krüger 2023-03-24 07:13:04 +01:00 committed by GitHub
commit 98254c5cc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 3 deletions

View File

@ -712,10 +712,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}
}
unreachable!(
"we captured two identical projections: capture1 = {:?}, capture2 = {:?}",
capture1, capture2
self.tcx.sess.delay_span_bug(
closure_span,
&format!(
"two identical projections: ({:?}, {:?})",
capture1.place.projections, capture2.place.projections
),
);
std::cmp::Ordering::Equal
});
}

View File

@ -0,0 +1,22 @@
enum Either {
One(X),
Two(X),
}
struct X(Y);
struct Y;
fn consume_fnmut(f: &dyn FnMut()) {
f();
}
fn move_into_fnmut() {
let x = move_into_fnmut();
consume_fnmut(&|| {
let Either::One(_t) = x; //~ ERROR mismatched types
let Either::Two(_t) = x; //~ ERROR mismatched types
});
}
fn main() { }

View File

@ -0,0 +1,19 @@
error[E0308]: mismatched types
--> $DIR/issue-109188.rs:17:13
|
LL | let Either::One(_t) = x;
| ^^^^^^^^^^^^^^^ - this expression has type `()`
| |
| expected `()`, found `Either`
error[E0308]: mismatched types
--> $DIR/issue-109188.rs:18:13
|
LL | let Either::Two(_t) = x;
| ^^^^^^^^^^^^^^^ - this expression has type `()`
| |
| expected `()`, found `Either`
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`.