// run-rustfix #![allow(unreachable_code)] fn some_func(a: Option) -> Option { a?; a } fn some_other_func(a: Option) -> Option { if a.is_none() { return None; } else { return Some(0); } unreachable!() } pub enum SeemsOption { Some(T), None, } impl SeemsOption { pub fn is_none(&self) -> bool { match *self { SeemsOption::None => true, SeemsOption::Some(_) => false, } } } fn returns_something_similar_to_option(a: SeemsOption) -> SeemsOption { if a.is_none() { return SeemsOption::None; } a } pub struct CopyStruct { pub opt: Option, } impl CopyStruct { #[rustfmt::skip] pub fn func(&self) -> Option { (self.opt)?; self.opt?; let _ = Some(self.opt?); let _ = self.opt?; self.opt } } #[derive(Clone)] pub struct MoveStruct { pub opt: Option>, } impl MoveStruct { pub fn ref_func(&self) -> Option> { self.opt.as_ref()?; self.opt.clone() } pub fn mov_func_reuse(self) -> Option> { self.opt.as_ref()?; self.opt } pub fn mov_func_no_use(self) -> Option> { self.opt.as_ref()?; Some(Vec::new()) } pub fn if_let_ref_func(self) -> Option> { let v: &Vec<_> = self.opt.as_ref()?; Some(v.clone()) } pub fn if_let_mov_func(self) -> Option> { let v = self.opt?; Some(v) } } fn func() -> Option { fn f() -> Option { Some(String::new()) } f()?; Some(0) } fn main() { some_func(Some(42)); some_func(None); some_other_func(Some(42)); let copy_struct = CopyStruct { opt: Some(54) }; copy_struct.func(); let move_struct = MoveStruct { opt: Some(vec![42, 1337]), }; move_struct.ref_func(); move_struct.clone().mov_func_reuse(); move_struct.mov_func_no_use(); let so = SeemsOption::Some(45); returns_something_similar_to_option(so); func(); }