Migrating restriction lints to span_lint_and_then (e -> i)

This commit is contained in:
xFrednet 2024-07-21 11:00:02 +02:00
parent a9d72c7107
commit 0532104247
No known key found for this signature in database
GPG Key ID: F5C59D0E669E5302
20 changed files with 665 additions and 204 deletions

View File

@ -77,7 +77,6 @@ fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) {
}, },
_ => return, _ => return,
}; };
#[expect(clippy::collapsible_span_lint_calls, reason = "rust-clippy#7797")]
span_lint_and_then(cx, ASSERTIONS_ON_RESULT_STATES, macro_call.span, message, |diag| { span_lint_and_then(cx, ASSERTIONS_ON_RESULT_STATES, macro_call.span, message, |diag| {
let semicolon = if is_expr_final_block_expr(cx.tcx, e) { ";" } else { "" }; let semicolon = if is_expr_final_block_expr(cx.tcx, e) { ";" } else { "" };
let mut app = Applicability::MachineApplicable; let mut app = Applicability::MachineApplicable;

View File

@ -1,6 +1,6 @@
use clippy_utils::diagnostics::span_lint_and_sugg; use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::source::snippet_with_applicability; use clippy_utils::source::snippet_with_applicability;
use rustc_errors::Applicability; use rustc_errors::{Applicability, SuggestionStyle};
use rustc_hir::Expr; use rustc_hir::Expr;
use rustc_lint::LateContext; use rustc_lint::LateContext;
use rustc_middle::ty::{self, Ty}; use rustc_middle::ty::{self, Ty};
@ -14,21 +14,24 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, cast_expr: &Expr<'_>,
_ => { /* continue to checks */ }, _ => { /* continue to checks */ },
} }
match cast_from.kind() { if let ty::FnDef(..) | ty::FnPtr(_) = cast_from.kind() {
ty::FnDef(..) | ty::FnPtr(_) => {
let mut applicability = Applicability::MaybeIncorrect; let mut applicability = Applicability::MaybeIncorrect;
let from_snippet = snippet_with_applicability(cx, cast_expr.span, "..", &mut applicability); let from_snippet = snippet_with_applicability(cx, cast_expr.span, "..", &mut applicability);
span_lint_and_sugg( span_lint_and_then(
cx, cx,
FN_TO_NUMERIC_CAST_ANY, FN_TO_NUMERIC_CAST_ANY,
expr.span, expr.span,
format!("casting function pointer `{from_snippet}` to `{cast_to}`"), format!("casting function pointer `{from_snippet}` to `{cast_to}`"),
|diag| {
diag.span_suggestion_with_style(
expr.span,
"did you mean to invoke the function?", "did you mean to invoke the function?",
format!("{from_snippet}() as {cast_to}"), format!("{from_snippet}() as {cast_to}"),
applicability, applicability,
SuggestionStyle::ShowAlways,
); );
}, },
_ => {}, );
} }
} }

View File

@ -1,6 +1,6 @@
//! Lint on if expressions with an else if, but without a final else branch. //! Lint on if expressions with an else if, but without a final else branch.
use clippy_utils::diagnostics::span_lint_and_help; use clippy_utils::diagnostics::span_lint_and_then;
use rustc_ast::ast::{Expr, ExprKind}; use rustc_ast::ast::{Expr, ExprKind};
use rustc_lint::{EarlyContext, EarlyLintPass, LintContext}; use rustc_lint::{EarlyContext, EarlyLintPass, LintContext};
use rustc_middle::lint::in_external_macro; use rustc_middle::lint::in_external_macro;
@ -54,13 +54,15 @@ fn check_expr(&mut self, cx: &EarlyContext<'_>, item: &Expr) {
&& let ExprKind::If(_, _, None) = els.kind && let ExprKind::If(_, _, None) = els.kind
&& !in_external_macro(cx.sess(), item.span) && !in_external_macro(cx.sess(), item.span)
{ {
span_lint_and_help( #[expect(clippy::collapsible_span_lint_calls, reason = "rust-clippy#7797")]
span_lint_and_then(
cx, cx,
ELSE_IF_WITHOUT_ELSE, ELSE_IF_WITHOUT_ELSE,
els.span, els.span,
"`if` expression with an `else if`, but without a final `else`", "`if` expression with an `else if`, but without a final `else`",
None, |diag| {
"add an `else` block here", diag.help("add an `else` block here");
},
); );
} }
} }

View File

@ -1,4 +1,4 @@
use clippy_utils::diagnostics::span_lint_and_sugg; use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::peel_blocks; use clippy_utils::peel_blocks;
use rustc_errors::Applicability; use rustc_errors::Applicability;
use rustc_hir::{Body, ExprKind, Impl, ImplItemKind, Item, ItemKind, Node}; use rustc_hir::{Body, ExprKind, Impl, ImplItemKind, Item, ItemKind, Node};
@ -50,15 +50,14 @@ fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) {
&& block.stmts.is_empty() && block.stmts.is_empty()
&& block.expr.is_none() && block.expr.is_none()
{ {
span_lint_and_sugg( span_lint_and_then(cx, EMPTY_DROP, item.span, "empty drop implementation", |diag| {
cx, diag.span_suggestion_hidden(
EMPTY_DROP,
item.span, item.span,
"empty drop implementation",
"try removing this impl", "try removing this impl",
String::new(), String::new(),
Applicability::MaybeIncorrect, Applicability::MaybeIncorrect,
); );
});
} }
} }
} }

View File

@ -88,11 +88,11 @@ fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) {
&& !attrs.iter().any(|a| a.has_name(sym::non_exhaustive)) && !attrs.iter().any(|a| a.has_name(sym::non_exhaustive))
&& fields.iter().all(|f| cx.tcx.visibility(f.def_id).is_public()) && fields.iter().all(|f| cx.tcx.visibility(f.def_id).is_public())
{ {
span_lint_and_then(cx, lint, item.span, msg, |diag| {
let suggestion_span = item.span.shrink_to_lo(); let suggestion_span = item.span.shrink_to_lo();
let indent = " ".repeat(indent_of(cx, item.span).unwrap_or(0)); let indent = " ".repeat(indent_of(cx, item.span).unwrap_or(0));
span_lint_and_then(cx, lint, item.span, msg, |diag| {
let sugg = format!("#[non_exhaustive]\n{indent}"); let sugg = format!("#[non_exhaustive]\n{indent}");
diag.span_suggestion( diag.span_suggestion_verbose(
suggestion_span, suggestion_span,
"try adding #[non_exhaustive]", "try adding #[non_exhaustive]",
sugg, sugg,

View File

@ -1,4 +1,4 @@
use clippy_utils::diagnostics::span_lint_and_help; use clippy_utils::diagnostics::span_lint_and_then;
use rustc_ast::ast::{Item, ItemKind, VisibilityKind}; use rustc_ast::ast::{Item, ItemKind, VisibilityKind};
use rustc_lint::{EarlyContext, EarlyLintPass}; use rustc_lint::{EarlyContext, EarlyLintPass};
use rustc_session::declare_lint_pass; use rustc_session::declare_lint_pass;
@ -62,13 +62,15 @@ fn check_item(&mut self, cx: &EarlyContext<'_>, item: &Item) {
// pub(self) is equivalent to not using pub at all, so we ignore it // pub(self) is equivalent to not using pub at all, so we ignore it
continue; continue;
} }
span_lint_and_help( #[expect(clippy::collapsible_span_lint_calls, reason = "rust-clippy#7797")]
span_lint_and_then(
cx, cx,
FIELD_SCOPED_VISIBILITY_MODIFIERS, FIELD_SCOPED_VISIBILITY_MODIFIERS,
field.vis.span, field.vis.span,
"scoped visibility modifier on a field", "scoped visibility modifier on a field",
None, |diag| {
"consider making the field private and adding a scoped visibility method for it", diag.help("consider making the field private and adding a scoped visibility method for it");
},
); );
} }
} }

View File

@ -1,4 +1,4 @@
use clippy_utils::diagnostics::span_lint_and_help; use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::ty::is_type_lang_item; use clippy_utils::ty::is_type_lang_item;
use clippy_utils::{higher, match_def_path, paths}; use clippy_utils::{higher, match_def_path, paths};
use rustc_hir::{BinOpKind, Expr, ExprKind, LangItem, MatchSource}; use rustc_hir::{BinOpKind, Expr, ExprKind, LangItem, MatchSource};
@ -81,13 +81,15 @@ fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
_ => return, _ => return,
}; };
if is_format(cx, arg) { if is_format(cx, arg) {
span_lint_and_help( #[expect(clippy::collapsible_span_lint_calls, reason = "rust-clippy#7797")]
span_lint_and_then(
cx, cx,
FORMAT_PUSH_STRING, FORMAT_PUSH_STRING,
expr.span, expr.span,
"`format!(..)` appended to existing `String`", "`format!(..)` appended to existing `String`",
None, |diag| {
"consider using `write!` to avoid the extra allocation", diag.help("consider using `write!` to avoid the extra allocation");
},
); );
} }
} }

View File

@ -1,6 +1,6 @@
use clippy_config::msrvs::{self, Msrv}; use clippy_config::msrvs::{self, Msrv};
use clippy_config::Conf; use clippy_config::Conf;
use clippy_utils::diagnostics::span_lint_and_help; use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::eager_or_lazy::switch_to_eager_eval; use clippy_utils::eager_or_lazy::switch_to_eager_eval;
use clippy_utils::source::snippet_with_context; use clippy_utils::source::snippet_with_context;
use clippy_utils::sugg::Sugg; use clippy_utils::sugg::Sugg;
@ -81,32 +81,39 @@ fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
&& self.msrv.meets(msrvs::BOOL_THEN) && self.msrv.meets(msrvs::BOOL_THEN)
&& !contains_return(then_block.stmts) && !contains_return(then_block.stmts)
{ {
let method_name = if switch_to_eager_eval(cx, expr) && self.msrv.meets(msrvs::BOOL_THEN_SOME) {
"then_some"
} else {
"then"
};
span_lint_and_then(
cx,
IF_THEN_SOME_ELSE_NONE,
expr.span,
format!("this could be simplified with `bool::{method_name}`"),
|diag| {
let mut app = Applicability::Unspecified; let mut app = Applicability::Unspecified;
let cond_snip = Sugg::hir_with_context(cx, cond, expr.span.ctxt(), "[condition]", &mut app) let cond_snip = Sugg::hir_with_context(cx, cond, expr.span.ctxt(), "[condition]", &mut app)
.maybe_par() .maybe_par()
.to_string(); .to_string();
let arg_snip = snippet_with_context(cx, then_arg.span, ctxt, "[body]", &mut app).0; let arg_snip = snippet_with_context(cx, then_arg.span, ctxt, "[body]", &mut app).0;
let mut method_body = if then_block.stmts.is_empty() { let method_body = if let Some(first_stmt) = then_block.stmts.first() {
let (block_snippet, _) =
snippet_with_context(cx, first_stmt.span.until(then_arg.span), ctxt, "..", &mut app);
let closure = if method_name == "then" { "|| " } else { "" };
format!("{closure} {{ {block_snippet}; {arg_snip} }}")
} else {
arg_snip.into_owned() arg_snip.into_owned()
} else {
format!("{{ /* snippet */ {arg_snip} }}")
};
let method_name = if switch_to_eager_eval(cx, expr) && self.msrv.meets(msrvs::BOOL_THEN_SOME) {
"then_some"
} else {
method_body.insert_str(0, "|| ");
"then"
}; };
let help = diag.span_suggestion(
format!("consider using `bool::{method_name}` like: `{cond_snip}.{method_name}({method_body})`",);
span_lint_and_help(
cx,
IF_THEN_SOME_ELSE_NONE,
expr.span, expr.span,
format!("this could be simplified with `bool::{method_name}`"), "try",
None, format!("{cond_snip}.{method_name}({method_body})"),
help, app,
);
},
); );
} }
} }

View File

@ -3,7 +3,7 @@
use clippy_utils::visitors::for_each_expr_without_closures; use clippy_utils::visitors::for_each_expr_without_closures;
use clippy_utils::{get_async_fn_body, is_async_fn, is_from_proc_macro}; use clippy_utils::{get_async_fn_body, is_async_fn, is_from_proc_macro};
use core::ops::ControlFlow; use core::ops::ControlFlow;
use rustc_errors::Applicability; use rustc_errors::{Applicability, SuggestionStyle};
use rustc_hir::intravisit::FnKind; use rustc_hir::intravisit::FnKind;
use rustc_hir::{Block, Body, Expr, ExprKind, FnDecl, FnRetTy, HirId}; use rustc_hir::{Block, Body, Expr, ExprKind, FnDecl, FnRetTy, HirId};
use rustc_lint::{LateContext, LateLintPass, LintContext}; use rustc_lint::{LateContext, LateLintPass, LintContext};
@ -45,8 +45,6 @@
declare_lint_pass!(ImplicitReturn => [IMPLICIT_RETURN]); declare_lint_pass!(ImplicitReturn => [IMPLICIT_RETURN]);
fn lint_return(cx: &LateContext<'_>, emission_place: HirId, span: Span) { fn lint_return(cx: &LateContext<'_>, emission_place: HirId, span: Span) {
let mut app = Applicability::MachineApplicable;
let snip = snippet_with_applicability(cx, span, "..", &mut app);
span_lint_hir_and_then( span_lint_hir_and_then(
cx, cx,
IMPLICIT_RETURN, IMPLICIT_RETURN,
@ -54,14 +52,20 @@ fn lint_return(cx: &LateContext<'_>, emission_place: HirId, span: Span) {
span, span,
"missing `return` statement", "missing `return` statement",
|diag| { |diag| {
diag.span_suggestion(span, "add `return` as shown", format!("return {snip}"), app); let mut app = Applicability::MachineApplicable;
let snip = snippet_with_applicability(cx, span, "..", &mut app);
diag.span_suggestion_with_style(
span,
"add `return` as shown",
format!("return {snip}"),
app,
SuggestionStyle::ShowAlways,
);
}, },
); );
} }
fn lint_break(cx: &LateContext<'_>, emission_place: HirId, break_span: Span, expr_span: Span) { fn lint_break(cx: &LateContext<'_>, emission_place: HirId, break_span: Span, expr_span: Span) {
let mut app = Applicability::MachineApplicable;
let snip = snippet_with_context(cx, expr_span, break_span.ctxt(), "..", &mut app).0;
span_lint_hir_and_then( span_lint_hir_and_then(
cx, cx,
IMPLICIT_RETURN, IMPLICIT_RETURN,
@ -69,11 +73,14 @@ fn lint_break(cx: &LateContext<'_>, emission_place: HirId, break_span: Span, exp
break_span, break_span,
"missing `return` statement", "missing `return` statement",
|diag| { |diag| {
diag.span_suggestion( let mut app = Applicability::MachineApplicable;
let snip = snippet_with_context(cx, expr_span, break_span.ctxt(), "..", &mut app).0;
diag.span_suggestion_with_style(
break_span, break_span,
"change `break` to `return` as shown", "change `break` to `return` as shown",
format!("return {snip}"), format!("return {snip}"),
app, app,
SuggestionStyle::ShowAlways,
); );
}, },
); );

View File

@ -186,7 +186,7 @@ fn lint_and_text(&self) -> (&'static Lint, &'static str, &'static str) {
} }
} }
fn display(&self, num_lit: NumericLiteral<'_>, cx: &EarlyContext<'_>, span: Span) { fn display(&self, num_lit: &NumericLiteral<'_>, cx: &EarlyContext<'_>, span: Span) {
let (lint, message, try_msg) = self.lint_and_text(); let (lint, message, try_msg) = self.lint_and_text();
#[expect(clippy::collapsible_span_lint_calls, reason = "rust-clippy#7797")] #[expect(clippy::collapsible_span_lint_calls, reason = "rust-clippy#7797")]
span_lint_and_then(cx, lint, span, message, |diag| { span_lint_and_then(cx, lint, span, message, |diag| {
@ -269,7 +269,7 @@ fn check_lit(&self, cx: &EarlyContext<'_>, lit: token::Lit, span: Span) {
WarningType::DecimalRepresentation | WarningType::MistypedLiteralSuffix => true, WarningType::DecimalRepresentation | WarningType::MistypedLiteralSuffix => true,
}; };
if should_warn { if should_warn {
warning_type.display(num_lit, cx, span); warning_type.display(&num_lit, cx, span);
} }
} }
} }
@ -450,7 +450,7 @@ fn check_lit(&self, cx: &EarlyContext<'_>, lit: token::Lit, span: Span) {
let hex = format!("{val:#X}"); let hex = format!("{val:#X}");
let num_lit = NumericLiteral::new(&hex, num_lit.suffix, false); let num_lit = NumericLiteral::new(&hex, num_lit.suffix, false);
let _: Result<(), ()> = Self::do_lint(num_lit.integer).map_err(|warning_type| { let _: Result<(), ()> = Self::do_lint(num_lit.integer).map_err(|warning_type| {
warning_type.display(num_lit, cx, span); warning_type.display(&num_lit, cx, span);
}); });
} }
} }

View File

@ -1,4 +1,4 @@
use clippy_utils::diagnostics::span_lint_and_help; use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::get_parent_expr; use clippy_utils::get_parent_expr;
use clippy_utils::ty::is_type_diagnostic_item; use clippy_utils::ty::is_type_diagnostic_item;
use rustc_hir as hir; use rustc_hir as hir;
@ -33,6 +33,9 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr
span = expr.span; span = expr.span;
} }
let lint_msg = format!("`{lint_unary}FileType::is_file()` only {verb} regular files"); let lint_msg = format!("`{lint_unary}FileType::is_file()` only {verb} regular files");
let help_msg = format!("use `{help_unary}FileType::is_dir()` instead");
span_lint_and_help(cx, FILETYPE_IS_FILE, span, lint_msg, None, help_msg); #[expect(clippy::collapsible_span_lint_calls, reason = "rust-clippy#7797")]
span_lint_and_then(cx, FILETYPE_IS_FILE, span, lint_msg, |diag| {
diag.help(format!("use `{help_unary}FileType::is_dir()` instead"));
});
} }

View File

@ -1,5 +1,5 @@
use super::utils::derefs_to_slice; use super::utils::derefs_to_slice;
use clippy_utils::diagnostics::span_lint_and_sugg; use clippy_utils::diagnostics::span_lint_and_then;
use clippy_utils::get_parent_expr; use clippy_utils::get_parent_expr;
use clippy_utils::source::snippet_with_applicability; use clippy_utils::source::snippet_with_applicability;
use clippy_utils::ty::is_type_diagnostic_item; use clippy_utils::ty::is_type_diagnostic_item;
@ -19,9 +19,7 @@ pub(super) fn check<'tcx>(
) { ) {
// Note: we don't want to lint `get_mut().unwrap` for `HashMap` or `BTreeMap`, // Note: we don't want to lint `get_mut().unwrap` for `HashMap` or `BTreeMap`,
// because they do not implement `IndexMut` // because they do not implement `IndexMut`
let mut applicability = Applicability::MachineApplicable;
let expr_ty = cx.typeck_results().expr_ty(recv); let expr_ty = cx.typeck_results().expr_ty(recv);
let get_args_str = snippet_with_applicability(cx, get_arg.span, "..", &mut applicability);
let caller_type = if derefs_to_slice(cx, recv, expr_ty).is_some() { let caller_type = if derefs_to_slice(cx, recv, expr_ty).is_some() {
"slice" "slice"
} else if is_type_diagnostic_item(cx, expr_ty, sym::Vec) { } else if is_type_diagnostic_item(cx, expr_ty, sym::Vec) {
@ -58,6 +56,16 @@ pub(super) fn check<'tcx>(
}; };
let mut_str = if is_mut { "_mut" } else { "" }; let mut_str = if is_mut { "_mut" } else { "" };
span_lint_and_then(
cx,
GET_UNWRAP,
span,
format!("called `.get{mut_str}().unwrap()` on a {caller_type}"),
|diag| {
let mut applicability = Applicability::MachineApplicable;
let get_args_str = snippet_with_applicability(cx, get_arg.span, "..", &mut applicability);
let borrow_str = if !needs_ref { let borrow_str = if !needs_ref {
"" ""
} else if is_mut { } else if is_mut {
@ -66,16 +74,16 @@ pub(super) fn check<'tcx>(
"&" "&"
}; };
span_lint_and_sugg( diag.span_suggestion_with_style(
cx,
GET_UNWRAP,
span, span,
format!("called `.get{mut_str}().unwrap()` on a {caller_type}. Using `[]` is more clear and more concise"), "using `[]` is clearer and more concise",
"try",
format!( format!(
"{borrow_str}{}[{get_args_str}]", "{borrow_str}{}[{get_args_str}]",
snippet_with_applicability(cx, recv.span, "..", &mut applicability) snippet_with_applicability(cx, recv.span, "..", &mut applicability)
), ),
applicability, applicability,
rustc_errors::SuggestionStyle::ShowAlways,
);
},
); );
} }

View File

@ -1,11 +1,15 @@
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui-toml/unwrap_used/unwrap_used.rs:38:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:38:17
| |
LL | let _ = boxed_slice.get(1).unwrap(); LL | let _ = boxed_slice.get(1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&boxed_slice[1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
= note: `-D clippy::get-unwrap` implied by `-D warnings` = note: `-D clippy::get-unwrap` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::get_unwrap)]` = help: to override `-D warnings` add `#[allow(clippy::get_unwrap)]`
help: using `[]` is clearer and more concise
|
LL | let _ = &boxed_slice[1];
| ~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:38:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:38:17
@ -18,11 +22,16 @@ LL | let _ = boxed_slice.get(1).unwrap();
= note: `-D clippy::unwrap-used` implied by `-D warnings` = note: `-D clippy::unwrap-used` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::unwrap_used)]` = help: to override `-D warnings` add `#[allow(clippy::unwrap_used)]`
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui-toml/unwrap_used/unwrap_used.rs:39:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:39:17
| |
LL | let _ = some_slice.get(0).unwrap(); LL | let _ = some_slice.get(0).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_slice[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_slice[0];
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:39:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:39:17
@ -33,11 +42,16 @@ LL | let _ = some_slice.get(0).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a Vec
--> tests/ui-toml/unwrap_used/unwrap_used.rs:40:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:40:17
| |
LL | let _ = some_vec.get(0).unwrap(); LL | let _ = some_vec.get(0).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_vec[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_vec[0];
| ~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:40:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:40:17
@ -48,11 +62,16 @@ LL | let _ = some_vec.get(0).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a VecDeque. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a VecDeque
--> tests/ui-toml/unwrap_used/unwrap_used.rs:41:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:41:17
| |
LL | let _ = some_vecdeque.get(0).unwrap(); LL | let _ = some_vecdeque.get(0).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_vecdeque[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_vecdeque[0];
| ~~~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:41:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:41:17
@ -63,11 +82,16 @@ LL | let _ = some_vecdeque.get(0).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a HashMap
--> tests/ui-toml/unwrap_used/unwrap_used.rs:42:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:42:17
| |
LL | let _ = some_hashmap.get(&1).unwrap(); LL | let _ = some_hashmap.get(&1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_hashmap[&1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_hashmap[&1];
| ~~~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:42:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:42:17
@ -78,11 +102,16 @@ LL | let _ = some_hashmap.get(&1).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a BTreeMap. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a BTreeMap
--> tests/ui-toml/unwrap_used/unwrap_used.rs:43:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:43:17
| |
LL | let _ = some_btreemap.get(&1).unwrap(); LL | let _ = some_btreemap.get(&1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_btreemap[&1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_btreemap[&1];
| ~~~~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:43:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:43:17
@ -93,11 +122,16 @@ LL | let _ = some_btreemap.get(&1).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui-toml/unwrap_used/unwrap_used.rs:47:21 --> tests/ui-toml/unwrap_used/unwrap_used.rs:47:21
| |
LL | let _: u8 = *boxed_slice.get(1).unwrap(); LL | let _: u8 = *boxed_slice.get(1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `boxed_slice[1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _: u8 = boxed_slice[1];
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:47:22 --> tests/ui-toml/unwrap_used/unwrap_used.rs:47:22
@ -108,11 +142,16 @@ LL | let _: u8 = *boxed_slice.get(1).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a slice
--> tests/ui-toml/unwrap_used/unwrap_used.rs:52:9 --> tests/ui-toml/unwrap_used/unwrap_used.rs:52:9
| |
LL | *boxed_slice.get_mut(0).unwrap() = 1; LL | *boxed_slice.get_mut(0).unwrap() = 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `boxed_slice[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | boxed_slice[0] = 1;
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:52:10 --> tests/ui-toml/unwrap_used/unwrap_used.rs:52:10
@ -123,11 +162,16 @@ LL | *boxed_slice.get_mut(0).unwrap() = 1;
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a slice
--> tests/ui-toml/unwrap_used/unwrap_used.rs:53:9 --> tests/ui-toml/unwrap_used/unwrap_used.rs:53:9
| |
LL | *some_slice.get_mut(0).unwrap() = 1; LL | *some_slice.get_mut(0).unwrap() = 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_slice[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | some_slice[0] = 1;
| ~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:53:10 --> tests/ui-toml/unwrap_used/unwrap_used.rs:53:10
@ -138,11 +182,16 @@ LL | *some_slice.get_mut(0).unwrap() = 1;
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a Vec
--> tests/ui-toml/unwrap_used/unwrap_used.rs:54:9 --> tests/ui-toml/unwrap_used/unwrap_used.rs:54:9
| |
LL | *some_vec.get_mut(0).unwrap() = 1; LL | *some_vec.get_mut(0).unwrap() = 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_vec[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | some_vec[0] = 1;
| ~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:54:10 --> tests/ui-toml/unwrap_used/unwrap_used.rs:54:10
@ -153,11 +202,16 @@ LL | *some_vec.get_mut(0).unwrap() = 1;
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a VecDeque. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a VecDeque
--> tests/ui-toml/unwrap_used/unwrap_used.rs:55:9 --> tests/ui-toml/unwrap_used/unwrap_used.rs:55:9
| |
LL | *some_vecdeque.get_mut(0).unwrap() = 1; LL | *some_vecdeque.get_mut(0).unwrap() = 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_vecdeque[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | some_vecdeque[0] = 1;
| ~~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:55:10 --> tests/ui-toml/unwrap_used/unwrap_used.rs:55:10
@ -168,11 +222,16 @@ LL | *some_vecdeque.get_mut(0).unwrap() = 1;
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a Vec
--> tests/ui-toml/unwrap_used/unwrap_used.rs:67:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:67:17
| |
LL | let _ = some_vec.get(0..1).unwrap().to_vec(); LL | let _ = some_vec.get(0..1).unwrap().to_vec();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_vec[0..1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = some_vec[0..1].to_vec();
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:67:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:67:17
@ -183,11 +242,16 @@ LL | let _ = some_vec.get(0..1).unwrap().to_vec();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a Vec
--> tests/ui-toml/unwrap_used/unwrap_used.rs:68:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:68:17
| |
LL | let _ = some_vec.get_mut(0..1).unwrap().to_vec(); LL | let _ = some_vec.get_mut(0..1).unwrap().to_vec();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_vec[0..1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = some_vec[0..1].to_vec();
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui-toml/unwrap_used/unwrap_used.rs:68:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:68:17
@ -198,17 +262,27 @@ LL | let _ = some_vec.get_mut(0..1).unwrap().to_vec();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui-toml/unwrap_used/unwrap_used.rs:75:13 --> tests/ui-toml/unwrap_used/unwrap_used.rs:75:13
| |
LL | let _ = boxed_slice.get(1).unwrap(); LL | let _ = boxed_slice.get(1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&boxed_slice[1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &boxed_slice[1];
| ~~~~~~~~~~~~~~~
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui-toml/unwrap_used/unwrap_used.rs:93:17 --> tests/ui-toml/unwrap_used/unwrap_used.rs:93:17
| |
LL | let _ = Box::new([0]).get(1).unwrap(); LL | let _ = Box::new([0]).get(1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&Box::new([0])[1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &Box::new([0])[1];
| ~~~~~~~~~~~~~~~~~
error: aborting due to 28 previous errors error: aborting due to 28 previous errors

View File

@ -4,10 +4,11 @@ error: empty drop implementation
LL | / impl Drop for Foo { LL | / impl Drop for Foo {
LL | | fn drop(&mut self) {} LL | | fn drop(&mut self) {}
LL | | } LL | | }
| |_^ help: try removing this impl | |_^
| |
= note: `-D clippy::empty-drop` implied by `-D warnings` = note: `-D clippy::empty-drop` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::empty_drop)]` = help: to override `-D warnings` add `#[allow(clippy::empty_drop)]`
= help: try removing this impl
error: empty drop implementation error: empty drop implementation
--> tests/ui/empty_drop.rs:23:1 --> tests/ui/empty_drop.rs:23:1
@ -17,7 +18,9 @@ LL | | fn drop(&mut self) {
LL | | {} LL | | {}
LL | | } LL | | }
LL | | } LL | | }
| |_^ help: try removing this impl | |_^
|
= help: try removing this impl
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View File

@ -2,106 +2,190 @@ error: casting function pointer `foo` to `i8`
--> tests/ui/fn_to_numeric_cast_any.rs:23:13 --> tests/ui/fn_to_numeric_cast_any.rs:23:13
| |
LL | let _ = foo as i8; LL | let _ = foo as i8;
| ^^^^^^^^^ help: did you mean to invoke the function?: `foo() as i8` | ^^^^^^^^^
| |
= note: `-D clippy::fn-to-numeric-cast-any` implied by `-D warnings` = note: `-D clippy::fn-to-numeric-cast-any` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::fn_to_numeric_cast_any)]` = help: to override `-D warnings` add `#[allow(clippy::fn_to_numeric_cast_any)]`
help: did you mean to invoke the function?
|
LL | let _ = foo() as i8;
| ~~~~~~~~~~~
error: casting function pointer `foo` to `i16` error: casting function pointer `foo` to `i16`
--> tests/ui/fn_to_numeric_cast_any.rs:26:13 --> tests/ui/fn_to_numeric_cast_any.rs:26:13
| |
LL | let _ = foo as i16; LL | let _ = foo as i16;
| ^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as i16` | ^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as i16;
| ~~~~~~~~~~~~
error: casting function pointer `foo` to `i32` error: casting function pointer `foo` to `i32`
--> tests/ui/fn_to_numeric_cast_any.rs:28:13 --> tests/ui/fn_to_numeric_cast_any.rs:28:13
| |
LL | let _ = foo as i32; LL | let _ = foo as i32;
| ^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as i32` | ^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as i32;
| ~~~~~~~~~~~~
error: casting function pointer `foo` to `i64` error: casting function pointer `foo` to `i64`
--> tests/ui/fn_to_numeric_cast_any.rs:30:13 --> tests/ui/fn_to_numeric_cast_any.rs:30:13
| |
LL | let _ = foo as i64; LL | let _ = foo as i64;
| ^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as i64` | ^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as i64;
| ~~~~~~~~~~~~
error: casting function pointer `foo` to `i128` error: casting function pointer `foo` to `i128`
--> tests/ui/fn_to_numeric_cast_any.rs:32:13 --> tests/ui/fn_to_numeric_cast_any.rs:32:13
| |
LL | let _ = foo as i128; LL | let _ = foo as i128;
| ^^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as i128` | ^^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as i128;
| ~~~~~~~~~~~~~
error: casting function pointer `foo` to `isize` error: casting function pointer `foo` to `isize`
--> tests/ui/fn_to_numeric_cast_any.rs:34:13 --> tests/ui/fn_to_numeric_cast_any.rs:34:13
| |
LL | let _ = foo as isize; LL | let _ = foo as isize;
| ^^^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as isize` | ^^^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as isize;
| ~~~~~~~~~~~~~~
error: casting function pointer `foo` to `u8` error: casting function pointer `foo` to `u8`
--> tests/ui/fn_to_numeric_cast_any.rs:37:13 --> tests/ui/fn_to_numeric_cast_any.rs:37:13
| |
LL | let _ = foo as u8; LL | let _ = foo as u8;
| ^^^^^^^^^ help: did you mean to invoke the function?: `foo() as u8` | ^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as u8;
| ~~~~~~~~~~~
error: casting function pointer `foo` to `u16` error: casting function pointer `foo` to `u16`
--> tests/ui/fn_to_numeric_cast_any.rs:39:13 --> tests/ui/fn_to_numeric_cast_any.rs:39:13
| |
LL | let _ = foo as u16; LL | let _ = foo as u16;
| ^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as u16` | ^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as u16;
| ~~~~~~~~~~~~
error: casting function pointer `foo` to `u32` error: casting function pointer `foo` to `u32`
--> tests/ui/fn_to_numeric_cast_any.rs:41:13 --> tests/ui/fn_to_numeric_cast_any.rs:41:13
| |
LL | let _ = foo as u32; LL | let _ = foo as u32;
| ^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as u32` | ^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as u32;
| ~~~~~~~~~~~~
error: casting function pointer `foo` to `u64` error: casting function pointer `foo` to `u64`
--> tests/ui/fn_to_numeric_cast_any.rs:43:13 --> tests/ui/fn_to_numeric_cast_any.rs:43:13
| |
LL | let _ = foo as u64; LL | let _ = foo as u64;
| ^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as u64` | ^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as u64;
| ~~~~~~~~~~~~
error: casting function pointer `foo` to `u128` error: casting function pointer `foo` to `u128`
--> tests/ui/fn_to_numeric_cast_any.rs:45:13 --> tests/ui/fn_to_numeric_cast_any.rs:45:13
| |
LL | let _ = foo as u128; LL | let _ = foo as u128;
| ^^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as u128` | ^^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as u128;
| ~~~~~~~~~~~~~
error: casting function pointer `foo` to `usize` error: casting function pointer `foo` to `usize`
--> tests/ui/fn_to_numeric_cast_any.rs:47:13 --> tests/ui/fn_to_numeric_cast_any.rs:47:13
| |
LL | let _ = foo as usize; LL | let _ = foo as usize;
| ^^^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as usize` | ^^^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as usize;
| ~~~~~~~~~~~~~~
error: casting function pointer `Struct::static_method` to `usize` error: casting function pointer `Struct::static_method` to `usize`
--> tests/ui/fn_to_numeric_cast_any.rs:52:13 --> tests/ui/fn_to_numeric_cast_any.rs:52:13
| |
LL | let _ = Struct::static_method as usize; LL | let _ = Struct::static_method as usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: did you mean to invoke the function?: `Struct::static_method() as usize` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = Struct::static_method() as usize;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: casting function pointer `f` to `usize` error: casting function pointer `f` to `usize`
--> tests/ui/fn_to_numeric_cast_any.rs:57:5 --> tests/ui/fn_to_numeric_cast_any.rs:57:5
| |
LL | f as usize LL | f as usize
| ^^^^^^^^^^ help: did you mean to invoke the function?: `f() as usize` | ^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | f() as usize
|
error: casting function pointer `T::static_method` to `usize` error: casting function pointer `T::static_method` to `usize`
--> tests/ui/fn_to_numeric_cast_any.rs:62:5 --> tests/ui/fn_to_numeric_cast_any.rs:62:5
| |
LL | T::static_method as usize LL | T::static_method as usize
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: did you mean to invoke the function?: `T::static_method() as usize` | ^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | T::static_method() as usize
|
error: casting function pointer `(clos as fn(u32) -> u32)` to `usize` error: casting function pointer `(clos as fn(u32) -> u32)` to `usize`
--> tests/ui/fn_to_numeric_cast_any.rs:69:13 --> tests/ui/fn_to_numeric_cast_any.rs:69:13
| |
LL | let _ = (clos as fn(u32) -> u32) as usize; LL | let _ = (clos as fn(u32) -> u32) as usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: did you mean to invoke the function?: `(clos as fn(u32) -> u32)() as usize` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = (clos as fn(u32) -> u32)() as usize;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: casting function pointer `foo` to `*const ()` error: casting function pointer `foo` to `*const ()`
--> tests/ui/fn_to_numeric_cast_any.rs:74:13 --> tests/ui/fn_to_numeric_cast_any.rs:74:13
| |
LL | let _ = foo as *const (); LL | let _ = foo as *const ();
| ^^^^^^^^^^^^^^^^ help: did you mean to invoke the function?: `foo() as *const ()` | ^^^^^^^^^^^^^^^^
|
help: did you mean to invoke the function?
|
LL | let _ = foo() as *const ();
| ~~~~~~~~~~~~~~~~~~
error: aborting due to 17 previous errors error: aborting due to 17 previous errors

View File

@ -1,14 +1,18 @@
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui/get_unwrap.rs:37:17 --> tests/ui/get_unwrap.rs:37:17
| |
LL | let _ = boxed_slice.get(1).unwrap(); LL | let _ = boxed_slice.get(1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&boxed_slice[1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
note: the lint level is defined here note: the lint level is defined here
--> tests/ui/get_unwrap.rs:9:9 --> tests/ui/get_unwrap.rs:9:9
| |
LL | #![deny(clippy::get_unwrap)] LL | #![deny(clippy::get_unwrap)]
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
help: using `[]` is clearer and more concise
|
LL | let _ = &boxed_slice[1];
| ~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:37:17 --> tests/ui/get_unwrap.rs:37:17
@ -21,11 +25,16 @@ LL | let _ = boxed_slice.get(1).unwrap();
= note: `-D clippy::unwrap-used` implied by `-D warnings` = note: `-D clippy::unwrap-used` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::unwrap_used)]` = help: to override `-D warnings` add `#[allow(clippy::unwrap_used)]`
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui/get_unwrap.rs:38:17 --> tests/ui/get_unwrap.rs:38:17
| |
LL | let _ = some_slice.get(0).unwrap(); LL | let _ = some_slice.get(0).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_slice[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_slice[0];
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:38:17 --> tests/ui/get_unwrap.rs:38:17
@ -36,11 +45,16 @@ LL | let _ = some_slice.get(0).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a Vec
--> tests/ui/get_unwrap.rs:39:17 --> tests/ui/get_unwrap.rs:39:17
| |
LL | let _ = some_vec.get(0).unwrap(); LL | let _ = some_vec.get(0).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_vec[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_vec[0];
| ~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:39:17 --> tests/ui/get_unwrap.rs:39:17
@ -51,11 +65,16 @@ LL | let _ = some_vec.get(0).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a VecDeque. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a VecDeque
--> tests/ui/get_unwrap.rs:40:17 --> tests/ui/get_unwrap.rs:40:17
| |
LL | let _ = some_vecdeque.get(0).unwrap(); LL | let _ = some_vecdeque.get(0).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_vecdeque[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_vecdeque[0];
| ~~~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:40:17 --> tests/ui/get_unwrap.rs:40:17
@ -66,11 +85,16 @@ LL | let _ = some_vecdeque.get(0).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a HashMap
--> tests/ui/get_unwrap.rs:41:17 --> tests/ui/get_unwrap.rs:41:17
| |
LL | let _ = some_hashmap.get(&1).unwrap(); LL | let _ = some_hashmap.get(&1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_hashmap[&1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_hashmap[&1];
| ~~~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:41:17 --> tests/ui/get_unwrap.rs:41:17
@ -81,11 +105,16 @@ LL | let _ = some_hashmap.get(&1).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a BTreeMap. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a BTreeMap
--> tests/ui/get_unwrap.rs:42:17 --> tests/ui/get_unwrap.rs:42:17
| |
LL | let _ = some_btreemap.get(&1).unwrap(); LL | let _ = some_btreemap.get(&1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&some_btreemap[&1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = &some_btreemap[&1];
| ~~~~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:42:17 --> tests/ui/get_unwrap.rs:42:17
@ -96,11 +125,16 @@ LL | let _ = some_btreemap.get(&1).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui/get_unwrap.rs:46:21 --> tests/ui/get_unwrap.rs:46:21
| |
LL | let _: u8 = *boxed_slice.get(1).unwrap(); LL | let _: u8 = *boxed_slice.get(1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `boxed_slice[1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _: u8 = boxed_slice[1];
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:46:22 --> tests/ui/get_unwrap.rs:46:22
@ -111,11 +145,16 @@ LL | let _: u8 = *boxed_slice.get(1).unwrap();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a slice
--> tests/ui/get_unwrap.rs:51:9 --> tests/ui/get_unwrap.rs:51:9
| |
LL | *boxed_slice.get_mut(0).unwrap() = 1; LL | *boxed_slice.get_mut(0).unwrap() = 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `boxed_slice[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | boxed_slice[0] = 1;
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:51:10 --> tests/ui/get_unwrap.rs:51:10
@ -126,11 +165,16 @@ LL | *boxed_slice.get_mut(0).unwrap() = 1;
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a slice
--> tests/ui/get_unwrap.rs:52:9 --> tests/ui/get_unwrap.rs:52:9
| |
LL | *some_slice.get_mut(0).unwrap() = 1; LL | *some_slice.get_mut(0).unwrap() = 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_slice[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | some_slice[0] = 1;
| ~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:52:10 --> tests/ui/get_unwrap.rs:52:10
@ -141,11 +185,16 @@ LL | *some_slice.get_mut(0).unwrap() = 1;
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a Vec
--> tests/ui/get_unwrap.rs:53:9 --> tests/ui/get_unwrap.rs:53:9
| |
LL | *some_vec.get_mut(0).unwrap() = 1; LL | *some_vec.get_mut(0).unwrap() = 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_vec[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | some_vec[0] = 1;
| ~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:53:10 --> tests/ui/get_unwrap.rs:53:10
@ -156,11 +205,16 @@ LL | *some_vec.get_mut(0).unwrap() = 1;
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a VecDeque. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a VecDeque
--> tests/ui/get_unwrap.rs:54:9 --> tests/ui/get_unwrap.rs:54:9
| |
LL | *some_vecdeque.get_mut(0).unwrap() = 1; LL | *some_vecdeque.get_mut(0).unwrap() = 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_vecdeque[0]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | some_vecdeque[0] = 1;
| ~~~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:54:10 --> tests/ui/get_unwrap.rs:54:10
@ -171,11 +225,16 @@ LL | *some_vecdeque.get_mut(0).unwrap() = 1;
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a Vec
--> tests/ui/get_unwrap.rs:66:17 --> tests/ui/get_unwrap.rs:66:17
| |
LL | let _ = some_vec.get(0..1).unwrap().to_vec(); LL | let _ = some_vec.get(0..1).unwrap().to_vec();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_vec[0..1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = some_vec[0..1].to_vec();
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:66:17 --> tests/ui/get_unwrap.rs:66:17
@ -186,11 +245,16 @@ LL | let _ = some_vec.get(0..1).unwrap().to_vec();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a Vec
--> tests/ui/get_unwrap.rs:67:17 --> tests/ui/get_unwrap.rs:67:17
| |
LL | let _ = some_vec.get_mut(0..1).unwrap().to_vec(); LL | let _ = some_vec.get_mut(0..1).unwrap().to_vec();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `some_vec[0..1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _ = some_vec[0..1].to_vec();
| ~~~~~~~~~~~~~~
error: used `unwrap()` on an `Option` value error: used `unwrap()` on an `Option` value
--> tests/ui/get_unwrap.rs:67:17 --> tests/ui/get_unwrap.rs:67:17
@ -201,29 +265,49 @@ LL | let _ = some_vec.get_mut(0..1).unwrap().to_vec();
= note: if this value is `None`, it will panic = note: if this value is `None`, it will panic
= help: consider using `expect()` to provide a better panic message = help: consider using `expect()` to provide a better panic message
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui/get_unwrap.rs:77:24 --> tests/ui/get_unwrap.rs:77:24
| |
LL | let _x: &i32 = f.get(1 + 2).unwrap(); LL | let _x: &i32 = f.get(1 + 2).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `&f[1 + 2]` | ^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _x: &i32 = &f[1 + 2];
| ~~~~~~~~~
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui/get_unwrap.rs:80:18 --> tests/ui/get_unwrap.rs:80:18
| |
LL | let _x = f.get(1 + 2).unwrap().to_string(); LL | let _x = f.get(1 + 2).unwrap().to_string();
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `f[1 + 2]` | ^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _x = f[1 + 2].to_string();
| ~~~~~~~~
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get().unwrap()` on a slice
--> tests/ui/get_unwrap.rs:83:18 --> tests/ui/get_unwrap.rs:83:18
| |
LL | let _x = f.get(1 + 2).unwrap().abs(); LL | let _x = f.get(1 + 2).unwrap().abs();
| ^^^^^^^^^^^^^^^^^^^^^ help: try: `f[1 + 2]` | ^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let _x = f[1 + 2].abs();
| ~~~~~~~~
error: called `.get_mut().unwrap()` on a slice. Using `[]` is more clear and more concise error: called `.get_mut().unwrap()` on a slice
--> tests/ui/get_unwrap.rs:100:33 --> tests/ui/get_unwrap.rs:100:33
| |
LL | let b = rest.get_mut(linidx(j, k) - linidx(i, k) - 1).unwrap(); LL | let b = rest.get_mut(linidx(j, k) - linidx(i, k) - 1).unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&mut rest[linidx(j, k) - linidx(i, k) - 1]` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: using `[]` is clearer and more concise
|
LL | let b = &mut rest[linidx(j, k) - linidx(i, k) - 1];
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 30 previous errors error: aborting due to 30 previous errors

View File

@ -0,0 +1,119 @@
#![warn(clippy::if_then_some_else_none)]
#![allow(clippy::redundant_pattern_matching, clippy::unnecessary_lazy_evaluations)]
fn main() {
// Should issue an error.
let _ = foo().then(|| { println!("true!"); "foo" });
// Should issue an error when macros are used.
let _ = matches!(true, true).then(|| { println!("true!"); matches!(true, false) });
// Should issue an error. Binary expression `o < 32` should be parenthesized.
let x = Some(5);
let _ = x.and_then(|o| (o < 32).then_some(o));
//~^ ERROR: this could be simplified with `bool::then_some`
// Should issue an error. Unary expression `!x` should be parenthesized.
let x = true;
let _ = (!x).then_some(0);
//~^ ERROR: this could be simplified with `bool::then_some`
// Should not issue an error since the `else` block has a statement besides `None`.
let _ = if foo() {
println!("true!");
Some("foo")
} else {
eprintln!("false...");
None
};
// Should not issue an error since there are more than 2 blocks in the if-else chain.
let _ = if foo() {
println!("foo true!");
Some("foo")
} else if bar() {
println!("bar true!");
Some("bar")
} else {
None
};
let _ = if foo() {
println!("foo true!");
Some("foo")
} else {
bar().then(|| {
println!("bar true!");
"bar"
})
};
// Should not issue an error since the `then` block has `None`, not `Some`.
let _ = if foo() { None } else { Some("foo is false") };
// Should not issue an error since the `else` block doesn't use `None` directly.
let _ = if foo() { Some("foo is true") } else { into_none() };
// Should not issue an error since the `then` block doesn't use `Some` directly.
let _ = if foo() { into_some("foo") } else { None };
}
#[clippy::msrv = "1.49"]
fn _msrv_1_49() {
// `bool::then` was stabilized in 1.50. Do not lint this
let _ = if foo() {
println!("true!");
Some(149)
} else {
None
};
}
#[clippy::msrv = "1.50"]
fn _msrv_1_50() {
let _ = foo().then(|| { println!("true!"); 150 });
}
fn foo() -> bool {
unimplemented!()
}
fn bar() -> bool {
unimplemented!()
}
fn into_some<T>(v: T) -> Option<T> {
Some(v)
}
fn into_none<T>() -> Option<T> {
None
}
// Should not warn
fn f(b: bool, v: Option<()>) -> Option<()> {
if b {
v?; // This is a potential early return, is not equivalent with `bool::then`
Some(())
} else {
None
}
}
fn issue11394(b: bool, v: Result<(), ()>) -> Result<(), ()> {
let x = if b {
#[allow(clippy::let_unit_value)]
let _ = v?;
Some(())
} else {
None
};
Ok(())
}
const fn issue12103(x: u32) -> Option<u32> {
// Should not issue an error in `const` context
if x > 42 { Some(150) } else { None }
}

View File

@ -1,5 +1,5 @@
#![warn(clippy::if_then_some_else_none)] #![warn(clippy::if_then_some_else_none)]
#![allow(clippy::redundant_pattern_matching)] #![allow(clippy::redundant_pattern_matching, clippy::unnecessary_lazy_evaluations)]
fn main() { fn main() {
// Should issue an error. // Should issue an error.

View File

@ -9,9 +9,8 @@ LL | | Some("foo")
LL | | } else { LL | | } else {
LL | | None LL | | None
LL | | }; LL | | };
| |_____^ | |_____^ help: try: `foo().then(|| { println!("true!"); "foo" })`
| |
= help: consider using `bool::then` like: `foo().then(|| { /* snippet */ "foo" })`
= note: `-D clippy::if-then-some-else-none` implied by `-D warnings` = note: `-D clippy::if-then-some-else-none` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::if_then_some_else_none)]` = help: to override `-D warnings` add `#[allow(clippy::if_then_some_else_none)]`
@ -26,25 +25,19 @@ LL | | Some(matches!(true, false))
LL | | } else { LL | | } else {
LL | | None LL | | None
LL | | }; LL | | };
| |_____^ | |_____^ help: try: `matches!(true, true).then(|| { println!("true!"); matches!(true, false) })`
|
= help: consider using `bool::then` like: `matches!(true, true).then(|| { /* snippet */ matches!(true, false) })`
error: this could be simplified with `bool::then_some` error: this could be simplified with `bool::then_some`
--> tests/ui/if_then_some_else_none.rs:25:28 --> tests/ui/if_then_some_else_none.rs:25:28
| |
LL | let _ = x.and_then(|o| if o < 32 { Some(o) } else { None }); LL | let _ = x.and_then(|o| if o < 32 { Some(o) } else { None });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(o < 32).then_some(o)`
|
= help: consider using `bool::then_some` like: `(o < 32).then_some(o)`
error: this could be simplified with `bool::then_some` error: this could be simplified with `bool::then_some`
--> tests/ui/if_then_some_else_none.rs:30:13 --> tests/ui/if_then_some_else_none.rs:30:13
| |
LL | let _ = if !x { Some(0) } else { None }; LL | let _ = if !x { Some(0) } else { None };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(!x).then_some(0)`
|
= help: consider using `bool::then_some` like: `(!x).then_some(0)`
error: this could be simplified with `bool::then` error: this could be simplified with `bool::then`
--> tests/ui/if_then_some_else_none.rs:86:13 --> tests/ui/if_then_some_else_none.rs:86:13
@ -57,9 +50,7 @@ LL | | Some(150)
LL | | } else { LL | | } else {
LL | | None LL | | None
LL | | }; LL | | };
| |_____^ | |_____^ help: try: `foo().then(|| { println!("true!"); 150 })`
|
= help: consider using `bool::then` like: `foo().then(|| { /* snippet */ 150 })`
error: aborting due to 5 previous errors error: aborting due to 5 previous errors

View File

@ -2,88 +2,157 @@ error: missing `return` statement
--> tests/ui/implicit_return.rs:15:5 --> tests/ui/implicit_return.rs:15:5
| |
LL | true LL | true
| ^^^^ help: add `return` as shown: `return true` | ^^^^
| |
= note: `-D clippy::implicit-return` implied by `-D warnings` = note: `-D clippy::implicit-return` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::implicit_return)]` = help: to override `-D warnings` add `#[allow(clippy::implicit_return)]`
help: add `return` as shown
|
LL | return true
|
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:19:15 --> tests/ui/implicit_return.rs:19:15
| |
LL | if true { true } else { false } LL | if true { true } else { false }
| ^^^^ help: add `return` as shown: `return true` | ^^^^
|
help: add `return` as shown
|
LL | if true { return true } else { false }
| ~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:19:29 --> tests/ui/implicit_return.rs:19:29
| |
LL | if true { true } else { false } LL | if true { true } else { false }
| ^^^^^ help: add `return` as shown: `return false` | ^^^^^
|
help: add `return` as shown
|
LL | if true { true } else { return false }
| ~~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:25:17 --> tests/ui/implicit_return.rs:25:17
| |
LL | true => false, LL | true => false,
| ^^^^^ help: add `return` as shown: `return false` | ^^^^^
|
help: add `return` as shown
|
LL | true => return false,
| ~~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:26:20 --> tests/ui/implicit_return.rs:26:20
| |
LL | false => { true }, LL | false => { true },
| ^^^^ help: add `return` as shown: `return true` | ^^^^
|
help: add `return` as shown
|
LL | false => { return true },
| ~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:39:9 --> tests/ui/implicit_return.rs:39:9
| |
LL | break true; LL | break true;
| ^^^^^^^^^^ help: change `break` to `return` as shown: `return true` | ^^^^^^^^^^
|
help: change `break` to `return` as shown
|
LL | return true;
| ~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:46:13 --> tests/ui/implicit_return.rs:46:13
| |
LL | break true; LL | break true;
| ^^^^^^^^^^ help: change `break` to `return` as shown: `return true` | ^^^^^^^^^^
|
help: change `break` to `return` as shown
|
LL | return true;
| ~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:54:13 --> tests/ui/implicit_return.rs:54:13
| |
LL | break true; LL | break true;
| ^^^^^^^^^^ help: change `break` to `return` as shown: `return true` | ^^^^^^^^^^
|
help: change `break` to `return` as shown
|
LL | return true;
| ~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:72:18 --> tests/ui/implicit_return.rs:72:18
| |
LL | let _ = || { true }; LL | let _ = || { true };
| ^^^^ help: add `return` as shown: `return true` | ^^^^
|
help: add `return` as shown
|
LL | let _ = || { return true };
| ~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:73:16 --> tests/ui/implicit_return.rs:73:16
| |
LL | let _ = || true; LL | let _ = || true;
| ^^^^ help: add `return` as shown: `return true` | ^^^^
|
help: add `return` as shown
|
LL | let _ = || return true;
| ~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:81:5 --> tests/ui/implicit_return.rs:81:5
| |
LL | format!("test {}", "test") LL | format!("test {}", "test")
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: add `return` as shown: `return format!("test {}", "test")` | ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: add `return` as shown
|
LL | return format!("test {}", "test")
|
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:90:5 --> tests/ui/implicit_return.rs:90:5
| |
LL | m!(true, false) LL | m!(true, false)
| ^^^^^^^^^^^^^^^ help: add `return` as shown: `return m!(true, false)` | ^^^^^^^^^^^^^^^
|
help: add `return` as shown
|
LL | return m!(true, false)
|
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:96:13 --> tests/ui/implicit_return.rs:96:13
| |
LL | break true; LL | break true;
| ^^^^^^^^^^ help: change `break` to `return` as shown: `return true` | ^^^^^^^^^^
|
help: change `break` to `return` as shown
|
LL | return true;
| ~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:101:17 --> tests/ui/implicit_return.rs:101:17
| |
LL | break 'outer false; LL | break 'outer false;
| ^^^^^^^^^^^^^^^^^^ help: change `break` to `return` as shown: `return false` | ^^^^^^^^^^^^^^^^^^
|
help: change `break` to `return` as shown
|
LL | return false;
| ~~~~~~~~~~~~
error: missing `return` statement error: missing `return` statement
--> tests/ui/implicit_return.rs:116:5 --> tests/ui/implicit_return.rs:116:5
@ -104,7 +173,12 @@ error: missing `return` statement
--> tests/ui/implicit_return.rs:130:5 --> tests/ui/implicit_return.rs:130:5
| |
LL | true LL | true
| ^^^^ help: add `return` as shown: `return true` | ^^^^
|
help: add `return` as shown
|
LL | return true
|
error: aborting due to 16 previous errors error: aborting due to 16 previous errors