Module rustc_trait_selection::traits::object_safety
source · 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 becauseobject_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 whenSelf = Trait
. - Lint object-unsafe trait.
- Returns
Some(_)
if this item 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 bedyn Deref<Target = Self::Target> + 'static
. - Performs a type substitution to produce the version of
receiver_ty
whenSelf = self_ty
. For example, forreceiver_ty = Rc<Self>
andself_ty = Foo
, returnsRc<Foo>
. - Checks the method’s receiver (the
self
argument) can be dispatched on whenSelf
is a trait object. We require thatDispatchableFromDyn
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 clauseSelf:Sized
.