Add an error path to the algorithm
This commit is contained in:
parent
d8b44d2802
commit
07d5f19426
5 changed files with 40 additions and 28 deletions
|
@ -24,6 +24,8 @@ use std::fmt;
|
|||
use rustc_index::Idx;
|
||||
#[cfg(feature = "rustc")]
|
||||
use rustc_middle::ty::Ty;
|
||||
#[cfg(feature = "rustc")]
|
||||
use rustc_span::ErrorGuaranteed;
|
||||
|
||||
use crate::constructor::{Constructor, ConstructorSet};
|
||||
#[cfg(feature = "rustc")]
|
||||
|
@ -52,6 +54,8 @@ impl<'a, T: ?Sized> Captures<'a> for T {}
|
|||
pub trait TypeCx: Sized + fmt::Debug {
|
||||
/// The type of a pattern.
|
||||
type Ty: Copy + Clone + fmt::Debug; // FIXME: remove Copy
|
||||
/// Errors that can abort analysis.
|
||||
type Error: fmt::Debug;
|
||||
/// The index of an enum variant.
|
||||
type VariantIdx: Clone + Idx;
|
||||
/// A string literal
|
||||
|
@ -109,25 +113,25 @@ pub fn analyze_match<'p, 'tcx>(
|
|||
tycx: &RustcMatchCheckCtxt<'p, 'tcx>,
|
||||
arms: &[rustc::MatchArm<'p, 'tcx>],
|
||||
scrut_ty: Ty<'tcx>,
|
||||
) -> rustc::UsefulnessReport<'p, 'tcx> {
|
||||
) -> Result<rustc::UsefulnessReport<'p, 'tcx>, ErrorGuaranteed> {
|
||||
// Arena to store the extra wildcards we construct during analysis.
|
||||
let wildcard_arena = tycx.pattern_arena;
|
||||
let scrut_ty = tycx.reveal_opaque_ty(scrut_ty);
|
||||
let scrut_validity = ValidityConstraint::from_bool(tycx.known_valid_scrutinee);
|
||||
let cx = MatchCtxt { tycx, wildcard_arena };
|
||||
|
||||
let report = compute_match_usefulness(cx, arms, scrut_ty, scrut_validity);
|
||||
let report = compute_match_usefulness(cx, arms, scrut_ty, scrut_validity)?;
|
||||
|
||||
let pat_column = PatternColumn::new(arms);
|
||||
|
||||
// Lint on ranges that overlap on their endpoints, which is likely a mistake.
|
||||
lint_overlapping_range_endpoints(cx, &pat_column);
|
||||
lint_overlapping_range_endpoints(cx, &pat_column)?;
|
||||
|
||||
// Run the non_exhaustive_omitted_patterns lint. Only run on refutable patterns to avoid hitting
|
||||
// `if let`s. Only run if the match is exhaustive otherwise the error is redundant.
|
||||
if tycx.refutable && report.non_exhaustiveness_witnesses.is_empty() {
|
||||
lint_nonexhaustive_missing_variants(cx, arms, &pat_column, scrut_ty)
|
||||
lint_nonexhaustive_missing_variants(cx, arms, &pat_column, scrut_ty)?;
|
||||
}
|
||||
|
||||
report
|
||||
Ok(report)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue