.unwrap_or({
0
});
+ // single line `map(f).unwrap_or(None)` case
+ let _ = opt.map(|x| Some(x + 1)).unwrap_or(None);
+ // multiline `map(f).unwrap_or(None)` cases
+ let _ = opt.map(|x| {
+ Some(x + 1)
+ }
+ ).unwrap_or(None);
+ let _ = opt
+ .map(|x| Some(x + 1))
+ .unwrap_or(None);
// macro case
let _ = opt_map!(opt, |x| x + 1).unwrap_or(0); // should not lint
x: T
}
-#[allow(unnecessary_operation)]
-fn starts_with() {
- "".chars().next() == Some(' ');
- Some(' ') != "".chars().next();
-}
-
fn str_extend_chars() {
let abc = "abc";
let def = String::from("def");
let f = HasChars;
s.extend(f.chars());
}
-
-fn clone_on_copy() {
- 42.clone();
-
- vec![1].clone(); // ok, not a Copy type
- Some(vec![1]).clone(); // ok, not a Copy type
- (&42).clone();
-}
-
-fn clone_on_ref_ptr() {
- let rc = Rc::new(true);
- let arc = Arc::new(true);
-
- let rcweak = Rc::downgrade(&rc);
- let arc_weak = Arc::downgrade(&arc);
-
- rc.clone();
- Rc::clone(&rc);
-
- arc.clone();
- Arc::clone(&arc);
-
- rcweak.clone();
- rc::Weak::clone(&rcweak);
-
- arc_weak.clone();
- sync::Weak::clone(&arc_weak);
-
-
-}
-
-fn clone_on_copy_generic<T: Copy>(t: T) {
- t.clone();
-
- Some(t).clone();
-}
-
-fn clone_on_double_ref() {
- let x = vec![1];
- let y = &&x;
- let z: &Vec<_> = y.clone();
-
- println!("{:p} {:p}",*y, z);
-}
-
-fn single_char_pattern() {
- let x = "foo";
- x.split("x");
- x.split("xx");
- x.split('x');
-
- let y = "x";
- x.split(y);
- // Not yet testing for multi-byte characters
- // Changing `r.len() == 1` to `r.chars().count() == 1` in `lint_single_char_pattern`
- // should have done this but produced an ICE
- //
- // We may not want to suggest changing these anyway
- // See: https://github.com/rust-lang-nursery/rust-clippy/issues/650#issuecomment-184328984
- x.split("ß");
- x.split("ℝ");
- x.split("💣");
- // Can't use this lint for unicode code points which don't fit in a char
- x.split("❤️");
- x.contains("x");
- x.starts_with("x");
- x.ends_with("x");
- x.find("x");
- x.rfind("x");
- x.rsplit("x");
- x.split_terminator("x");
- x.rsplit_terminator("x");
- x.splitn(0, "x");
- x.rsplitn(0, "x");
- x.matches("x");
- x.rmatches("x");
- x.match_indices("x");
- x.rmatch_indices("x");
- x.trim_left_matches("x");
- x.trim_right_matches("x");
-
- let h = HashSet::<String>::new();
- h.contains("X"); // should not warn
-}
-
-#[allow(result_unwrap_used)]
-fn temporary_cstring() {
- use std::ffi::CString;
-
- CString::new("foo").unwrap().as_ptr();
-}
-
-fn iter_clone_collect() {
- let v = [1,2,3,4,5];
- let v2 : Vec<isize> = v.iter().cloned().collect();
- let v3 : HashSet<isize> = v.iter().cloned().collect();
- let v4 : VecDeque<isize> = v.iter().cloned().collect();
-}
-
-fn chars_cmp_with_unwrap() {
- let s = String::from("foo");
- if s.chars().next().unwrap() == 'f' { // s.starts_with('f')
- // Nothing here
- }
- if s.chars().next_back().unwrap() == 'o' { // s.ends_with('o')
- // Nothing here
- }
- if s.chars().last().unwrap() == 'o' { // s.ends_with('o')
- // Nothing here
- }
- if s.chars().next().unwrap() != 'f' { // !s.starts_with('f')
- // Nothing here
- }
- if s.chars().next_back().unwrap() != 'o' { // !s.ends_with('o')
- // Nothing here
- }
- if s.chars().last().unwrap() != 'o' { // !s.ends_with('o')
- // Nothing here
- }
-}
-
-#[allow(unnecessary_operation)]
-fn ends_with() {
- "".chars().last() == Some(' ');
- Some(' ') != "".chars().last();
- "".chars().next_back() == Some(' ');
- Some(' ') != "".chars().next_back();
-}