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:
commit
fd19773d2f
3 changed files with 47 additions and 3 deletions
|
@ -1950,8 +1950,14 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||||
target_test: impl Fn(RegionVid) -> bool,
|
target_test: impl Fn(RegionVid) -> bool,
|
||||||
) -> (BlameConstraint<'tcx>, Vec<ExtraConstraintInfo>) {
|
) -> (BlameConstraint<'tcx>, Vec<ExtraConstraintInfo>) {
|
||||||
// Find all paths
|
// Find all paths
|
||||||
let (path, target_region) =
|
let (path, target_region) = self
|
||||||
self.find_constraint_paths_between_regions(from_region, target_test).unwrap();
|
.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!(
|
debug!(
|
||||||
"path={:#?}",
|
"path={:#?}",
|
||||||
path.iter()
|
path.iter()
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
//@ known-bug: #133252
|
// Regression test for borrowck ICE #133252
|
||||||
//@ edition:2021
|
//@ edition:2021
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
|
|
||||||
|
@ -7,6 +7,8 @@ fn ice() -> impl Future<Output = &'static dyn Owned> {
|
||||||
async {
|
async {
|
||||||
let not_static = 0;
|
let not_static = 0;
|
||||||
force_send(async_load(¬_static));
|
force_send(async_load(¬_static));
|
||||||
|
//~^ ERROR implementation of `LoadQuery` is not general enough
|
||||||
|
//~| ERROR `not_static` does not live long enough
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,3 +43,5 @@ impl Future for SimpleFuture {
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -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(¬_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(¬_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`.
|
Loading…
Add table
Add a link
Reference in a new issue