Skip match diagnostics for partially unknown types
This commit is contained in:
parent
bbb441ec6d
commit
cd2347e132
@ -182,7 +182,7 @@ fn validate_match(
|
|||||||
db: &dyn HirDatabase,
|
db: &dyn HirDatabase,
|
||||||
) {
|
) {
|
||||||
let scrut_ty = &self.infer[scrutinee_expr];
|
let scrut_ty = &self.infer[scrutinee_expr];
|
||||||
if scrut_ty.is_unknown() {
|
if scrut_ty.contains_unknown() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,6 +267,9 @@ fn validate_block(&mut self, db: &dyn HirDatabase, expr: &Expr) {
|
|||||||
};
|
};
|
||||||
let Some(initializer) = initializer else { continue };
|
let Some(initializer) = initializer else { continue };
|
||||||
let ty = &self.infer[initializer];
|
let ty = &self.infer[initializer];
|
||||||
|
if ty.contains_unknown() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let mut have_errors = false;
|
let mut have_errors = false;
|
||||||
let deconstructed_pat = self.lower_pattern(&cx, pat, db, &mut have_errors);
|
let deconstructed_pat = self.lower_pattern(&cx, pat, db, &mut have_errors);
|
||||||
|
@ -597,21 +597,19 @@ fn bang(never: !) {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn unknown_type() {
|
fn unknown_type() {
|
||||||
cov_mark::check_count!(validate_match_bailed_out, 1);
|
check_diagnostics_no_bails(
|
||||||
|
|
||||||
check_diagnostics(
|
|
||||||
r#"
|
r#"
|
||||||
enum Option<T> { Some(T), None }
|
enum Option<T> { Some(T), None }
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
fn main() {
|
fn main() {
|
||||||
// `Never` is deliberately not defined so that it's an uninferred type.
|
// `Never` is deliberately not defined so that it's an uninferred type.
|
||||||
|
// We ignore these to avoid triggering bugs in the analysis.
|
||||||
match Option::<Never>::None {
|
match Option::<Never>::None {
|
||||||
None => (),
|
None => (),
|
||||||
Some(never) => match never {},
|
Some(never) => match never {},
|
||||||
}
|
}
|
||||||
match Option::<Never>::None {
|
match Option::<Never>::None {
|
||||||
//^^^^^^^^^^^^^^^^^^^^^ error: missing match arm: `None` not covered
|
|
||||||
Option::Some(_never) => {},
|
Option::Some(_never) => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -619,6 +617,18 @@ fn main() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn arity_mismatch_issue_16746() {
|
||||||
|
check_diagnostics_with_disabled(
|
||||||
|
r#"
|
||||||
|
fn main() {
|
||||||
|
let (a, ) = (0, 0);
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
&["E0308"],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn tuple_of_bools_with_ellipsis_at_end_missing_arm() {
|
fn tuple_of_bools_with_ellipsis_at_end_missing_arm() {
|
||||||
check_diagnostics_no_bails(
|
check_diagnostics_no_bails(
|
||||||
|
Loading…
Reference in New Issue
Block a user