Rollup merge of #111573 - compiler-errors:erase-re-error, r=WaffleLapkin

Erase `ReError` properly

Fixes #111341

Since we check whether a type has free regions before erasing (to short circuit unnecesary folding), we need to consider `ReError` as a free region, or else we'll skip it when erasing a type that only mentions `ReError`.

cc `@nnethercote`
This commit is contained in:
Matthias Krüger 2023-05-16 20:12:17 +02:00 committed by GitHub
commit 6dc365003b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 50 additions and 1 deletions

View file

@ -1708,7 +1708,9 @@ pub fn type_flags(self) -> TypeFlags {
ty::ReErased => {
flags = flags | TypeFlags::HAS_RE_ERASED;
}
ty::ReError(_) => {}
ty::ReError(_) => {
flags = flags | TypeFlags::HAS_FREE_REGIONS;
}
}
debug!("type_flags({:?}) = {:?}", self, flags);

View file

@ -0,0 +1,23 @@
// compile-flags: -Zdrop-tracking-mir
// edition:2021
use std::future::Future;
trait Client {
type Connecting<'a>: Future + Send
where
Self: 'a;
fn connect(&'_ self) -> Self::Connecting<'a>;
//~^ ERROR use of undeclared lifetime name `'a`
}
fn call_connect<C>(c: &'_ C) -> impl '_ + Future + Send
where
C: Client + Send + Sync,
{
async move { c.connect().await }
//~^ ERROR `C` does not live long enough
}
fn main() {}

View file

@ -0,0 +1,24 @@
error[E0261]: use of undeclared lifetime name `'a`
--> $DIR/erase-error-in-mir-drop-tracking.rs:11:46
|
LL | fn connect(&'_ self) -> Self::Connecting<'a>;
| ^^ undeclared lifetime
|
help: consider introducing lifetime `'a` here
|
LL | fn connect<'a>(&'_ self) -> Self::Connecting<'a>;
| ++++
help: consider introducing lifetime `'a` here
|
LL | trait Client<'a> {
| ++++
error: `C` does not live long enough
--> $DIR/erase-error-in-mir-drop-tracking.rs:19:5
|
LL | async move { c.connect().await }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0261`.