Tracking issue for future-incompatibility lint ptr_cast_add_auto_to_object · Issue #127323 · rust-lang/rust (original) (raw)

This is a tracking issue for the ptr_cast_add_auto_to_object lint, which was added in #120248.

This lint detects casts of raw pointers to trait objects, which add auto traits. Adding auto traits to trait objects may cause UB when #![feature(arbitrary_self_types)] is used.

Example

#![feature(arbitrary_self_types)] trait Trait { fn f(self: *const Self) where Self: Send; }

impl Trait for *const () { fn f(self: *const Self) { unreachable!() } }

fn main() { let unsend: *const () = &(); let unsend: *const dyn Trait = &unsend; let send_bad: *const (dyn Trait + Send) = unsend as _; send_bad.f(); // this crashes, since vtable for *const () does not have an entry for f //~^ warning: adding an auto trait Send to a trait object in a pointer cast may cause UB later on }

In case your usage is sound (e.g. because the trait doesn't have auto trait bounds), you can replace cast with a transmute to suppress the warning:

trait Cat {} impl Cat for *const () {}

fn main() { let unsend: *const () = &(); let unsend: *const dyn Cat = &unsend; let _send: *const (dyn Cat + Send) = unsafe { // Safety: // - Both types are pointers, to the same trait object (and thus have the same vtable) // - Cat does not have methods with Send bounds std::mem::transmute::<*const dyn Cat, *const (dyn Cat + Send)>(unsend) }; // meow }