blob: 0c64ed1826b261e3d4d86e25e38b86a7b185cfb0 [file] [log] [blame]
#![warn(clippy::manual_unwrap_or_default)]
#![allow(clippy::unnecessary_literal_unwrap)]
fn main() {
let x: Option<Vec<String>> = None;
x.unwrap_or_default();
let x: Option<Vec<String>> = None;
x.unwrap_or_default();
let x: Option<String> = None;
x.unwrap_or_default();
let x: Option<Vec<String>> = None;
x.unwrap_or_default();
let x: Option<Vec<String>> = None;
x.unwrap_or_default();
// Issue #12564
// No error as &Vec<_> doesn't implement std::default::Default
let mut map = std::collections::HashMap::from([(0, vec![0; 3]), (1, vec![1; 3]), (2, vec![2])]);
let x: &[_] = if let Some(x) = map.get(&0) { x } else { &[] };
// Same code as above written using match.
let x: &[_] = match map.get(&0) {
Some(x) => x,
None => &[],
};
let x: Result<String, i64> = Ok(String::new());
x.unwrap_or_default();
let x: Result<String, i64> = Ok(String::new());
x.unwrap_or_default();
// edge case
// because the `Some(bizarro)` pattern is not actually reachable,
// changing this match to `unwrap_or_default` would have side effects
let bizarro = Some(String::new());
match bizarro {
_ => String::new(),
Some(bizarro) => bizarro,
};
}
// Issue #12531
unsafe fn no_deref_ptr(a: Option<i32>, b: *const Option<i32>) -> i32 {
unsafe {
match a {
// `*b` being correct depends on `a == Some(_)`
Some(_) => (*b).unwrap_or_default(),
_ => 0,
}
}
}
const fn issue_12568(opt: Option<bool>) -> bool {
match opt {
Some(s) => s,
None => false,
}
}
fn issue_12569() {
let match_none_se = match 1u32.checked_div(0) {
Some(v) => v,
None => {
println!("important");
0
},
};
let match_some_se = match 1u32.checked_div(0) {
Some(v) => {
println!("important");
v
},
None => 0,
};
let iflet_else_se = if let Some(v) = 1u32.checked_div(0) {
v
} else {
println!("important");
0
};
let iflet_then_se = if let Some(v) = 1u32.checked_div(0) {
println!("important");
v
} else {
0
};
}
// Should not warn!
fn issue_12928() {
let x = Some((1, 2));
let y = if let Some((a, _)) = x { a } else { 0 };
let y = if let Some((a, ..)) = x { a } else { 0 };
let x = Some([1, 2]);
let y = if let Some([a, _]) = x { a } else { 0 };
let y = if let Some([a, ..]) = x { a } else { 0 };
struct X {
a: u8,
b: u8,
}
let x = Some(X { a: 0, b: 0 });
let y = if let Some(X { a, .. }) = x { a } else { 0 };
struct Y(u8, u8);
let x = Some(Y(0, 0));
let y = if let Some(Y(a, _)) = x { a } else { 0 };
let y = if let Some(Y(a, ..)) = x { a } else { 0 };
}
// For symmetry with `manual_unwrap_or` test
fn allowed_manual_unwrap_or_zero() -> u32 {
Some(42).unwrap_or_default()
}
mod issue14716 {
struct Foo {
name: Option<String>,
}
fn bar(project: &Foo) {
let _name = match project.name {
Some(ref x) => x,
None => "",
};
}
}
fn issue_15807() {
let uncopyable_res: Result<usize, String> = Ok(1);
let _ = if let Ok(v) = uncopyable_res { v } else { 0 };
let x = uncopyable_res;
let _ = x.unwrap_or_default();
//~^ manual_unwrap_or_default
let copyable_res: Result<usize, ()> = Ok(1);
let _ = copyable_res.unwrap_or_default();
//~^ manual_unwrap_or_default
let _ = copyable_res;
}