Skip to content

Commit

Permalink
Rollup merge of rust-lang#60327 - matthewjasper:handle-local-outlives…
Browse files Browse the repository at this point in the history
…-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
Centril committed May 1, 2019
2 parents 834bd19 + a962274 commit 516ec23
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 2 deletions.
Expand Up @@ -674,8 +674,11 @@ impl<'tcx> RegionInferenceContext<'tcx> {
borrow_region: RegionVid,
outlived_region: RegionVid,
) -> (ConstraintCategory, bool, Span, Option<RegionName>) {
let (category, from_closure, span) =
self.best_blame_constraint(mir, borrow_region, |r| r == outlived_region);
let (category, from_closure, span) = self.best_blame_constraint(
mir,
borrow_region,
|r| self.provides_universal_region(r, borrow_region, outlived_region)
);
let outlived_fr_name =
self.give_region_a_name(infcx, mir, upvars, mir_def_id, outlived_region, &mut 1);
(category, from_closure, span, outlived_fr_name)
Expand Down
26 changes: 26 additions & 0 deletions src/test/ui/nll/local-outlives-static-via-hrtb.rs
@@ -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
}
26 changes: 26 additions & 0 deletions src/test/ui/nll/local-outlives-static-via-hrtb.stderr
@@ -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`.

0 comments on commit 516ec23

Please sign in to comment.