Auto merge of #9981 - Jarcho:issue_9954, r=flip1995

Don't lint `unnecessary_operation` in mixed macro contexts

fixes #9954

changelog: `unnecessary_operation`: Don't lint in mixed macro contexts.
This commit is contained in:
bors 2022-11-29 09:49:46 +00:00
commit 4cda21dc42
3 changed files with 24 additions and 2 deletions

View File

@ -6,7 +6,8 @@
use rustc_errors::Applicability; use rustc_errors::Applicability;
use rustc_hir::def::{DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::{is_range_literal, BinOpKind, BlockCheckMode, Expr, ExprKind, PatKind, Stmt, StmtKind, UnsafeSource}; use rustc_hir::{is_range_literal, BinOpKind, BlockCheckMode, Expr, ExprKind, PatKind, Stmt, StmtKind, UnsafeSource};
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_middle::lint::in_external_macro;
use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_session::{declare_lint_pass, declare_tool_lint};
use std::ops::Deref; use std::ops::Deref;
@ -159,8 +160,11 @@ fn has_no_effect(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
fn check_unnecessary_operation(cx: &LateContext<'_>, stmt: &Stmt<'_>) { fn check_unnecessary_operation(cx: &LateContext<'_>, stmt: &Stmt<'_>) {
if_chain! { if_chain! {
if let StmtKind::Semi(expr) = stmt.kind; if let StmtKind::Semi(expr) = stmt.kind;
let ctxt = stmt.span.ctxt();
if expr.span.ctxt() == ctxt;
if let Some(reduced) = reduce_expression(cx, expr); if let Some(reduced) = reduce_expression(cx, expr);
if !&reduced.iter().any(|e| e.span.from_expansion()); if !in_external_macro(cx.sess(), stmt.span);
if reduced.iter().all(|e| e.span.ctxt() == ctxt);
then { then {
if let ExprKind::Index(..) = &expr.kind { if let ExprKind::Index(..) = &expr.kind {
let snippet = if let (Some(arr), Some(func)) = let snippet = if let (Some(arr), Some(func)) =

View File

@ -76,4 +76,13 @@ fn main() {
DropStruct { ..get_drop_struct() }; DropStruct { ..get_drop_struct() };
DropEnum::Tuple(get_number()); DropEnum::Tuple(get_number());
DropEnum::Struct { field: get_number() }; DropEnum::Struct { field: get_number() };
// Issue #9954
fn one() -> i8 {
1
}
macro_rules! use_expr {
($($e:expr),*) => {{ $($e;)* }}
}
use_expr!(isize::MIN / -(one() as isize), i8::MIN / -one());
} }

View File

@ -80,4 +80,13 @@ fn main() {
DropStruct { ..get_drop_struct() }; DropStruct { ..get_drop_struct() };
DropEnum::Tuple(get_number()); DropEnum::Tuple(get_number());
DropEnum::Struct { field: get_number() }; DropEnum::Struct { field: get_number() };
// Issue #9954
fn one() -> i8 {
1
}
macro_rules! use_expr {
($($e:expr),*) => {{ $($e;)* }}
}
use_expr!(isize::MIN / -(one() as isize), i8::MIN / -one());
} }