2024-02-08 13:24:42 -06:00
|
|
|
#![warn(clippy::ref_as_ptr)]
|
|
|
|
#![allow(clippy::unnecessary_mut_passed)]
|
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
fn f<T>(_: T) {}
|
|
|
|
|
2024-02-08 13:24:42 -06:00
|
|
|
fn main() {
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref(&1u8));
|
|
|
|
f(std::ptr::from_ref::<u32>(&2u32));
|
|
|
|
f(std::ptr::from_ref::<f64>(&3.0f64));
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref(&4) as *const f32);
|
|
|
|
f(std::ptr::from_ref::<f32>(&5.0f32) as *const u32);
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref(&mut 6u8));
|
|
|
|
f(std::ptr::from_ref::<u32>(&mut 7u32));
|
|
|
|
f(std::ptr::from_ref::<f64>(&mut 8.0f64));
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref(&mut 9) as *const f32);
|
|
|
|
f(std::ptr::from_ref::<f32>(&mut 10.0f32) as *const u32);
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_mut(&mut 11u8));
|
|
|
|
f(std::ptr::from_mut::<u32>(&mut 12u32));
|
|
|
|
f(std::ptr::from_mut::<f64>(&mut 13.0f64));
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_mut(&mut 14) as *const f32);
|
|
|
|
f(std::ptr::from_mut::<f32>(&mut 15.0f32) as *const u32);
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref(&1u8));
|
|
|
|
f(std::ptr::from_ref::<u32>(&2u32));
|
|
|
|
f(std::ptr::from_ref::<f64>(&3.0f64));
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref(&4) as *const f32);
|
|
|
|
f(std::ptr::from_ref::<f32>(&5.0f32) as *const u32);
|
2024-02-08 13:24:42 -06:00
|
|
|
|
|
|
|
let val = 1;
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref(&val));
|
|
|
|
f(std::ptr::from_ref::<i32>(&val));
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref(&val) as *const f32);
|
|
|
|
f(std::ptr::from_ref::<i32>(&val) as *const f64);
|
2024-02-08 13:24:42 -06:00
|
|
|
|
|
|
|
let mut val: u8 = 2;
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_mut::<u8>(&mut val));
|
|
|
|
f(std::ptr::from_mut(&mut val));
|
|
|
|
|
|
|
|
f(std::ptr::from_ref::<u8>(&mut val));
|
|
|
|
f(std::ptr::from_ref(&mut val));
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref::<u8>(&mut val) as *const f64);
|
|
|
|
f::<*const Option<u8>>(std::ptr::from_ref(&mut val) as *const _);
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref::<[usize; 7]>(&std::array::from_fn(|i| i * i)));
|
|
|
|
f(std::ptr::from_ref::<[usize; 8]>(&mut std::array::from_fn(|i| i * i)));
|
|
|
|
f(std::ptr::from_mut::<[usize; 9]>(&mut std::array::from_fn(|i| i * i)));
|
2024-02-08 13:24:42 -06:00
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
let _ = &String::new() as *const _;
|
|
|
|
let _ = &mut String::new() as *mut _;
|
|
|
|
const FOO: *const String = &String::new() as *const _;
|
2024-02-08 13:24:42 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[clippy::msrv = "1.75"]
|
|
|
|
fn _msrv_1_75() {
|
|
|
|
let val = &42_i32;
|
|
|
|
let mut_val = &mut 42_i32;
|
|
|
|
|
|
|
|
// `std::ptr::from_{ref, mut}` was stabilized in 1.76. Do not lint this
|
2024-02-27 08:25:18 -06:00
|
|
|
f(val as *const i32);
|
|
|
|
f(mut_val as *mut i32);
|
2024-02-08 13:24:42 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[clippy::msrv = "1.76"]
|
|
|
|
fn _msrv_1_76() {
|
|
|
|
let val = &42_i32;
|
|
|
|
let mut_val = &mut 42_i32;
|
|
|
|
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref::<i32>(val));
|
|
|
|
f(std::ptr::from_mut::<i32>(mut_val));
|
2024-02-08 13:24:42 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
fn foo(val: &[u8]) {
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_ref(val));
|
|
|
|
f(std::ptr::from_ref::<[u8]>(val));
|
2024-02-08 13:24:42 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
fn bar(val: &mut str) {
|
2024-02-27 08:25:18 -06:00
|
|
|
f(std::ptr::from_mut(val));
|
|
|
|
f(std::ptr::from_mut::<str>(val));
|
2024-02-08 13:24:42 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
struct X<'a>(&'a i32);
|
|
|
|
|
|
|
|
impl<'a> X<'a> {
|
|
|
|
fn foo(&self) -> *const i64 {
|
|
|
|
std::ptr::from_ref(self.0) as *const _
|
|
|
|
}
|
|
|
|
|
|
|
|
fn bar(&mut self) -> *const i64 {
|
|
|
|
std::ptr::from_ref(self.0) as *const _
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Y<'a>(&'a mut i32);
|
|
|
|
|
|
|
|
impl<'a> Y<'a> {
|
|
|
|
fn foo(&self) -> *const i64 {
|
|
|
|
std::ptr::from_ref(self.0) as *const _
|
|
|
|
}
|
|
|
|
|
|
|
|
fn bar(&mut self) -> *const i64 {
|
|
|
|
std::ptr::from_ref(self.0) as *const _
|
|
|
|
}
|
|
|
|
|
|
|
|
fn baz(&mut self) -> *const i64 {
|
|
|
|
std::ptr::from_mut(self.0) as *mut _
|
|
|
|
}
|
|
|
|
}
|