Skip to content

Commit 44e2c6e

Browse files
committed
Don't emit two type mismatches for literal pattern mismatches
1 parent ec273c3 commit 44e2c6e

File tree

2 files changed

+9
-13
lines changed

2 files changed

+9
-13
lines changed

crates/hir-ty/src/infer/pat.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,8 @@ impl<'a> InferenceContext<'a> {
181181
.intern(Interner)
182182
}
183183

184-
pub(super) fn infer_top_pat(&mut self, pat: PatId, expected: &Ty) -> Ty {
185-
self.infer_pat(pat, expected, BindingMode::default())
184+
pub(super) fn infer_top_pat(&mut self, pat: PatId, expected: &Ty) {
185+
self.infer_pat(pat, expected, BindingMode::default());
186186
}
187187

188188
fn infer_pat(&mut self, pat: PatId, expected: &Ty, mut default_bm: BindingMode) -> Ty {
@@ -260,7 +260,12 @@ impl<'a> InferenceContext<'a> {
260260
let start_ty = self.infer_expr(*start, &Expectation::has_type(expected.clone()));
261261
self.infer_expr(*end, &Expectation::has_type(start_ty))
262262
}
263-
&Pat::Lit(expr) => self.infer_lit_pat(expr, &expected),
263+
&Pat::Lit(expr) => {
264+
// Don't emit type mismatches again, the expression lowering already did that.
265+
let ty = self.infer_lit_pat(expr, &expected);
266+
self.write_pat_ty(pat, ty.clone());
267+
return ty;
268+
}
264269
Pat::Box { inner } => match self.resolve_boxed_box() {
265270
Some(box_adt) => {
266271
let (inner_ty, alloc_ty) = match expected.as_adt() {

crates/ide-diagnostics/src/handlers/type_mismatch.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::TypeMismatch) -> Option<Vec<Assi
5454
remove_semicolon(ctx, d, expr_ptr, &mut fixes);
5555
str_ref_to_owned(ctx, d, expr_ptr, &mut fixes);
5656
}
57-
Either::Right(_pat_ptr) => (),
57+
Either::Right(_pat_ptr) => {}
5858
}
5959

6060
if fixes.is_empty() {
@@ -63,14 +63,6 @@ fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::TypeMismatch) -> Option<Vec<Assi
6363
Some(fixes)
6464
}
6565
}
66-
fn add_reference_pat(
67-
ctx: &DiagnosticsContext<'_>,
68-
d: &hir::TypeMismatch,
69-
expr_ptr: &InFile<AstPtr<ast::Pat>>,
70-
acc: &mut Vec<Assist>,
71-
) -> Option<()> {
72-
None
73-
}
7466

7567
fn add_reference(
7668
ctx: &DiagnosticsContext<'_>,
@@ -630,7 +622,6 @@ fn f() {
630622
&9 => ()
631623
//^^ error: expected &(), found &i32
632624
//^ error: expected (), found i32
633-
//^ error: expected (), found i32
634625
}
635626
}
636627
"#,

0 commit comments

Comments
 (0)