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)
--- /dev/null
+// 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
+}
--- /dev/null
+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`.