This commit is contained in:
Ada Alakbarova 2025-10-24 20:29:29 +02:00
parent cd61be7c56
commit aa4869f27a
No known key found for this signature in database
9 changed files with 146 additions and 229 deletions

View file

@ -156,39 +156,52 @@ fn collect_unwrap_info<'tcx>(
}
}
match expr.kind {
ExprKind::Binary(op, left, right)
if matches!(
(invert, op.node),
(false, BinOpKind::And | BinOpKind::BitAnd) | (true, BinOpKind::Or | BinOpKind::BitOr)
) =>
{
let mut unwrap_info = collect_unwrap_info(cx, if_expr, left, branch, invert, false);
unwrap_info.extend(collect_unwrap_info(cx, if_expr, right, branch, invert, false));
unwrap_info
},
ExprKind::Unary(UnOp::Not, expr) => collect_unwrap_info(cx, if_expr, expr, branch, !invert, false),
ExprKind::MethodCall(method_name, receiver, [], _)
if let Some(local_id) = receiver.res_local_id()
&& let ty = cx.typeck_results().expr_ty(receiver)
&& let name = method_name.ident.name
&& let Some((kind, unwrappable)) = option_or_result_call(cx, ty, name) =>
{
let safe_to_unwrap = unwrappable != invert;
fn inner<'tcx>(
cx: &LateContext<'tcx>,
if_expr: &'tcx Expr<'_>,
expr: &'tcx Expr<'_>,
branch: &'tcx Expr<'_>,
invert: bool,
is_entire_condition: bool,
out: &mut Vec<UnwrapInfo<'tcx>>,
) {
match expr.kind {
ExprKind::Binary(op, left, right)
if matches!(
(invert, op.node),
(false, BinOpKind::And | BinOpKind::BitAnd) | (true, BinOpKind::Or | BinOpKind::BitOr)
) =>
{
inner(cx, if_expr, left, branch, invert, false, out);
inner(cx, if_expr, right, branch, invert, false, out);
},
ExprKind::Unary(UnOp::Not, expr) => inner(cx, if_expr, expr, branch, !invert, false, out),
ExprKind::MethodCall(method_name, receiver, [], _)
if let Some(local_id) = receiver.res_local_id()
&& let ty = cx.typeck_results().expr_ty(receiver)
&& let name = method_name.ident.name
&& let Some((kind, unwrappable)) = option_or_result_call(cx, ty, name) =>
{
let safe_to_unwrap = unwrappable != invert;
vec![UnwrapInfo {
local_id,
if_expr,
check: expr,
check_name: name,
branch,
safe_to_unwrap,
kind,
is_entire_condition,
}]
},
_ => vec![],
out.push(UnwrapInfo {
local_id,
if_expr,
check: expr,
check_name: name,
branch,
safe_to_unwrap,
kind,
is_entire_condition,
});
},
_ => {},
}
}
let mut out = vec![];
inner(cx, if_expr, expr, branch, invert, is_entire_condition, &mut out);
out
}
/// A HIR visitor delegate that checks if a local variable of type `Option` or `Result` is mutated,
@ -321,21 +334,14 @@ impl<'tcx> Visitor<'tcx> for UnwrappableVariablesVisitor<'_, 'tcx> {
&& let Some(id) = self_arg.res_local_id()
&& matches!(method_name.ident.name, sym::unwrap | sym::expect | sym::unwrap_err)
&& let call_to_unwrap = matches!(method_name.ident.name, sym::unwrap | sym::expect)
&& let Some(unwrappable) = self.unwrappables.iter()
.find(|u| u.local_id == id)
&& let Some(unwrappable) = self.unwrappables.iter().find(|u| u.local_id == id)
// Span contexts should not differ with the conditional branch
&& let span_ctxt = expr.span.ctxt()
&& unwrappable.branch.span.ctxt() == span_ctxt
&& unwrappable.check.span.ctxt() == span_ctxt
{
if call_to_unwrap == unwrappable.safe_to_unwrap {
let is_entire_condition = unwrappable.is_entire_condition;
let unwrappable_variable_name = self.cx.tcx.hir_name(unwrappable.local_id);
let suggested_pattern = if call_to_unwrap {
unwrappable.kind.success_variant_pattern()
} else {
unwrappable.kind.error_variant_pattern()
};
span_lint_hir_and_then(
self.cx,
@ -347,12 +353,17 @@ impl<'tcx> Visitor<'tcx> for UnwrappableVariablesVisitor<'_, 'tcx> {
method_name.ident.name, unwrappable.check_name,
),
|diag| {
if is_entire_condition {
if unwrappable.is_entire_condition {
diag.span_suggestion(
unwrappable.check.span.with_lo(unwrappable.if_expr.span.lo()),
"try",
format!(
"if let {suggested_pattern} = {borrow_prefix}{unwrappable_variable_name}",
suggested_pattern = if call_to_unwrap {
unwrappable.kind.success_variant_pattern()
} else {
unwrappable.kind.error_variant_pattern()
},
borrow_prefix = match as_ref_kind {
Some(AsRefKind::AsRef) => "&",
Some(AsRefKind::AsMut) => "&mut ",

View file

@ -1,27 +1,19 @@
#![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
#![allow(
clippy::if_same_then_else,
clippy::branches_sharing_code,
clippy::unnecessary_literal_unwrap
)]
#![warn(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
#![expect(clippy::branches_sharing_code, clippy::unnecessary_literal_unwrap)]
fn test_complex_conditions() {
let x: Result<(), ()> = Ok(());
let y: Result<(), ()> = Ok(());
if x.is_ok() && y.is_err() {
// unnecessary
x.unwrap();
//~^ unnecessary_unwrap
// will panic
x.unwrap_err();
//~^ panicking_unwrap
// will panic
y.unwrap();
//~^ panicking_unwrap
// unnecessary
y.unwrap_err();
//~^ unnecessary_unwrap
} else {
@ -37,45 +29,35 @@ fn test_complex_conditions() {
x.unwrap();
y.unwrap();
} else {
// will panic
x.unwrap();
//~^ panicking_unwrap
// unnecessary
x.unwrap_err();
//~^ unnecessary_unwrap
// will panic
y.unwrap();
//~^ panicking_unwrap
// unnecessary
y.unwrap_err();
//~^ unnecessary_unwrap
}
let z: Result<(), ()> = Ok(());
if x.is_ok() && !(y.is_ok() || z.is_err()) {
// unnecessary
x.unwrap();
//~^ unnecessary_unwrap
// will panic
x.unwrap_err();
//~^ panicking_unwrap
// will panic
y.unwrap();
//~^ panicking_unwrap
// unnecessary
y.unwrap_err();
//~^ unnecessary_unwrap
// unnecessary
z.unwrap();
//~^ unnecessary_unwrap
// will panic
z.unwrap_err();
//~^ panicking_unwrap
}
@ -85,27 +67,21 @@ fn test_complex_conditions() {
y.unwrap();
z.unwrap();
} else {
// will panic
x.unwrap();
//~^ panicking_unwrap
// unnecessary
x.unwrap_err();
//~^ unnecessary_unwrap
// unnecessary
y.unwrap();
//~^ unnecessary_unwrap
// will panic
y.unwrap_err();
//~^ panicking_unwrap
// will panic
z.unwrap();
//~^ panicking_unwrap
// unnecessary
z.unwrap_err();
//~^ unnecessary_unwrap
}

View file

@ -1,21 +1,17 @@
error: called `unwrap` on `x` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/complex_conditionals.rs:13:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:8:9
|
LL | if x.is_ok() && y.is_err() {
| --------- the check is happening here
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
|
= help: try using `if let` or `match`
note: the lint level is defined here
--> tests/ui/checked_unwrap/complex_conditionals.rs:1:35
|
LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: `-D clippy::unnecessary-unwrap` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_unwrap)]`
error: this call to `unwrap_err()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:17:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:11:9
|
LL | if x.is_ok() && y.is_err() {
| --------- because of this check
@ -23,14 +19,11 @@ LL | if x.is_ok() && y.is_err() {
LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
|
note: the lint level is defined here
--> tests/ui/checked_unwrap/complex_conditionals.rs:1:9
|
LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^
= note: `-D clippy::panicking-unwrap` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::panicking_unwrap)]`
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:21:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:14:9
|
LL | if x.is_ok() && y.is_err() {
| ---------- because of this check
@ -39,7 +32,7 @@ LL | y.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `y` after checking its variant with `is_err`
--> tests/ui/checked_unwrap/complex_conditionals.rs:25:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:17:9
|
LL | if x.is_ok() && y.is_err() {
| ---------- the check is happening here
@ -50,7 +43,7 @@ LL | y.unwrap_err();
= help: try using `if let` or `match`
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:41:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:32:9
|
LL | if x.is_ok() || y.is_ok() {
| --------- because of this check
@ -59,7 +52,7 @@ LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `x` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/complex_conditionals.rs:45:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:35:9
|
LL | if x.is_ok() || y.is_ok() {
| --------- the check is happening here
@ -70,7 +63,7 @@ LL | x.unwrap_err();
= help: try using `if let` or `match`
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:49:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:38:9
|
LL | if x.is_ok() || y.is_ok() {
| --------- because of this check
@ -79,7 +72,7 @@ LL | y.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `y` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/complex_conditionals.rs:53:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:41:9
|
LL | if x.is_ok() || y.is_ok() {
| --------- the check is happening here
@ -90,18 +83,17 @@ LL | y.unwrap_err();
= help: try using `if let` or `match`
error: called `unwrap` on `x` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/complex_conditionals.rs:59:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:46:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| --------- the check is happening here
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
|
= help: try using `if let` or `match`
error: this call to `unwrap_err()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:63:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:49:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| --------- because of this check
@ -110,7 +102,7 @@ LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:67:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:52:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| --------- because of this check
@ -119,7 +111,7 @@ LL | y.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `y` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/complex_conditionals.rs:71:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:55:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| --------- the check is happening here
@ -130,7 +122,7 @@ LL | y.unwrap_err();
= help: try using `if let` or `match`
error: called `unwrap` on `z` after checking its variant with `is_err`
--> tests/ui/checked_unwrap/complex_conditionals.rs:75:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:58:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| ---------- the check is happening here
@ -141,7 +133,7 @@ LL | z.unwrap();
= help: try using `if let` or `match`
error: this call to `unwrap_err()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:79:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:61:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| ---------- because of this check
@ -150,7 +142,7 @@ LL | z.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:89:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:70:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| --------- because of this check
@ -159,7 +151,7 @@ LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `x` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/complex_conditionals.rs:93:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:73:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| --------- the check is happening here
@ -170,7 +162,7 @@ LL | x.unwrap_err();
= help: try using `if let` or `match`
error: called `unwrap` on `y` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/complex_conditionals.rs:97:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:76:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| --------- the check is happening here
@ -181,7 +173,7 @@ LL | y.unwrap();
= help: try using `if let` or `match`
error: this call to `unwrap_err()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:101:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:79:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| --------- because of this check
@ -190,7 +182,7 @@ LL | y.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals.rs:105:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:82:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| ---------- because of this check
@ -199,7 +191,7 @@ LL | z.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `z` after checking its variant with `is_err`
--> tests/ui/checked_unwrap/complex_conditionals.rs:109:9
--> tests/ui/checked_unwrap/complex_conditionals.rs:85:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| ---------- the check is happening here

View file

@ -1,19 +1,14 @@
#![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
#![allow(
clippy::if_same_then_else,
clippy::branches_sharing_code,
clippy::unnecessary_literal_unwrap
)]
//@no-rustfix: has placeholders
#![warn(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
#![expect(clippy::branches_sharing_code, clippy::unnecessary_literal_unwrap)]
fn test_nested() {
fn nested() {
let x = Some(());
if x.is_some() {
// unnecessary
x.unwrap();
//~^ unnecessary_unwrap
} else {
// will panic
x.unwrap();
//~^ panicking_unwrap
}

View file

@ -1,20 +1,16 @@
error: called `unwrap` on `x` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/complex_conditionals_nested.rs:13:13
--> tests/ui/checked_unwrap/complex_conditionals_nested.rs:9:13
|
LL | if x.is_some() {
| -------------- help: try: `if let Some(<item>) = x`
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
|
note: the lint level is defined here
--> tests/ui/checked_unwrap/complex_conditionals_nested.rs:1:35
|
LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: `-D clippy::unnecessary-unwrap` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_unwrap)]`
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/complex_conditionals_nested.rs:17:13
--> tests/ui/checked_unwrap/complex_conditionals_nested.rs:12:13
|
LL | if x.is_some() {
| ----------- because of this check
@ -22,11 +18,8 @@ LL | if x.is_some() {
LL | x.unwrap();
| ^^^^^^^^^^
|
note: the lint level is defined here
--> tests/ui/checked_unwrap/complex_conditionals_nested.rs:1:9
|
LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^
= note: `-D clippy::panicking-unwrap` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::panicking_unwrap)]`
error: aborting due to 2 previous errors

View file

@ -1,5 +1,5 @@
//@require-annotations-for-level: ERROR
#![deny(clippy::unnecessary_unwrap)]
#![warn(clippy::unnecessary_unwrap)]
#[clippy::msrv = "1.85"]
fn if_let_chains_unsupported(a: Option<u32>, b: Option<u32>) {

View file

@ -8,11 +8,8 @@ LL | println!("the value of a is {}", a.unwrap());
| ^^^^^^^^^^
|
= help: try using `match`
note: the lint level is defined here
--> tests/ui/checked_unwrap/if_let_chains.rs:2:9
|
LL | #![deny(clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: `-D clippy::unnecessary-unwrap` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_unwrap)]`
error: called `unwrap` on `a` after checking its variant with `is_none`
--> tests/ui/checked_unwrap/if_let_chains.rs:20:42

View file

@ -1,6 +1,6 @@
//@no-rustfix: has placeholders
#![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
#![allow(
#![warn(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
#![expect(
clippy::if_same_then_else,
clippy::branches_sharing_code,
clippy::unnecessary_literal_unwrap
@ -9,7 +9,6 @@
macro_rules! m {
($a:expr) => {
if $a.is_some() {
// unnecessary
$a.unwrap();
//~^ unnecessary_unwrap
}
@ -43,90 +42,71 @@ macro_rules! checks_some {
fn main() {
let x = Some(());
if x.is_some() {
// unnecessary
x.unwrap();
//~^ unnecessary_unwrap
// unnecessary
x.expect("an error message");
//~^ unnecessary_unwrap
} else {
// will panic
x.unwrap();
//~^ panicking_unwrap
// will panic
x.expect("an error message");
//~^ panicking_unwrap
}
if x.is_none() {
// will panic
x.unwrap();
//~^ panicking_unwrap
} else {
// unnecessary
x.unwrap();
//~^ unnecessary_unwrap
}
m!(x);
// ok
checks_in_param!(x.is_some(), x.unwrap());
// ok
checks_unwrap!(x, x.unwrap());
// ok
checks_some!(x.is_some(), x);
let mut x: Result<(), ()> = Ok(());
if x.is_ok() {
// unnecessary
x.unwrap();
//~^ unnecessary_unwrap
// unnecessary
x.expect("an error message");
//~^ unnecessary_unwrap
// will panic
x.unwrap_err();
//~^ panicking_unwrap
} else {
// will panic
x.unwrap();
//~^ panicking_unwrap
// will panic
x.expect("an error message");
//~^ panicking_unwrap
// unnecessary
x.unwrap_err();
//~^ unnecessary_unwrap
}
if x.is_err() {
// will panic
x.unwrap();
//~^ panicking_unwrap
// unnecessary
x.unwrap_err();
//~^ unnecessary_unwrap
} else {
// unnecessary
x.unwrap();
//~^ unnecessary_unwrap
// will panic
x.unwrap_err();
//~^ panicking_unwrap
}
if x.is_ok() {
x = Err(());
// not unnecessary because of mutation of x
// 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).
x.unwrap();
} else {
x = Ok(());
// not unnecessary because of mutation of x
// 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).
x.unwrap_err();
@ -175,13 +155,11 @@ fn issue11371() {
//~^ panicking_unwrap
}
// This should not lint. Statics are, at the time of writing, not linted on anyway,
// but if at some point they are supported by this lint, it should correctly see that
// `X` is being mutated and not suggest `if let Some(..) = X {}`
// This should not lint and suggest `if let Some(..) = X {}`, as `X` is being mutated
static mut X: Option<i32> = Some(123);
unsafe {
#[expect(static_mut_refs)]
if X.is_some() {
//~^ ERROR: creating a shared reference
X = None;
X.unwrap();
}
@ -299,17 +277,13 @@ fn check_expect() {
let x = Some(());
if x.is_some() {
#[expect(clippy::unnecessary_unwrap)]
// unnecessary
x.unwrap();
#[expect(clippy::unnecessary_unwrap)]
// unnecessary
x.expect("an error message");
} else {
#[expect(clippy::panicking_unwrap)]
// will panic
x.unwrap();
#[expect(clippy::panicking_unwrap)]
// will panic
x.expect("an error message");
}
}

View file

@ -1,44 +1,37 @@
error: called `unwrap` on `x` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/simple_conditionals.rs:47:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:45:9
|
LL | if x.is_some() {
| -------------- help: try: `if let Some(<item>) = x`
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
|
note: the lint level is defined here
--> tests/ui/checked_unwrap/simple_conditionals.rs:2:35
|
LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: `-D clippy::unnecessary-unwrap` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::unnecessary_unwrap)]`
error: called `expect` on `x` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/simple_conditionals.rs:48:9
|
LL | if x.is_some() {
| -------------- help: try: `if let Some(<item>) = x`
...
LL | x.expect("an error message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:51:9
|
LL | if x.is_some() {
| -------------- help: try: `if let Some(<item>) = x`
...
LL | x.expect("an error message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:55:9
|
LL | if x.is_some() {
| ----------- because of this check
...
LL | x.unwrap();
| ^^^^^^^^^^
|
note: the lint level is defined here
--> tests/ui/checked_unwrap/simple_conditionals.rs:2:9
|
LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^
= note: `-D clippy::panicking-unwrap` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::panicking_unwrap)]`
error: this call to `expect()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:59:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:54:9
|
LL | if x.is_some() {
| ----------- because of this check
@ -47,16 +40,15 @@ LL | x.expect("an error message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:64:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:58:9
|
LL | if x.is_none() {
| ----------- because of this check
LL | // will panic
LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap` on `x` after checking its variant with `is_none`
--> tests/ui/checked_unwrap/simple_conditionals.rs:68:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:61:9
|
LL | if x.is_none() {
| -------------- help: try: `if let Some(<item>) = x`
@ -65,11 +57,10 @@ LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap` on `x` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/simple_conditionals.rs:13:13
--> tests/ui/checked_unwrap/simple_conditionals.rs:12:13
|
LL | if $a.is_some() {
| --------------- help: try: `if let Some(<item>) = x`
LL | // unnecessary
LL | $a.unwrap();
| ^^^^^^^^^^^
...
@ -79,16 +70,15 @@ LL | m!(x);
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
error: called `unwrap` on `x` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/simple_conditionals.rs:81:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:70:9
|
LL | if x.is_ok() {
| ------------ help: try: `if let Ok(<item>) = x`
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
error: called `expect` on `x` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/simple_conditionals.rs:85:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:73:9
|
LL | if x.is_ok() {
| ------------ help: try: `if let Ok(<item>) = x`
@ -97,7 +87,7 @@ LL | x.expect("an error message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap_err()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:89:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:76:9
|
LL | if x.is_ok() {
| --------- because of this check
@ -106,7 +96,7 @@ LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:93:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:79:9
|
LL | if x.is_ok() {
| --------- because of this check
@ -115,7 +105,7 @@ LL | x.unwrap();
| ^^^^^^^^^^
error: this call to `expect()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:97:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:82:9
|
LL | if x.is_ok() {
| --------- because of this check
@ -124,7 +114,7 @@ LL | x.expect("an error message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `unwrap_err` on `x` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/simple_conditionals.rs:101:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:85:9
|
LL | if x.is_ok() {
| ------------ help: try: `if let Err(<item>) = x`
@ -133,16 +123,15 @@ LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:106:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:89:9
|
LL | if x.is_err() {
| ---------- because of this check
LL | // will panic
LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `x` after checking its variant with `is_err`
--> tests/ui/checked_unwrap/simple_conditionals.rs:110:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:92:9
|
LL | if x.is_err() {
| ------------- help: try: `if let Err(<item>) = x`
@ -151,7 +140,7 @@ LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: called `unwrap` on `x` after checking its variant with `is_err`
--> tests/ui/checked_unwrap/simple_conditionals.rs:114:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:95:9
|
LL | if x.is_err() {
| ------------- help: try: `if let Ok(<item>) = x`
@ -160,7 +149,7 @@ LL | x.unwrap();
| ^^^^^^^^^^
error: this call to `unwrap_err()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:118:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:98:9
|
LL | if x.is_err() {
| ---------- because of this check
@ -169,7 +158,7 @@ LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: called `unwrap` on `option` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/simple_conditionals.rs:143:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:123:9
|
LL | if option.is_some() {
| ------------------- help: try: `if let Some(<item>) = &option`
@ -177,7 +166,7 @@ LL | option.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:146:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:126:9
|
LL | if option.is_some() {
| ---------------- because of this check
@ -186,7 +175,7 @@ LL | option.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: called `unwrap` on `result` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/simple_conditionals.rs:153:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:133:9
|
LL | if result.is_ok() {
| ----------------- help: try: `if let Ok(<item>) = &result`
@ -194,7 +183,7 @@ LL | result.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:156:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:136:9
|
LL | if result.is_ok() {
| -------------- because of this check
@ -203,7 +192,7 @@ LL | result.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: called `unwrap` on `option` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/simple_conditionals.rs:162:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:142:9
|
LL | if option.is_some() {
| ------------------- help: try: `if let Some(<item>) = &mut option`
@ -211,7 +200,7 @@ LL | option.as_mut().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:165:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:145:9
|
LL | if option.is_some() {
| ---------------- because of this check
@ -220,7 +209,7 @@ LL | option.as_mut().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: called `unwrap` on `result` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/simple_conditionals.rs:171:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:151:9
|
LL | if result.is_ok() {
| ----------------- help: try: `if let Ok(<item>) = &mut result`
@ -228,7 +217,7 @@ LL | result.as_mut().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:174:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:154:9
|
LL | if result.is_ok() {
| -------------- because of this check
@ -237,7 +226,7 @@ LL | result.as_mut().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: called `unwrap` on `option` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/simple_conditionals.rs:205:17
--> tests/ui/checked_unwrap/simple_conditionals.rs:183:17
|
LL | if option.is_some() {
| ------------------- help: try: `if let Some(<item>) = &option`
@ -245,7 +234,7 @@ LL | let _ = option.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:208:17
--> tests/ui/checked_unwrap/simple_conditionals.rs:186:17
|
LL | if option.is_some() {
| ---------------- because of this check
@ -254,7 +243,7 @@ LL | let _ = option.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: called `unwrap` on `result` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/simple_conditionals.rs:216:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:194:9
|
LL | if result.is_ok() {
| ----------------- help: try: `if let Ok(<item>) = &result`
@ -263,7 +252,7 @@ LL | result.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:220:9
--> tests/ui/checked_unwrap/simple_conditionals.rs:198:9
|
LL | if result.is_ok() {
| -------------- because of this check
@ -272,7 +261,7 @@ LL | result.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: called `unwrap` on `x` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/simple_conditionals.rs:246:17
--> tests/ui/checked_unwrap/simple_conditionals.rs:224:17
|
LL | if x.is_some() {
| -------------- help: try: `if let Some(<item>) = x`
@ -280,7 +269,7 @@ LL | _ = x.unwrap();
| ^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:249:17
--> tests/ui/checked_unwrap/simple_conditionals.rs:227:17
|
LL | if x.is_some() {
| ----------- because of this check
@ -289,7 +278,7 @@ LL | _ = x.unwrap();
| ^^^^^^^^^^
error: called `unwrap` on `r` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/simple_conditionals.rs:255:17
--> tests/ui/checked_unwrap/simple_conditionals.rs:233:17
|
LL | if r.is_ok() {
| ------------ help: try: `if let Ok(<item>) = &r`
@ -297,7 +286,7 @@ LL | _ = r.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:258:17
--> tests/ui/checked_unwrap/simple_conditionals.rs:236:17
|
LL | if r.is_ok() {
| --------- because of this check
@ -306,7 +295,7 @@ LL | _ = r.as_ref().unwrap();
| ^^^^^^^^^^^^^^^^^^^
error: called `unwrap` on `x` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/simple_conditionals.rs:267:17
--> tests/ui/checked_unwrap/simple_conditionals.rs:245:17
|
LL | if x.is_some() {
| -------------- help: try: `if let Some(<item>) = x`
@ -314,7 +303,7 @@ LL | _ = x.unwrap();
| ^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:270:17
--> tests/ui/checked_unwrap/simple_conditionals.rs:248:17
|
LL | if x.is_some() {
| ----------- because of this check
@ -323,7 +312,7 @@ LL | _ = x.unwrap();
| ^^^^^^^^^^
error: called `unwrap` on `option` after checking its variant with `is_some`
--> tests/ui/checked_unwrap/simple_conditionals.rs:280:26
--> tests/ui/checked_unwrap/simple_conditionals.rs:258:26
|
LL | if option.is_some() {
| ------------------- help: try: `if let Some(<item>) = option`
@ -331,7 +320,7 @@ LL | println!("{:?}", option.unwrap());
| ^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:283:26
--> tests/ui/checked_unwrap/simple_conditionals.rs:261:26
|
LL | if option.is_some() {
| ---------------- because of this check
@ -340,7 +329,7 @@ LL | println!("{:?}", option.unwrap());
| ^^^^^^^^^^^^^^^
error: called `unwrap` on `result` after checking its variant with `is_ok`
--> tests/ui/checked_unwrap/simple_conditionals.rs:290:26
--> tests/ui/checked_unwrap/simple_conditionals.rs:268:26
|
LL | if result.is_ok() {
| ----------------- help: try: `if let Ok(<item>) = result`
@ -348,7 +337,7 @@ LL | println!("{:?}", result.unwrap());
| ^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> tests/ui/checked_unwrap/simple_conditionals.rs:293:26
--> tests/ui/checked_unwrap/simple_conditionals.rs:271:26
|
LL | if result.is_ok() {
| -------------- because of this check
@ -356,15 +345,5 @@ LL | if result.is_ok() {
LL | println!("{:?}", result.unwrap());
| ^^^^^^^^^^^^^^^
error: creating a shared reference to mutable static
--> tests/ui/checked_unwrap/simple_conditionals.rs:183:12
|
LL | if X.is_some() {
| ^^^^^^^^^^^ shared reference to mutable static
|
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2024/static-mut-references.html>
= note: shared references to mutable statics are dangerous; it's undefined behavior if the static is mutated or if a mutable reference is created for it while the shared reference lives
= note: `#[deny(static_mut_refs)]` (part of `#[deny(rust_2024_compatibility)]`) on by default
error: aborting due to 40 previous errors
error: aborting due to 39 previous errors