blob: 0a16bed4a43b67a0891bca73b66df1649a622596 [file] [edit]
#![warn(clippy::ref_binding_to_reference)]
#![expect(clippy::explicit_auto_deref)]
#![allow(clippy::needless_borrowed_reference)]
fn f1(_: &str) {}
macro_rules! m2 {
($e:expr) => {
f1(*$e)
};
}
macro_rules! m3 {
($i:ident) => {
Some(ref $i)
};
}
fn main() {
let x = String::new();
// Ok, the pattern is from a macro
let _: &&String = match Some(&x) {
m3!(x) => x,
None => return,
};
// Err, reference to a &String
#[expect(
clippy::ref_binding_to_reference,
reason = "The suggestion doesn't compile, see https://github.com/rust-lang/rust-clippy/issues/17370"
)]
let _: &&String = match Some(&x) {
Some(ref x) => x,
None => return,
};
// Err, reference to a &String
#[expect(
clippy::ref_binding_to_reference,
reason = "The suggestion doesn't compile, see https://github.com/rust-lang/rust-clippy/issues/17370"
)]
let _: &&String = match Some(&x) {
Some(ref x) => {
f1(x);
f1(*x);
x
},
None => return,
};
// Err, reference to a &String
match Some(&x) {
Some(x) => m2!(&x),
//~^ ref_binding_to_reference
None => return,
}
// Err, reference to a &String
let _ = |&x: &&String| {
//~^ ref_binding_to_reference
let _: &&String = &x;
};
}
// Err, reference to a &String
fn f2<'a>(&x: &&'a String) -> &'a String {
//~^ ref_binding_to_reference
let _: &&String = &x;
x
}
trait T1 {
// Err, reference to a &String
fn f(&x: &&String) {
//~^ ref_binding_to_reference
let _: &&String = &x;
}
}
struct S;
impl T1 for S {
// Err, reference to a &String
fn f(&x: &&String) {
//~^ ref_binding_to_reference
let _: &&String = &x;
}
}
fn check_expect_suppression() {
let x = String::new();
#[expect(clippy::ref_binding_to_reference)]
let _: &&String = match Some(&x) {
Some(ref x) => x,
None => return,
};
}