Auto merge of #120313 - Nadrieril:graceful-error, r=compiler-errors
pattern_analysis: Gracefully abort on type incompatibility This leaves the option for a consumer of the crate to return `Err` instead of panicking on type error. rust-analyzer could use that (e.g. https://github.com/rust-lang/rust-analyzer/issues/15808). Since the only use of `TypeCx::bug` is in `Constructor::is_covered_by`, it is tempting to return `false` instead of `Err()`, but that would cause "non-exhaustive match" false positives. r? `@compiler-errors`
This commit is contained in:
commit
f067fd6084
5 changed files with 18 additions and 14 deletions
|
@ -1082,7 +1082,7 @@ impl<'p, Cx: TypeCx> Matrix<'p, Cx> {
|
|||
pcx: &PlaceCtxt<'_, Cx>,
|
||||
ctor: &Constructor<Cx>,
|
||||
ctor_is_relevant: bool,
|
||||
) -> Matrix<'p, Cx> {
|
||||
) -> Result<Matrix<'p, Cx>, Cx::Error> {
|
||||
let ctor_sub_tys = pcx.ctor_sub_tys(ctor);
|
||||
let arity = ctor_sub_tys.len();
|
||||
let specialized_place_ty = ctor_sub_tys.chain(self.place_ty[1..].iter().cloned()).collect();
|
||||
|
@ -1098,12 +1098,12 @@ impl<'p, Cx: TypeCx> Matrix<'p, Cx> {
|
|||
wildcard_row_is_relevant: self.wildcard_row_is_relevant && ctor_is_relevant,
|
||||
};
|
||||
for (i, row) in self.rows().enumerate() {
|
||||
if ctor.is_covered_by(pcx.cx, row.head().ctor()) {
|
||||
if ctor.is_covered_by(pcx.cx, row.head().ctor())? {
|
||||
let new_row = row.pop_head_constructor(ctor, arity, ctor_is_relevant, i);
|
||||
matrix.expand_and_push(new_row);
|
||||
}
|
||||
}
|
||||
matrix
|
||||
Ok(matrix)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1523,7 +1523,7 @@ fn compute_exhaustiveness_and_usefulness<'a, 'p, Cx: TypeCx>(
|
|||
// strictly fewer rows. In that case we can sometimes skip it. See the top of the file for
|
||||
// details.
|
||||
let ctor_is_relevant = matches!(ctor, Constructor::Missing) || missing_ctors.is_empty();
|
||||
let mut spec_matrix = matrix.specialize_constructor(pcx, &ctor, ctor_is_relevant);
|
||||
let mut spec_matrix = matrix.specialize_constructor(pcx, &ctor, ctor_is_relevant)?;
|
||||
let mut witnesses = ensure_sufficient_stack(|| {
|
||||
compute_exhaustiveness_and_usefulness(mcx, &mut spec_matrix, false)
|
||||
})?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue