-#![deny(unnecessary_unwrap)]
+// Copyright 2014-2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
+#![allow(clippy::if_same_then_else)]
fn main() {
let x = Some(());
if x.is_some() {
- x.unwrap();
+ x.unwrap(); // unnecessary
+ } else {
+ x.unwrap(); // will panic
}
if x.is_none() {
- // nothing to do here
+ x.unwrap(); // will panic
} else {
- x.unwrap();
+ x.unwrap(); // unnecessary
}
let mut x: Result<(), ()> = Ok(());
if x.is_ok() {
- x.unwrap();
+ x.unwrap(); // unnecessary
+ x.unwrap_err(); // will panic
} else {
- x.unwrap_err();
+ x.unwrap(); // will panic
+ x.unwrap_err(); // unnecessary
}
if x.is_err() {
- x.unwrap_err();
+ x.unwrap(); // will panic
+ x.unwrap_err(); // unnecessary
} else {
- x.unwrap();
+ x.unwrap(); // unnecessary
+ x.unwrap_err(); // will panic
}
if x.is_ok() {
x = Err(());
- x.unwrap();
+ x.unwrap(); // not unnecessary because of mutation of x
+ // it will always panic but the lint is not smart enough to see this (it only checks if conditions).
} else {
x = Ok(());
- x.unwrap_err();
+ x.unwrap_err(); // not unnecessary because of mutation of x
+ // it will always panic but the lint is not smart enough to see this (it only checks if conditions).
}
}
let x: Result<(), ()> = Ok(());
let y: Result<(), ()> = Ok(());
if x.is_ok() && y.is_err() {
- x.unwrap();
- y.unwrap_err();
+ x.unwrap(); // unnecessary
+ x.unwrap_err(); // will panic
+ y.unwrap(); // will panic
+ y.unwrap_err(); // unnecessary
} else {
- // not clear whether unwrappable:
+ // not statically determinable whether any of the following will always succeed or always fail:
+ x.unwrap();
x.unwrap_err();
y.unwrap();
+ y.unwrap_err();
}
if x.is_ok() || y.is_ok() {
- // not clear whether unwrappable:
+ // not statically determinable whether any of the following will always succeed or always fail:
x.unwrap();
y.unwrap();
} else {
- x.unwrap_err();
- y.unwrap_err();
+ x.unwrap(); // will panic
+ x.unwrap_err(); // unnecessary
+ y.unwrap(); // will panic
+ y.unwrap_err(); // unnecessary
}
let z: Result<(), ()> = Ok(());
if x.is_ok() && !(y.is_ok() || z.is_err()) {
- x.unwrap();
- y.unwrap_err();
- z.unwrap();
+ x.unwrap(); // unnecessary
+ x.unwrap_err(); // will panic
+ y.unwrap(); // will panic
+ y.unwrap_err(); // unnecessary
+ z.unwrap(); // unnecessary
+ z.unwrap_err(); // will panic
}
if x.is_ok() || !(y.is_ok() && z.is_err()) {
- // not clear what's unwrappable
- } else {
- x.unwrap_err();
+ // not statically determinable whether any of the following will always succeed or always fail:
+ x.unwrap();
y.unwrap();
- z.unwrap_err();
+ z.unwrap();
+ } else {
+ x.unwrap(); // will panic
+ x.unwrap_err(); // unnecessary
+ y.unwrap(); // unnecessary
+ y.unwrap_err(); // will panic
+ z.unwrap(); // will panic
+ z.unwrap_err(); // unnecessary
}
}
fn nested() {
let x = Some(());
if x.is_some() {
- x.unwrap();
+ x.unwrap(); // unnecessary
+ } else {
+ x.unwrap(); // will panic
}
}
}