Rollup merge of #107422 - Nilstrieb:erase-the-ice, r=compiler-errors

Also erase substs for new infcx in pin move error

The code originally correctly erased the regions of the type it passed to the newly created infcx. But after the `fn_sig` query was made to return an `EarlyBinder<T>`, some substs that were around were substituted there without erasing their regions. They were then passed into the newly cerated infcx, which caused the ICE.

Fixes #107419

r? compiler-errors who reviewed the original PR adding this diagnostic
This commit is contained in:
Matthias Krüger 2023-01-29 06:14:20 +01:00 committed by GitHub
commit 5ff6cdca7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 0 deletions

View File

@ -1128,8 +1128,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
"{place_name} {partially_str}moved due to this method call{loop_message}",
),
);
let infcx = tcx.infer_ctxt().build();
// Erase and shadow everything that could be passed to the new infcx.
let ty = tcx.erase_regions(moved_place.ty(self.body, tcx).ty);
let method_substs = tcx.erase_regions(method_substs);
if let ty::Adt(def, substs) = ty.kind()
&& Some(def.did()) == tcx.lang_items().pin_type()
&& let ty::Ref(_, _, hir::Mutability::Mut) = substs.type_at(0).kind()

View File

@ -0,0 +1,11 @@
// run-rustfix
use std::pin::Pin;
fn foo(_: &mut ()) {}
fn main() {
let mut uwu = ();
let mut r = Pin::new(&mut uwu);
foo(r.as_mut().get_mut());
foo(r.get_mut()); //~ ERROR use of moved value
}

View File

@ -0,0 +1,11 @@
// run-rustfix
use std::pin::Pin;
fn foo(_: &mut ()) {}
fn main() {
let mut uwu = ();
let mut r = Pin::new(&mut uwu);
foo(r.get_mut());
foo(r.get_mut()); //~ ERROR use of moved value
}

View File

@ -0,0 +1,20 @@
error[E0382]: use of moved value: `r`
--> $DIR/pin-mut-reborrow-infer-var-issue-107419.rs:10:9
|
LL | let mut r = Pin::new(&mut uwu);
| ----- move occurs because `r` has type `Pin<&mut ()>`, which does not implement the `Copy` trait
LL | foo(r.get_mut());
| --------- `r` moved due to this method call
LL | foo(r.get_mut());
| ^ value used here after move
|
note: `Pin::<&'a mut T>::get_mut` takes ownership of the receiver `self`, which moves `r`
--> $SRC_DIR/core/src/pin.rs:LL:COL
help: consider reborrowing the `Pin` instead of moving it
|
LL | foo(r.as_mut().get_mut());
| +++++++++
error: aborting due to previous error
For more information about this error, try `rustc --explain E0382`.