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
|
@ -758,10 +758,12 @@ impl<Cx: TypeCx> Constructor<Cx> {
|
|||
/// this checks for inclusion.
|
||||
// We inline because this has a single call site in `Matrix::specialize_constructor`.
|
||||
#[inline]
|
||||
pub(crate) fn is_covered_by(&self, cx: &Cx, other: &Self) -> bool {
|
||||
match (self, other) {
|
||||
pub(crate) fn is_covered_by(&self, cx: &Cx, other: &Self) -> Result<bool, Cx::Error> {
|
||||
Ok(match (self, other) {
|
||||
(Wildcard, _) => {
|
||||
cx.bug(format_args!("Constructor splitting should not have returned `Wildcard`"))
|
||||
return Err(cx.bug(format_args!(
|
||||
"Constructor splitting should not have returned `Wildcard`"
|
||||
)));
|
||||
}
|
||||
// Wildcards cover anything
|
||||
(_, Wildcard) => true,
|
||||
|
@ -803,10 +805,12 @@ impl<Cx: TypeCx> Constructor<Cx> {
|
|||
(Opaque(self_id), Opaque(other_id)) => self_id == other_id,
|
||||
(Opaque(..), _) | (_, Opaque(..)) => false,
|
||||
|
||||
_ => cx.bug(format_args!(
|
||||
"trying to compare incompatible constructors {self:?} and {other:?}"
|
||||
)),
|
||||
}
|
||||
_ => {
|
||||
return Err(cx.bug(format_args!(
|
||||
"trying to compare incompatible constructors {self:?} and {other:?}"
|
||||
)));
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue