Skip to content

Commit

Permalink
fix: report type mismatch on identifier in destructuring assignments
Browse files Browse the repository at this point in the history
  • Loading branch information
lowr committed Jul 2, 2022
1 parent afdbd6c commit 649e1f5
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 1 deletion.
10 changes: 9 additions & 1 deletion crates/hir-ty/src/infer/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -911,7 +911,15 @@ impl<'a> InferenceContext<'a> {
let lhs_ty = self.insert_type_vars_shallow(lhs_ty);
let ty = match self.coerce(None, &rhs_ty, &lhs_ty) {
Ok(ty) => ty,
Err(_) => self.err_ty(),
Err(_) => {
self.result.type_mismatches.insert(
lhs.into(),
TypeMismatch { expected: rhs_ty.clone(), actual: lhs_ty.clone() },
);
// `rhs_ty` is returned so no further type mismatches are
// reported because of this mismatch.
rhs_ty
}
};
self.write_expr_ty(lhs, ty.clone());
return ty;
Expand Down
27 changes: 27 additions & 0 deletions crates/hir-ty/src/tests/simple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3043,3 +3043,30 @@ fn main() {
"#,
);
}

#[test]
fn destructuring_assignment_type_mismatch_on_identifier() {
check(
r#"
struct S { v: i64 }
struct TS(i64);
fn main() {
let mut a: usize = 0;
(a,) = (0i64,);
//^expected i64, got usize
let mut a: usize = 0;
[a,] = [0i64,];
//^expected i64, got usize
let mut a: usize = 0;
S { v: a } = S { v: 0 };
//^expected i64, got usize
let mut a: usize = 0;
TS(a) = TS(0);
//^expected i64, got usize
}
"#,
);
}

0 comments on commit 649e1f5

Please sign in to comment.