mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-04 06:56:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			36 lines
		
	
	
		
			882 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			882 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
// 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);
 | 
						|
    });
 | 
						|
}
 |