mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-04 06:56:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
enum DropOption<T> {
 | 
						|
    Some(T),
 | 
						|
    None,
 | 
						|
}
 | 
						|
 | 
						|
impl<T> Drop for DropOption<T> {
 | 
						|
    fn drop(&mut self) {}
 | 
						|
}
 | 
						|
 | 
						|
// Dropping opt could access the value behind the reference,
 | 
						|
fn drop_enum(opt: DropOption<&mut i32>) -> Option<&mut i32> {
 | 
						|
    match opt {
 | 
						|
        DropOption::Some(&mut ref mut r) => { //~ ERROR
 | 
						|
            Some(r)
 | 
						|
        },
 | 
						|
        DropOption::None => None,
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
fn optional_drop_enum(opt: Option<DropOption<&mut i32>>) -> Option<&mut i32> {
 | 
						|
    match opt {
 | 
						|
        Some(DropOption::Some(&mut ref mut r)) => { //~ ERROR
 | 
						|
            Some(r)
 | 
						|
        },
 | 
						|
        Some(DropOption::None) | None => None,
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// Ok, dropping opt doesn't access the reference
 | 
						|
fn optional_tuple(opt: Option<(&mut i32, String)>) -> Option<&mut i32> {
 | 
						|
    match opt {
 | 
						|
        Some((&mut ref mut r, _)) => {
 | 
						|
            Some(r)
 | 
						|
        },
 | 
						|
        None => None,
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// Ok, dropping res doesn't access the Ok case.
 | 
						|
fn different_variants(res: Result<&mut i32, String>) -> Option<&mut i32> {
 | 
						|
    match res {
 | 
						|
        Ok(&mut ref mut r) => {
 | 
						|
            Some(r)
 | 
						|
        },
 | 
						|
        Err(_) => None,
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
fn main() {}
 |