#![allow(unused_variables, clippy::disallowed_names)] #![warn(clippy::op_ref)] use std::collections::HashSet; use std::ops::{BitAnd, Mul}; fn main() { let tracked_fds: HashSet = HashSet::new(); let new_fds = HashSet::new(); let unwanted = &tracked_fds - &new_fds; let foo = &5 - &6; //~^ op_ref let bar = String::new(); let bar = "foo" == &bar; let a = "a".to_string(); let b = "a"; if b < &a { println!("OK"); } struct X(i32); impl BitAnd for X { type Output = X; fn bitand(self, rhs: X) -> X { X(self.0 & rhs.0) } } impl<'a> BitAnd<&'a X> for X { type Output = X; fn bitand(self, rhs: &'a X) -> X { X(self.0 & rhs.0) } } let x = X(1); let y = X(2); let z = x & &y; #[derive(Copy, Clone)] struct Y(i32); impl BitAnd for Y { type Output = Y; fn bitand(self, rhs: Y) -> Y { Y(self.0 & rhs.0) } } impl<'a> BitAnd<&'a Y> for Y { type Output = Y; fn bitand(self, rhs: &'a Y) -> Y { Y(self.0 & rhs.0) } } let x = Y(1); let y = Y(2); let z = x & &y; //~^ op_ref } #[derive(Clone, Copy)] struct A(i32); #[derive(Clone, Copy)] struct B(i32); impl Mul<&A> for B { type Output = i32; fn mul(self, rhs: &A) -> Self::Output { self.0 * rhs.0 } } impl Mul for B { type Output = i32; fn mul(self, rhs: A) -> Self::Output { // Should not lint because removing the reference would lead to unconditional recursion self * &rhs } } impl Mul<&A> for A { type Output = i32; fn mul(self, rhs: &A) -> Self::Output { self.0 * rhs.0 } } impl Mul for A { type Output = i32; fn mul(self, rhs: A) -> Self::Output { let one = B(1); let two = 2; let three = 3; let _ = one * &self; //~^ op_ref let _ = two + &three; //~^ op_ref // Removing the reference would lead to unconditional recursion self * &rhs } } mod issue_2597 { fn ex1() { let a: &str = "abc"; let b: String = "abc".to_owned(); println!("{}", a > &b); } pub fn ex2(array: &[T], val: &T, idx: usize) -> bool { &array[idx] < val } } #[allow(clippy::needless_if)] fn issue15063() { use std::ops::BitAnd; macro_rules! mac { ($e:expr) => { $e.clone() }; } let x = 1; if &x == &mac!(1) {} //~^ op_ref #[derive(Copy, Clone)] struct Y(i32); impl BitAnd for Y { type Output = Y; fn bitand(self, rhs: Y) -> Y { Y(self.0 & rhs.0) } } impl<'a> BitAnd<&'a Y> for Y { type Output = Y; fn bitand(self, rhs: &'a Y) -> Y { Y(self.0 & rhs.0) } } let x = Y(1); let y = Y(2); let z = x & &mac!(y); //~^ op_ref }