Statically enforce revealing of opaques
This commit is contained in:
parent
e51e98dde6
commit
c35272058d
5 changed files with 132 additions and 94 deletions
|
@ -554,7 +554,7 @@ impl<'p, 'tcx> MatchVisitor<'p, 'tcx> {
|
|||
let cx = self.new_cx(refutability, None, scrut, pat.span);
|
||||
let pat = self.lower_pattern(&cx, pat)?;
|
||||
let arms = [MatchArm { pat, arm_data: self.lint_level, has_guard: false }];
|
||||
let report = analyze_match(&cx, &arms, pat.ty());
|
||||
let report = analyze_match(&cx, &arms, pat.ty().inner());
|
||||
Ok((cx, report))
|
||||
}
|
||||
|
||||
|
@ -972,7 +972,7 @@ fn report_non_exhaustive_match<'p, 'tcx>(
|
|||
}
|
||||
} else if ty == cx.tcx.types.str_ {
|
||||
err.note("`&str` cannot be matched exhaustively, so a wildcard `_` is necessary");
|
||||
} else if cx.is_foreign_non_exhaustive_enum(ty) {
|
||||
} else if cx.is_foreign_non_exhaustive_enum(cx.reveal_opaque_ty(ty)) {
|
||||
err.note(format!("`{ty}` is marked as non-exhaustive, so a wildcard `_` is necessary to match exhaustively"));
|
||||
}
|
||||
}
|
||||
|
@ -1112,12 +1112,12 @@ fn collect_non_exhaustive_tys<'tcx>(
|
|||
non_exhaustive_tys: &mut FxIndexSet<Ty<'tcx>>,
|
||||
) {
|
||||
if matches!(pat.ctor(), Constructor::NonExhaustive) {
|
||||
non_exhaustive_tys.insert(pat.ty());
|
||||
non_exhaustive_tys.insert(pat.ty().inner());
|
||||
}
|
||||
if let Constructor::IntRange(range) = pat.ctor() {
|
||||
if cx.is_range_beyond_boundaries(range, pat.ty()) {
|
||||
// The range denotes the values before `isize::MIN` or the values after `usize::MAX`/`isize::MAX`.
|
||||
non_exhaustive_tys.insert(pat.ty());
|
||||
non_exhaustive_tys.insert(pat.ty().inner());
|
||||
}
|
||||
}
|
||||
pat.iter_fields()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue