diff options
Diffstat (limited to 'tests/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.rs')
-rw-r--r-- | tests/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.rs b/tests/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.rs new file mode 100644 index 000000000..4d8380599 --- /dev/null +++ b/tests/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.rs @@ -0,0 +1,39 @@ +// compile-flags:-Zverbose + +#![allow(warnings)] +#![feature(rustc_attrs)] + +use std::cell::Cell; + +// Invoke in such a way that the callee knows: +// +// - 'a: 'x +// +// and it must prove that `T: 'x`. Callee passes along `T: 'a`. +fn twice<'a, F, T>(v: Cell<&'a ()>, value: T, mut f: F) +where + F: for<'x> FnMut(Option<Cell<&'a &'x ()>>, &T), +{ + f(None, &value); + f(None, &value); +} + +#[rustc_regions] +fn generic<T>(value: T) { + let cell = Cell::new(&()); + twice(cell, value, |a, b| invoke(a, b)); +} + +#[rustc_regions] +fn generic_fail<'a, T>(cell: Cell<&'a ()>, value: T) { + twice(cell, value, |a, b| invoke(a, b)); + //~^ ERROR the parameter type `T` may not live long enough +} + +fn invoke<'a, 'x, T>(x: Option<Cell<&'x &'a ()>>, y: &T) +where + T: 'x, +{ +} + +fn main() {} |