#![allow(unused, clippy::needless_lifetimes)] #![warn( clippy::style, clippy::mem_replace_option_with_none, clippy::mem_replace_with_default )] use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList, VecDeque}; use std::mem; fn replace_option_with_none() { let mut an_option = Some(1); let _ = an_option.take(); let an_option = &mut Some(1); let _ = an_option.take(); } fn replace_with_default() { let mut s = String::from("foo"); let _ = std::mem::take(&mut s); let s = &mut String::from("foo"); let _ = std::mem::take(s); let _ = std::mem::take(s); let mut v = vec![123]; let _ = std::mem::take(&mut v); let _ = std::mem::take(&mut v); let _ = std::mem::take(&mut v); let _ = std::mem::take(&mut v); let mut hash_map: HashMap = HashMap::new(); let _ = std::mem::take(&mut hash_map); let mut btree_map: BTreeMap = BTreeMap::new(); let _ = std::mem::take(&mut btree_map); let mut vd: VecDeque = VecDeque::new(); let _ = std::mem::take(&mut vd); let mut hash_set: HashSet<&str> = HashSet::new(); let _ = std::mem::take(&mut hash_set); let mut btree_set: BTreeSet<&str> = BTreeSet::new(); let _ = std::mem::take(&mut btree_set); let mut list: LinkedList = LinkedList::new(); let _ = std::mem::take(&mut list); let mut binary_heap: BinaryHeap = BinaryHeap::new(); let _ = std::mem::take(&mut binary_heap); let mut tuple = (vec![1, 2], BinaryHeap::::new()); let _ = std::mem::take(&mut tuple); let mut refstr = "hello"; let _ = std::mem::take(&mut refstr); let mut slice: &[i32] = &[1, 2, 3]; let _ = std::mem::take(&mut slice); } // lint is disabled for primitives because in this case `take` // has no clear benefit over `replace` and sometimes is harder to read fn dont_lint_primitive() { let mut pbool = true; let _ = std::mem::replace(&mut pbool, false); let mut pint = 5; let _ = std::mem::replace(&mut pint, 0); } // lint is disabled for expressions that are not used because changing to `take` is not the // recommended fix. Additionally, the `replace` is #[must_use], so that lint will provide // the correct suggestion fn dont_lint_not_used() { let mut s = String::from("foo"); std::mem::replace(&mut s, String::default()); } fn main() { replace_option_with_none(); replace_with_default(); dont_lint_primitive(); } #[clippy::msrv = "1.39"] fn msrv_1_39() { let mut s = String::from("foo"); let _ = std::mem::replace(&mut s, String::default()); } #[clippy::msrv = "1.40"] fn msrv_1_40() { let mut s = String::from("foo"); let _ = std::mem::take(&mut s); } fn issue9824() { struct Foo<'a>(Option<&'a str>); impl<'a> std::ops::Deref for Foo<'a> { type Target = Option<&'a str>; fn deref(&self) -> &Self::Target { &self.0 } } impl<'a> std::ops::DerefMut for Foo<'a> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } struct Bar { opt: Option, val: String, } let mut f = Foo(Some("foo")); let mut b = Bar { opt: Some(1), val: String::from("bar"), }; // replace option with none let _ = f.0.take(); let _ = (*f).take(); let _ = b.opt.take(); // replace with default let _ = std::mem::take(&mut b.val); }