Expand description

“Object safety” refers to the ability for a trait to be converted to an object. In general, traits may only be converted to an object if all of their methods meet certain criteria. In particular, they must:

  • have a suitable receiver from which we can extract a vtable and coerce to a “thin” version that doesn’t contain the vtable;
  • not reference the erased type Self except for in this receiver;
  • not have generic type parameters.

Enums

Reasons a method might not be object-safe.

Functions

Returns the object safety violations that affect astconv – currently, Self in supertraits. This is needed because object_safety_violations can’t be used during type collection.
We say a method is vtable safe if it can be invoked on a trait object. Note that object-safe traits can have some non-vtable-safe methods, so long as they require Self: Sized or otherwise ensure that they cannot be used when Self = Trait.
Lint object-unsafe trait.
Returns Some(_) if this method makes the containing trait not object safe.
Creates the object type for the current trait. For example, if the current trait is Deref, then this will be dyn Deref<Target = Self::Target> + 'static.
Performs a type substitution to produce the version of receiver_ty when Self = self_ty. For example, for receiver_ty = Rc<Self> and self_ty = Foo, returns Rc<Foo>.
Checks the method’s receiver (the self argument) can be dispatched on when Self is a trait object. We require that DispatchableFromDyn be implemented for the receiver type in the following way:
Returns Some(_) if this method cannot be called on a trait object; this does not necessarily imply that the enclosing trait is not object safe, because the method might have a where clause Self:Sized.