1
Fork 0

Auto merge of #134627 - estebank:issue-133252, r=jackh726

Avoid ICE in borrowck

Provide a fallback in `best_blame_constraint` when `find_constraint_paths_between_regions` doesn't have a result. This code is due a rework to avoid the letf-over `unwrap()`, but avoids the ICE caused by the repro.

Fix #133252.
This commit is contained in:
bors 2024-12-29 07:23:59 +00:00
commit fd19773d2f
3 changed files with 47 additions and 3 deletions

View file

@ -1950,8 +1950,14 @@ impl<'tcx> RegionInferenceContext<'tcx> {
target_test: impl Fn(RegionVid) -> bool,
) -> (BlameConstraint<'tcx>, Vec<ExtraConstraintInfo>) {
// Find all paths
let (path, target_region) =
self.find_constraint_paths_between_regions(from_region, target_test).unwrap();
let (path, target_region) = self
.find_constraint_paths_between_regions(from_region, target_test)
.or_else(|| {
self.find_constraint_paths_between_regions(from_region, |r| {
self.cannot_name_placeholder(from_region, r)
})
})
.unwrap();
debug!(
"path={:#?}",
path.iter()

View file

@ -1,4 +1,4 @@
//@ known-bug: #133252
// Regression test for borrowck ICE #133252
//@ edition:2021
use std::future::Future;
@ -7,6 +7,8 @@ fn ice() -> impl Future<Output = &'static dyn Owned> {
async {
let not_static = 0;
force_send(async_load(&not_static));
//~^ ERROR implementation of `LoadQuery` is not general enough
//~| ERROR `not_static` does not live long enough
loop {}
}
}
@ -41,3 +43,5 @@ impl Future for SimpleFuture {
loop {}
}
}
fn main() {}

View file

@ -0,0 +1,34 @@
error: implementation of `LoadQuery` is not general enough
--> $DIR/implementation-not-general-enough-ice-133252.rs:9:9
|
LL | force_send(async_load(&not_static));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `LoadQuery` is not general enough
|
= note: `LoadQuery<'0>` would have to be implemented for the type `&u8`, for any lifetime `'0`...
= note: ...but `LoadQuery<'1>` is actually implemented for the type `&'1 u8`, for some specific lifetime `'1`
error[E0597]: `not_static` does not live long enough
--> $DIR/implementation-not-general-enough-ice-133252.rs:9:31
|
LL | async {
| - return type of async block is &(dyn Owned + '1)
LL | let not_static = 0;
| ---------- binding `not_static` declared here
LL | force_send(async_load(&not_static));
| -----------^^^^^^^^^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `not_static` is borrowed for `'1`
...
LL | }
| - `not_static` dropped here while still borrowed
|
note: due to current limitations in the borrow checker, this implies a `'static` lifetime
--> $DIR/implementation-not-general-enough-ice-133252.rs:16:18
|
LL | fn force_send<T: Send>(_: T) {}
| ^^^^
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0597`.