diff --git a/clippy_lints/src/identity_op.rs b/clippy_lints/src/identity_op.rs index de60e284cad..f824f20ca40 100644 --- a/clippy_lints/src/identity_op.rs +++ b/clippy_lints/src/identity_op.rs @@ -71,8 +71,8 @@ fn is_allowed(cx: &LateContext<'_>, cmp: BinOp, left: &Expr<'_>, right: &Expr<'_ } fn check(cx: &LateContext<'_>, e: &Expr<'_>, m: i8, span: Span, arg: Span) { - if let Some(Constant::Int(v)) = constant_simple(cx, cx.typeck_results(), e) { - let check = match *cx.typeck_results().expr_ty(e).kind() { + if let Some(Constant::Int(v)) = constant_simple(cx, cx.typeck_results(), e).map(Constant::peel_refs) { + let check = match *cx.typeck_results().expr_ty(e).peel_refs().kind() { ty::Int(ity) => unsext(cx.tcx, -1_i128, ity), ty::Uint(uty) => clip(cx.tcx, !0, uty), _ => return, diff --git a/clippy_utils/src/consts.rs b/clippy_utils/src/consts.rs index 04347672e0f..1cf8f9721b5 100644 --- a/clippy_utils/src/consts.rs +++ b/clippy_utils/src/consts.rs @@ -168,6 +168,14 @@ impl Constant { None } } + + #[must_use] + pub fn peel_refs(mut self) -> Self { + while let Constant::Ref(r) = self { + self = *r; + } + self + } } /// Parses a `LitKind` to a `Constant`. diff --git a/tests/ui/identity_op.rs b/tests/ui/identity_op.rs index a3985b68fbb..2ed4b5db574 100644 --- a/tests/ui/identity_op.rs +++ b/tests/ui/identity_op.rs @@ -11,11 +11,11 @@ impl std::ops::Shl for A { self } } - #[allow( clippy::eq_op, clippy::no_effect, clippy::unnecessary_operation, + clippy::op_ref, clippy::double_parens )] #[warn(clippy::identity_op)] @@ -49,6 +49,7 @@ fn main() { 1 >> 0; 42 >> 0; &x >> 0; + x >> &0; let mut a = A("".into()); let b = a << 0; // no error: non-integer diff --git a/tests/ui/identity_op.stderr b/tests/ui/identity_op.stderr index 5b63eb9cc4f..ff34b38db01 100644 --- a/tests/ui/identity_op.stderr +++ b/tests/ui/identity_op.stderr @@ -72,5 +72,11 @@ error: the operation is ineffective. Consider reducing it to `&x` LL | &x >> 0; | ^^^^^^^ -error: aborting due to 12 previous errors +error: the operation is ineffective. Consider reducing it to `x` + --> $DIR/identity_op.rs:52:5 + | +LL | x >> &0; + | ^^^^^^^ + +error: aborting due to 13 previous errors