#![allow( dangerous_implicit_autorefs, clippy::explicit_auto_deref, clippy::return_self_not_must_use, clippy::useless_vec )] #![warn(clippy::deref_addrof)] fn get_number() -> usize { 10 } fn get_reference(n: &usize) -> &usize { n } #[allow(clippy::double_parens)] #[allow(unused_variables, unused_parens)] fn main() { let a = 10; let aref = &a; let b = a; //~^ deref_addrof let b = get_number(); //~^ deref_addrof let b = *get_reference(&a); let bytes: Vec = vec![1, 2, 3, 4]; let b = bytes[1..2][0]; //~^ deref_addrof //This produces a suggestion of 'let b = (a);' which //will trigger the 'unused_parens' lint let b = (a); //~^ deref_addrof let b = a; //~^ deref_addrof #[rustfmt::skip] let b = a; //~^ deref_addrof let b = &a; //~^ deref_addrof let b = *aref; //~^ deref_addrof let _ = unsafe { *core::ptr::addr_of!(a) }; let _repeat = [0; 64]; //~^ deref_addrof // do NOT lint for array as semantic differences with/out `*&`. let _arr = *&[0, 1, 2, 3, 4]; // Do not lint when text comes from macro macro_rules! mac { (dr) => { *&0 }; (dr $e:expr) => { *&$e }; (r $e:expr) => { &$e }; } let b = mac!(dr); let b = mac!(dr a); let b = *mac!(r a); } fn issue14386() { use std::mem::ManuallyDrop; #[derive(Copy, Clone)] struct Data { num: u64, } #[derive(Clone, Copy)] struct M { md: ManuallyDrop<[u8; 4]>, } union DataWithPadding<'lt> { data: ManuallyDrop, prim: ManuallyDrop, padding: [u8; size_of::()], tup: (ManuallyDrop, ()), indirect: M, indirect_arr: [M; 2], indirect_ref: &'lt mut M, } let mut a = DataWithPadding { padding: [0; size_of::()], }; unsafe { a.padding = [1; size_of::()]; //~^ deref_addrof a.tup.1 = (); //~^ deref_addrof *a.prim = 0; //~^ deref_addrof (*a.data).num = 42; //~^ deref_addrof (*a.indirect.md)[3] = 1; //~^ deref_addrof (*a.indirect_arr[1].md)[3] = 1; //~^ deref_addrof (*a.indirect_ref.md)[3] = 1; //~^ deref_addrof // Check that raw pointers are properly considered as well *a.prim = 0; //~^ deref_addrof (*a.data).num = 42; //~^ deref_addrof // Do not lint, as the dereference happens later, we cannot // just remove `&mut` (*&mut a.tup).0.num = 42; } }