|  | //@ run-pass | 
|  | // Test that we are able to handle the relationships between free | 
|  | // regions bound in a closure callback. | 
|  |  | 
|  | #[derive(Copy, Clone)] | 
|  | struct MyCx<'short, 'long: 'short> { | 
|  | short: &'short u32, | 
|  | long: &'long u32, | 
|  | } | 
|  |  | 
|  | impl<'short, 'long> MyCx<'short, 'long> { | 
|  | fn short(self) -> &'short u32 { self.short } | 
|  | fn long(self) -> &'long u32 { self.long } | 
|  | fn set_short(&mut self, v: &'short u32) { self.short = v; } | 
|  | } | 
|  |  | 
|  | fn with<F, R>(op: F) -> R | 
|  | where | 
|  | F: for<'short, 'long> FnOnce(MyCx<'short, 'long>) -> R, | 
|  | { | 
|  | op(MyCx { | 
|  | short: &22, | 
|  | long: &22, | 
|  | }) | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | with(|mut cx| { | 
|  | // For this to type-check, we need to be able to deduce that | 
|  | // the lifetime of `l` can be `'short`, even though it has | 
|  | // input from `'long`. | 
|  | let l = if true { cx.long() } else { cx.short() }; | 
|  | cx.set_short(l); | 
|  | }); | 
|  | } |