forked from rust-lang/rust
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#60327 - matthewjasper:handle-local-outlives…
…-lbl, r=nikomatsakis Search for incompatible universes in borrow errors If we have a borrow that has to live for `'static` we need to check for any regions in incompatible universes when trying to find the cause. closes rust-lang#60274
- Loading branch information
Showing
3 changed files
with
57 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// Test that we handle the case when a local variable is borrowed for `'static` | ||
// due to an outlives constraint involving a region in an incompatible universe | ||
|
||
pub trait Outlives<'this> {} | ||
|
||
impl<'this, T> Outlives<'this> for T where T: 'this {} | ||
trait Reference { | ||
type AssociatedType; | ||
} | ||
|
||
impl<'a, T: 'a> Reference for &'a T { | ||
type AssociatedType = &'a (); | ||
} | ||
|
||
fn assert_static_via_hrtb<G>(_: G) where for<'a> G: Outlives<'a> {} | ||
|
||
fn assert_static_via_hrtb_with_assoc_type<T>(_: &'_ T) | ||
where | ||
for<'a> &'a T: Reference<AssociatedType = &'a ()>, | ||
{} | ||
|
||
fn main() { | ||
let local = 0; | ||
assert_static_via_hrtb(&local); //~ ERROR `local` does not live long enough | ||
assert_static_via_hrtb_with_assoc_type(&&local); //~ ERROR `local` does not live long enough | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
error[E0597]: `local` does not live long enough | ||
--> $DIR/local-outlives-static-via-hrtb.rs:24:28 | ||
| | ||
LL | assert_static_via_hrtb(&local); | ||
| -----------------------^^^^^^- | ||
| | | | ||
| | borrowed value does not live long enough | ||
| argument requires that `local` is borrowed for `'static` | ||
LL | assert_static_via_hrtb_with_assoc_type(&&local); | ||
LL | } | ||
| - `local` dropped here while still borrowed | ||
|
||
error[E0597]: `local` does not live long enough | ||
--> $DIR/local-outlives-static-via-hrtb.rs:25:45 | ||
| | ||
LL | assert_static_via_hrtb_with_assoc_type(&&local); | ||
| ----------------------------------------^^^^^^- | ||
| | | | ||
| | borrowed value does not live long enough | ||
| argument requires that `local` is borrowed for `'static` | ||
LL | } | ||
| - `local` dropped here while still borrowed | ||
|
||
error: aborting due to 2 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0597`. |