Rollup merge of #107532 - compiler-errors:erase-regions-in-uninhabited, r=jackh726

Erase regions before doing uninhabited check in borrowck

~Also, fingerprint query keys/values when debug assertions are enabled. This should make it easier to check for issues like this without `-Cincremental`, and make UI tests a bit cleaner.~ edit: moving that to a separate PR

Fixes #107505
This commit is contained in:
Matthias Krüger 2023-02-02 17:14:07 +01:00 committed by GitHub
commit 3e0995a440
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 1 deletions

View File

@ -1484,7 +1484,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
}
}
None => {
if !sig.output().is_privately_uninhabited(self.tcx(), self.param_env) {
// The signature in this call can reference region variables,
// so erase them before calling a query.
let output_ty = self.tcx().erase_regions(sig.output());
if !output_ty.is_privately_uninhabited(self.tcx(), self.param_env) {
span_mirbug!(self, term, "call to converging function {:?} w/o dest", sig);
}
}

View File

@ -0,0 +1,18 @@
// compile-flags: --crate-type=lib
// check-pass
// Make sure we don't pass inference variables to uninhabitedness checks in borrowck
struct Command<'s> {
session: &'s (),
imp: std::convert::Infallible,
}
fn command(_: &()) -> Command<'_> {
unreachable!()
}
fn with_session<'s>(a: &std::process::Command, b: &'s ()) -> Command<'s> {
a.get_program();
command(b)
}