Struct rustc_infer::infer::type_variable::TypeVariableStorage[−][src]

pub struct TypeVariableStorage<'tcx> {
    values: SnapshotVecStorage<Delegate>,
    eq_relations: UnificationTableStorage<TyVidEqKey<'tcx>>,
    sub_relations: UnificationTableStorage<TyVid>,
}

Fields

values: SnapshotVecStorage<Delegate>eq_relations: UnificationTableStorage<TyVidEqKey<'tcx>>

Two variables are unified in eq_relations when we have a constraint ?X == ?Y. This table also stores, for each key, the known value.

sub_relations: UnificationTableStorage<TyVid>

Two variables are unified in sub_relations when we have a constraint ?X <: ?Y or a constraint ?Y <: ?X. This second table exists only to help with the occurs check. In particular, we want to report constraints like these as an occurs check violation:

?1 <: ?3
Box<?3> <: ?1

This works because ?1 and ?3 are unified in the sub_relations relation (not in eq_relations). Then when we process the Box<?3> <: ?1 constraint, we do an occurs check on Box<?3> and find a potential cycle.

This is reasonable because, in Rust, subtypes have the same “skeleton” and hence there is no possible type such that (e.g.) Box<?3> <: ?3 for any ?3.

Implementations

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Layout

Note: Most layout information is completely unstable and may be different between compiler versions and platforms. The only exception is types with certain repr(...) attributes. Please see the Rust Reference’s “Type Layout” chapter for details on type layout guarantees.

Size: 72 bytes