fn compute_exhaustiveness_and_usefulness<'a, 'p, Cx: TypeCx>(
mcx: UsefulnessCtxt<'a, Cx>,
matrix: &mut Matrix<'p, Cx>
) -> Result<WitnessMatrix<Cx>, Cx::Error>Expand description
The core of the algorithm.
This recursively computes witnesses of the non-exhaustiveness of matrix (if any). Also tracks
usefulness of each row in the matrix (in row.useful). We track usefulness of each
subpattern using interior mutability in DeconstructedPat.
The input Matrix and the output WitnessMatrix together match the type exhaustively.
The key steps are:
- specialization, where we dig into the rows that have a specific constructor and call ourselves recursively;
- unspecialization, where we lift the results from the previous step into results for this step
(using
apply_constructorand by updatingrow.usefulfor each parent row). This is all explained at the top of the file.