#![warn(clippy::unwrap_in_result)] #![allow(clippy::ok_expect)] struct A; impl A { // should not be detected fn good_divisible_by_3(i_str: String) -> Result { // checks whether a string represents a number divisible by 3 let i_result = i_str.parse::(); match i_result { Err(_e) => Err("Not a number".to_string()), Ok(i) => { if i % 3 == 0 { return Ok(true); } Err("Number is not divisible by 3".to_string()) }, } } // should be detected fn bad_divisible_by_3(i_str: String) -> Result { // checks whether a string represents a number divisible by 3 let i = i_str.parse::().unwrap(); //~^ unwrap_in_result if i % 3 == 0 { Ok(true) } else { Err("Number is not divisible by 3".to_string()) } } fn example_option_expect(i_str: String) -> Option { let i = i_str.parse::().ok().expect("not a number"); //~^ unwrap_in_result if i % 3 == 0 { return Some(true); } None } fn in_closure(a: Option) -> Option { // No lint inside a closure let c = || a.unwrap(); // But lint outside let a = c().then_some(true); let _ = a.unwrap(); //~^ unwrap_in_result None } const fn in_const_inside_fn() -> bool { const A: bool = { const fn inner(b: Option) -> Option { Some(b.unwrap()) //~^ unwrap_in_result } // No lint inside `const` inner(Some(true)).unwrap() }; A } fn in_static_inside_fn() -> bool { static A: bool = { const fn inner(b: Option) -> Option { Some(b.unwrap()) //~^ unwrap_in_result } // No lint inside `static` inner(Some(true)).unwrap() }; A } } macro_rules! mac { () => { Option::unwrap(Some(3)) }; } fn type_relative_unwrap() -> Option<()> { _ = Option::unwrap(Some(3)); //~^ unwrap_in_result // Do not lint macro output _ = mac!(); None } fn main() -> Result<(), ()> { A::bad_divisible_by_3("3".to_string()).unwrap(); //~^ unwrap_in_result A::good_divisible_by_3("3".to_string()).unwrap(); //~^ unwrap_in_result Result::unwrap(A::good_divisible_by_3("3".to_string())); //~^ unwrap_in_result Ok(()) }