Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs')
-rw-r--r--crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs25
1 files changed, 11 insertions, 14 deletions
diff --git a/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs b/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
index a12e201cf3..7b3abf501d 100644
--- a/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
+++ b/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
@@ -69,22 +69,20 @@ pub(crate) struct MatchCheckCtx<'db> {
body: DefWithBodyId,
pub(crate) db: &'db dyn HirDatabase,
exhaustive_patterns: bool,
- min_exhaustive_patterns: bool,
}
impl<'db> MatchCheckCtx<'db> {
pub(crate) fn new(module: ModuleId, body: DefWithBodyId, db: &'db dyn HirDatabase) -> Self {
let def_map = db.crate_def_map(module.krate());
let exhaustive_patterns = def_map.is_unstable_feature_enabled(&sym::exhaustive_patterns);
- let min_exhaustive_patterns =
- def_map.is_unstable_feature_enabled(&sym::min_exhaustive_patterns);
- Self { module, body, db, exhaustive_patterns, min_exhaustive_patterns }
+ Self { module, body, db, exhaustive_patterns }
}
pub(crate) fn compute_match_usefulness(
&self,
arms: &[MatchArm<'db>],
scrut_ty: Ty,
+ known_valid_scrutinee: Option<bool>,
) -> Result<UsefulnessReport<'db, Self>, ()> {
if scrut_ty.contains_unknown() {
return Err(());
@@ -95,8 +93,7 @@ impl<'db> MatchCheckCtx<'db> {
}
}
- // FIXME: Determine place validity correctly. For now, err on the safe side.
- let place_validity = PlaceValidity::MaybeInvalid;
+ let place_validity = PlaceValidity::from_bool(known_valid_scrutinee.unwrap_or(true));
// Measured to take ~100ms on modern hardware.
let complexity_limit = Some(500000);
compute_match_usefulness(self, arms, scrut_ty, place_validity, complexity_limit)
@@ -307,7 +304,8 @@ impl<'db> MatchCheckCtx<'db> {
&Str(void) => match void {},
Wildcard | NonExhaustive | Hidden | PrivateUninhabited => PatKind::Wild,
Never => PatKind::Never,
- Missing | F32Range(..) | F64Range(..) | Opaque(..) | Or => {
+ Missing | F16Range(..) | F32Range(..) | F64Range(..) | F128Range(..) | Opaque(..)
+ | Or => {
never!("can't convert to pattern: {:?}", pat.ctor());
PatKind::Wild
}
@@ -327,9 +325,6 @@ impl<'db> PatCx for MatchCheckCtx<'db> {
fn is_exhaustive_patterns_feature_on(&self) -> bool {
self.exhaustive_patterns
}
- fn is_min_exhaustive_patterns_feature_on(&self) -> bool {
- self.min_exhaustive_patterns
- }
fn ctor_arity(
&self,
@@ -356,8 +351,9 @@ impl<'db> PatCx for MatchCheckCtx<'db> {
},
Ref => 1,
Slice(..) => unimplemented!(),
- Never | Bool(..) | IntRange(..) | F32Range(..) | F64Range(..) | Str(..)
- | Opaque(..) | NonExhaustive | PrivateUninhabited | Hidden | Missing | Wildcard => 0,
+ Never | Bool(..) | IntRange(..) | F16Range(..) | F32Range(..) | F64Range(..)
+ | F128Range(..) | Str(..) | Opaque(..) | NonExhaustive | PrivateUninhabited
+ | Hidden | Missing | Wildcard => 0,
Or => {
never!("The `Or` constructor doesn't have a fixed arity");
0
@@ -419,8 +415,9 @@ impl<'db> PatCx for MatchCheckCtx<'db> {
}
},
Slice(_) => unreachable!("Found a `Slice` constructor in match checking"),
- Never | Bool(..) | IntRange(..) | F32Range(..) | F64Range(..) | Str(..)
- | Opaque(..) | NonExhaustive | PrivateUninhabited | Hidden | Missing | Wildcard => {
+ Never | Bool(..) | IntRange(..) | F16Range(..) | F32Range(..) | F64Range(..)
+ | F128Range(..) | Str(..) | Opaque(..) | NonExhaustive | PrivateUninhabited
+ | Hidden | Missing | Wildcard => {
smallvec![]
}
Or => {