Skip to content

Commit

Permalink
Suppress the triggering of some lints in derived structures
Browse files Browse the repository at this point in the history
  • Loading branch information
c410-f3r committed Apr 9, 2023
1 parent e903af5 commit cd0009e
Show file tree
Hide file tree
Showing 9 changed files with 290 additions and 186 deletions.
4 changes: 3 additions & 1 deletion clippy_lints/src/operators/arithmetic_side_effects.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::ARITHMETIC_SIDE_EFFECTS;
use clippy_utils::is_from_proc_macro;
use clippy_utils::{
consts::{constant, constant_simple, Constant},
diagnostics::span_lint,
Expand Down Expand Up @@ -206,8 +207,9 @@ impl ArithmeticSideEffects {
self.issue_lint(cx, expr);
}

fn should_skip_expr(&mut self, cx: &LateContext<'_>, expr: &hir::Expr<'_>) -> bool {
fn should_skip_expr<'tcx>(&mut self, cx: &LateContext<'tcx>, expr: &hir::Expr<'tcx>) -> bool {
is_lint_allowed(cx, ARITHMETIC_SIDE_EFFECTS, expr.hir_id)
|| is_from_proc_macro(cx, expr)
|| self.expr_span.is_some()
|| self.const_span.map_or(false, |sp| sp.contains(expr.span))
}
Expand Down
14 changes: 12 additions & 2 deletions clippy_lints/src/operators/numeric_arithmetic.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
use super::{FLOAT_ARITHMETIC, INTEGER_ARITHMETIC};
use clippy_utils::consts::constant_simple;
use clippy_utils::diagnostics::span_lint;
use clippy_utils::is_from_proc_macro;
use clippy_utils::is_integer_literal;
use rustc_hir as hir;
use rustc_lint::LateContext;
use rustc_span::source_map::Span;

use super::{FLOAT_ARITHMETIC, INTEGER_ARITHMETIC};

#[derive(Default)]
pub struct Context {
expr_id: Option<hir::HirId>,
Expand All @@ -19,6 +19,10 @@ impl Context {
self.expr_id.is_some() || self.const_span.map_or(false, |span| span.contains(e.span))
}

fn skip_expr_involving_integers<'tcx>(cx: &LateContext<'tcx>, e: &hir::Expr<'tcx>) -> bool {
is_from_proc_macro(cx, e)
}

pub fn check_binary<'tcx>(
&mut self,
cx: &LateContext<'tcx>,
Expand Down Expand Up @@ -47,6 +51,9 @@ impl Context {

let (l_ty, r_ty) = (cx.typeck_results().expr_ty(l), cx.typeck_results().expr_ty(r));
if l_ty.peel_refs().is_integral() && r_ty.peel_refs().is_integral() {
if Self::skip_expr_involving_integers(cx, expr) {
return;
}
match op {
hir::BinOpKind::Div | hir::BinOpKind::Rem => match &r.kind {
hir::ExprKind::Lit(_lit) => (),
Expand Down Expand Up @@ -79,6 +86,9 @@ impl Context {
let ty = cx.typeck_results().expr_ty(arg);
if constant_simple(cx, cx.typeck_results(), expr).is_none() {
if ty.is_integral() {
if Self::skip_expr_involving_integers(cx, expr) {
return;
}
span_lint(cx, INTEGER_ARITHMETIC, expr.span, "integer arithmetic detected");
self.expr_id = Some(expr.hir_id);
} else if ty.is_floating_point() {
Expand Down
7 changes: 7 additions & 0 deletions tests/ui/arithmetic_side_effects.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// aux-build:proc_macro_derive.rs

#![allow(
clippy::assign_op_pattern,
clippy::erasing_op,
Expand All @@ -11,6 +13,8 @@
#![feature(const_mut_refs, inline_const, saturating_int_impl)]
#![warn(clippy::arithmetic_side_effects)]

extern crate proc_macro_derive;

use core::num::{Saturating, Wrapping};

const ONE: i32 = 1;
Expand All @@ -19,6 +23,9 @@ const ZERO: i32 = 0;
#[derive(Clone, Copy)]
pub struct Custom;

#[derive(proc_macro_derive::ShadowDerive)]
pub struct Nothing;

macro_rules! impl_arith {
( $( $_trait:ident, $lhs:ty, $rhs:ty, $method:ident; )* ) => {
$(
Expand Down
Loading

0 comments on commit cd0009e

Please sign in to comment.