Summary
ptr::from_ref creates a pointer that isn't safe to cast to *mut T but ptr::from_mut(x).cast_const() creates a pointer that is safe to cast to *mut T. Unless Clippy is sure that the resultant pointer is never going to be cast to *mut T, it should recommend from_mut when it sees an expression r as *const T where r: &mut T. See rust-lang/rust#56604 (comment), #12791, rust-lang/rust#125897.
Reproducer
I tried this code:
#![deny(clippy::ref_as_ptr)]
fn bar<T>(_x: *const T) {}
fn foo<T>(x: &mut T) {
bar(x as *const T);
}
I expected to see this happen:
Clippy should recommended ptr::from_mut(x) or ptr::from_mut(x).cast_const().
Instead, this happened:
Clippy recommended ptr::from_ref(x).
Version
Nightly channel
Build using the Nightly version: 1.80.0-nightly
(2024-06-02 032af18af578f4283a29)
Additional Labels
No response
Summary
ptr::from_refcreates a pointer that isn't safe to cast to*mut Tbutptr::from_mut(x).cast_const()creates a pointer that is safe to cast to*mut T. Unless Clippy is sure that the resultant pointer is never going to be cast to*mut T, it should recommendfrom_mutwhen it sees an expressionr as *const Twherer: &mut T. See rust-lang/rust#56604 (comment), #12791, rust-lang/rust#125897.Reproducer
I tried this code:
I expected to see this happen:
Clippy should recommended
ptr::from_mut(x)orptr::from_mut(x).cast_const().Instead, this happened:
Clippy recommended
ptr::from_ref(x).Version
Additional Labels
No response