Struct rustc_mir_build::thir::pattern::usefulness::WitnessStack
source · pub(crate) struct WitnessStack<'tcx>(Vec<WitnessPat<'tcx>>);Expand description
A witness-tuple of non-exhaustiveness for error reporting, represented as a list of patterns (in reverse order of construction) with wildcards inside to represent elements that can take any inhabitant of the type as a value.
This mirrors PatStack: they function similarly, except PatStack contains user patterns we
are inspecting, and WitnessStack contains witnesses we are constructing.
FIXME(Nadrieril): use the same order of patterns for both
A WitnessStack should have the same types and length as the PatStacks we are inspecting
(except we store the patterns in reverse order). Because Rust match is always against a single
pattern, at the end the stack will have length 1. In the middle of the algorithm, it can contain
multiple patterns.
For example, if we are constructing a witness for the match against
struct Pair(Option<(u32, u32)>, bool);
match p {
Pair(None, _) => {}
Pair(_, false) => {}
}We’ll perform the following steps (among others):
- Start with a matrix representing the match
PatStack(vec![Pair(None, _)])PatStack(vec![Pair(_, false)]) - Specialize with
PairPatStack(vec![None, _])PatStack(vec![_, false]) - Specialize with
SomePatStack(vec![_, false]) - Specialize with
_PatStack(vec![false]) - Specialize with
true// no patstacks left - This is a non-exhaustive match: we have the empty witness stack as a witness.
WitnessStack(vec![]) - Apply
trueWitnessStack(vec![true]) - Apply
_WitnessStack(vec![true, _]) - Apply
SomeWitnessStack(vec![true, Some(_)]) - Apply
PairWitnessStack(vec![Pair(Some(_), true)])
The final Pair(Some(_), true) is then the resulting witness.
Tuple Fields§
§0: Vec<WitnessPat<'tcx>>Implementations§
source§impl<'tcx> WitnessStack<'tcx>
impl<'tcx> WitnessStack<'tcx>
sourcefn single_pattern(self) -> WitnessPat<'tcx>
fn single_pattern(self) -> WitnessPat<'tcx>
Asserts that the witness contains a single pattern, and returns it.
sourcefn apply_constructor(
self,
pcx: &PatCtxt<'_, '_, 'tcx>,
ctor: &Constructor<'tcx>
) -> Self
fn apply_constructor( self, pcx: &PatCtxt<'_, '_, 'tcx>, ctor: &Constructor<'tcx> ) -> Self
Constructs a partial witness for a pattern given a list of patterns expanded by the specialization step.
When a pattern P is discovered to be useful, this function is used bottom-up to reconstruct a complete witness, e.g., a pattern P’ that covers a subset of values, V, where each value in that set is not covered by any previously used patterns and is covered by the pattern P’. Examples:
left_ty: tuple of 3 elements pats: [10, 20, _] => (10, 20, _)
left_ty: struct X { a: (bool, &’static str), b: usize} pats: [(false, “foo”), 42] => X { a: (false, “foo”), b: 42 }
Trait Implementations§
source§impl<'tcx> Clone for WitnessStack<'tcx>
impl<'tcx> Clone for WitnessStack<'tcx>
source§fn clone(&self) -> WitnessStack<'tcx>
fn clone(&self) -> WitnessStack<'tcx>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl<'tcx> !RefUnwindSafe for WitnessStack<'tcx>
impl<'tcx> Send for WitnessStack<'tcx>
impl<'tcx> Sync for WitnessStack<'tcx>
impl<'tcx> Unpin for WitnessStack<'tcx>
impl<'tcx> !UnwindSafe for WitnessStack<'tcx>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. 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: 24 bytes