rustc_pattern_analysis::constructor

Struct SplitConstructorSet

source
pub struct SplitConstructorSet<Cx: PatCx> {
    pub present: SmallVec<[Constructor<Cx>; 1]>,
    pub missing: Vec<Constructor<Cx>>,
    pub missing_empty: Vec<Constructor<Cx>>,
}
Expand description

Describes the result of analyzing the constructors in a column of a match.

present is morally the set of constructors present in the column, and missing is the set of constructors that exist in the type but are not present in the column.

More formally, if we discard wildcards from the column, this respects the following constraints:

  1. the union of present, missing and missing_empty covers all the constructors of the type
  2. each constructor in present is covered by something in the column
  3. no constructor in missing or missing_empty is covered by anything in the column
  4. each constructor in the column is equal to the union of one or more constructors in present
  5. missing does not contain empty constructors (see discussion about emptiness at the top of the file);
  6. missing_empty contains only empty constructors
  7. constructors in present, missing and missing_empty are split for the column; in other words, they are either fully included in or fully disjoint from each constructor in the column. In yet other words, there are no non-trivial intersections like between 0..10 and 5..15.

We must be particularly careful with weird constructors like Opaque: they’re not formally part of the ConstructorSet for the type, yet if we forgot to include them in present we would be ignoring any row with Opaques in the algorithm. Hence the importance of point 4.

Fields§

§present: SmallVec<[Constructor<Cx>; 1]>§missing: Vec<Constructor<Cx>>§missing_empty: Vec<Constructor<Cx>>

Trait Implementations§

source§

impl<Cx: Debug + PatCx> Debug for SplitConstructorSet<Cx>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<Cx> DynSend for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: DynSend, <Cx as PatCx>::StrLit: DynSend,

§

impl<Cx> DynSync for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: DynSync, <Cx as PatCx>::StrLit: DynSync,

§

impl<Cx> Freeze for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: Freeze, <Cx as PatCx>::StrLit: Freeze,

§

impl<Cx> RefUnwindSafe for SplitConstructorSet<Cx>

§

impl<Cx> Send for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: Send, <Cx as PatCx>::StrLit: Send,

§

impl<Cx> Sync for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: Sync, <Cx as PatCx>::StrLit: Sync,

§

impl<Cx> Unpin for SplitConstructorSet<Cx>
where <Cx as PatCx>::VariantIdx: Unpin, <Cx as PatCx>::StrLit: Unpin,

§

impl<Cx> UnwindSafe for SplitConstructorSet<Cx>

Blanket Implementations§

source§

impl<T> Aligned for T

source§

const ALIGN: Alignment = _

Alignment of Self.
source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T, R> CollectAndApply<T, R> for T

source§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

source§

type Output = R

source§

impl<T> Filterable for T

source§

fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>

Creates a filterable data provider with the given name for debugging. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

impl<P> IntoQueryParam<P> for P

source§

impl<T> MaybeResult<T> for T

source§

type Error = !

source§

fn from(_: Result<T, <T as MaybeResult<T>>::Error>) -> T

source§

fn to_result(self) -> Result<T, <T as MaybeResult<T>>::Error>

source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
source§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

source§

fn upcast(self, interner: I) -> U

source§

impl<I, T> UpcastFrom<I, T> for T

source§

fn upcast_from(from: T, _tcx: I) -> T

source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<Tcx, T> Value<Tcx> for T
where Tcx: DepContext,

source§

default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<'a, T> Captures<'a> for T
where T: ?Sized,

source§

impl<'a, T> Captures<'a> for T
where T: ?Sized,

source§

impl<T> ErasedDestructor for T
where T: 'static,

source§

impl<T> MaybeSendSync for T
where T: Send + Sync,

Layout§

Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.