| #![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(); | |
| //~^ mem_replace_option_with_none | |
| let an_option = &mut Some(1); | |
| let _ = an_option.take(); | |
| //~^ mem_replace_option_with_none | |
| } | |
| fn replace_with_default() { | |
| let mut s = String::from("foo"); | |
| let _ = std::mem::take(&mut s); | |
| //~^ mem_replace_with_default | |
| let _ = std::mem::take(&mut s); | |
| //~^ mem_replace_with_default | |
| let s = &mut String::from("foo"); | |
| let _ = std::mem::take(s); | |
| //~^ mem_replace_with_default | |
| let _ = std::mem::take(s); | |
| //~^ mem_replace_with_default | |
| let _ = std::mem::take(s); | |
| //~^ mem_replace_with_default | |
| let mut v = vec![123]; | |
| let _ = std::mem::take(&mut v); | |
| //~^ mem_replace_with_default | |
| let _ = std::mem::take(&mut v); | |
| //~^ mem_replace_with_default | |
| let _ = std::mem::take(&mut v); | |
| //~^ mem_replace_with_default | |
| let _ = std::mem::take(&mut v); | |
| //~^ mem_replace_with_default | |
| let mut hash_map: HashMap<i32, i32> = HashMap::new(); | |
| let _ = std::mem::take(&mut hash_map); | |
| //~^ mem_replace_with_default | |
| let mut btree_map: BTreeMap<i32, i32> = BTreeMap::new(); | |
| let _ = std::mem::take(&mut btree_map); | |
| //~^ mem_replace_with_default | |
| let mut vd: VecDeque<i32> = VecDeque::new(); | |
| let _ = std::mem::take(&mut vd); | |
| //~^ mem_replace_with_default | |
| let mut hash_set: HashSet<&str> = HashSet::new(); | |
| let _ = std::mem::take(&mut hash_set); | |
| //~^ mem_replace_with_default | |
| let mut btree_set: BTreeSet<&str> = BTreeSet::new(); | |
| let _ = std::mem::take(&mut btree_set); | |
| //~^ mem_replace_with_default | |
| let mut list: LinkedList<i32> = LinkedList::new(); | |
| let _ = std::mem::take(&mut list); | |
| //~^ mem_replace_with_default | |
| let mut binary_heap: BinaryHeap<i32> = BinaryHeap::new(); | |
| let _ = std::mem::take(&mut binary_heap); | |
| //~^ mem_replace_with_default | |
| let mut tuple = (vec![1, 2], BinaryHeap::<i32>::new()); | |
| let _ = std::mem::take(&mut tuple); | |
| //~^ mem_replace_with_default | |
| let mut refstr = "hello"; | |
| let _ = std::mem::take(&mut refstr); | |
| //~^ mem_replace_with_default | |
| let mut slice: &[i32] = &[1, 2, 3]; | |
| let _ = std::mem::take(&mut slice); | |
| //~^ mem_replace_with_default | |
| } | |
| // 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() {} | |
| #[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); | |
| //~^ mem_replace_with_default | |
| } | |
| 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<u8>, | |
| 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(); | |
| //~^ mem_replace_option_with_none | |
| let _ = (*f).take(); | |
| //~^ mem_replace_option_with_none | |
| let _ = b.opt.take(); | |
| //~^ mem_replace_option_with_none | |
| // replace with default | |
| let _ = std::mem::take(&mut b.val); | |
| //~^ mem_replace_with_default | |
| } | |
| #[clippy::msrv = "1.31"] | |
| fn mem_replace_option_with_some() { | |
| let mut an_option = Some(0); | |
| let replaced = an_option.replace(1); | |
| //~^ ERROR: replacing an `Option` with `Some(..)` | |
| let mut an_option = &mut Some(0); | |
| let replaced = an_option.replace(1); | |
| //~^ ERROR: replacing an `Option` with `Some(..)` | |
| let (mut opt1, mut opt2) = (Some(0), Some(0)); | |
| let b = true; | |
| let replaced = (if b { &mut opt1 } else { &mut opt2 }).replace(1); | |
| //~^ ERROR: replacing an `Option` with `Some(..)` | |
| } | |
| #[clippy::msrv = "1.30"] | |
| fn mem_replace_option_with_some_bad_msrv() { | |
| let mut an_option = Some(0); | |
| let replaced = mem::replace(&mut an_option, Some(1)); | |
| } | |
| fn issue15785() { | |
| let mut text = String::from("foo"); | |
| let replaced = std::mem::take(dbg!(&mut text)); | |
| //~^ mem_replace_with_default | |
| } |