Auto merge of #7282 - camsteffen:lint-stmt-expr, r=flip1995

Fix allow on some statement lints

changelog: Fix `#[allow(..)]` over statements for [`needless_collect`], [`short_circuit_statement`] and [`unnecessary_operation`]

Fixes #7171
Fixes #7202
This commit is contained in:
bors 2021-05-27 08:23:21 +00:00
commit 8066f836ec
6 changed files with 24 additions and 11 deletions

View file

@ -1,5 +1,5 @@
use super::NEEDLESS_COLLECT; use super::NEEDLESS_COLLECT;
use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then}; use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_hir_and_then};
use clippy_utils::source::{snippet, snippet_with_applicability}; use clippy_utils::source::{snippet, snippet_with_applicability};
use clippy_utils::sugg::Sugg; use clippy_utils::sugg::Sugg;
use clippy_utils::ty::is_type_diagnostic_item; use clippy_utils::ty::is_type_diagnostic_item;
@ -116,9 +116,10 @@ fn check_needless_collect_indirect_usage<'tcx>(expr: &'tcx Expr<'_>, cx: &LateCo
// Suggest replacing iter_call with iter_replacement, and removing stmt // Suggest replacing iter_call with iter_replacement, and removing stmt
let mut span = MultiSpan::from_span(collect_span); let mut span = MultiSpan::from_span(collect_span);
span.push_span_label(iter_call.span, "the iterator could be used here instead".into()); span.push_span_label(iter_call.span, "the iterator could be used here instead".into());
span_lint_and_then( span_lint_hir_and_then(
cx, cx,
super::NEEDLESS_COLLECT, super::NEEDLESS_COLLECT,
init_expr.hir_id,
span, span,
NEEDLESS_COLLECT_MSG, NEEDLESS_COLLECT_MSG,
|diag| { |diag| {

View file

@ -355,8 +355,10 @@ impl<'tcx> LateLintPass<'tcx> for MiscLints {
if binop.node == BinOpKind::And || binop.node == BinOpKind::Or; if binop.node == BinOpKind::And || binop.node == BinOpKind::Or;
if let Some(sugg) = Sugg::hir_opt(cx, a); if let Some(sugg) = Sugg::hir_opt(cx, a);
then { then {
span_lint_and_then(cx, span_lint_hir_and_then(
cx,
SHORT_CIRCUIT_STATEMENT, SHORT_CIRCUIT_STATEMENT,
expr.hir_id,
stmt.span, stmt.span,
"boolean short circuit operator in statement may be clearer using an explicit test", "boolean short circuit operator in statement may be clearer using an explicit test",
|diag| { |diag| {

View file

@ -1,4 +1,4 @@
use clippy_utils::diagnostics::{span_lint, span_lint_and_sugg}; use clippy_utils::diagnostics::{span_lint_hir, span_lint_hir_and_then};
use clippy_utils::source::snippet_opt; use clippy_utils::source::snippet_opt;
use clippy_utils::ty::has_drop; use clippy_utils::ty::has_drop;
use rustc_errors::Applicability; use rustc_errors::Applicability;
@ -92,7 +92,7 @@ impl<'tcx> LateLintPass<'tcx> for NoEffect {
fn check_stmt(&mut self, cx: &LateContext<'tcx>, stmt: &'tcx Stmt<'_>) { fn check_stmt(&mut self, cx: &LateContext<'tcx>, stmt: &'tcx Stmt<'_>) {
if let StmtKind::Semi(expr) = stmt.kind { if let StmtKind::Semi(expr) = stmt.kind {
if has_no_effect(cx, expr) { if has_no_effect(cx, expr) {
span_lint(cx, NO_EFFECT, stmt.span, "statement with no effect"); span_lint_hir(cx, NO_EFFECT, expr.hir_id, stmt.span, "statement with no effect");
} else if let Some(reduced) = reduce_expression(cx, expr) { } else if let Some(reduced) = reduce_expression(cx, expr) {
let mut snippet = String::new(); let mut snippet = String::new();
for e in reduced { for e in reduced {
@ -106,14 +106,15 @@ impl<'tcx> LateLintPass<'tcx> for NoEffect {
return; return;
} }
} }
span_lint_and_sugg( span_lint_hir_and_then(
cx, cx,
UNNECESSARY_OPERATION, UNNECESSARY_OPERATION,
expr.hir_id,
stmt.span, stmt.span,
"statement can be reduced", "statement can be reduced",
"replace it with", |diag| {
snippet, diag.span_suggestion(stmt.span, "replace it with", snippet, Applicability::MachineApplicable);
Applicability::MachineApplicable, },
); );
} }
} }

View file

@ -167,7 +167,7 @@ pub fn span_lint_hir_and_then(
cx: &LateContext<'_>, cx: &LateContext<'_>,
lint: &'static Lint, lint: &'static Lint,
hir_id: HirId, hir_id: HirId,
sp: Span, sp: impl Into<MultiSpan>,
msg: &str, msg: &str,
f: impl FnOnce(&mut DiagnosticBuilder<'_>), f: impl FnOnce(&mut DiagnosticBuilder<'_>),
) { ) {

View file

@ -1,4 +1,4 @@
use std::collections::{BinaryHeap, HashMap, LinkedList, VecDeque}; use std::collections::{BinaryHeap, HashMap, HashSet, LinkedList, VecDeque};
fn main() { fn main() {
let sample = [1; 5]; let sample = [1; 5];
@ -75,3 +75,9 @@ mod issue7110 {
buffer.len() buffer.len()
} }
} }
fn allow_test() {
#[allow(clippy::needless_collect)]
let v = [1].iter().collect::<Vec<_>>();
v.into_iter().collect::<HashSet<_>>();
}

View file

@ -91,6 +91,9 @@ fn main() {
let s: String = "foo".into(); let s: String = "foo".into();
FooString { s: s }; FooString { s: s };
#[allow(clippy::no_effect)]
0;
// Do not warn // Do not warn
get_number(); get_number();
unsafe { unsafe_fn() }; unsafe { unsafe_fn() };