mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-03 15:15:24 +00:00
Auto merge of #13523 - lowr:fix/adjust-expectation-for-if, r=lnicola
fix: disregard type variable expectation for if expressions
Fixes #13522
As [the comment](8142d1f606/crates/hir-ty/src/infer.rs (L1087-L1090)
) on `Expectation::adjust_for_branches` explains:
> If the expected type is just a type variable, then don't use an expected type. Otherwise, we might write parts of the type when checking the 'then' block which are incompatible with the 'else' branch.
Note that we already use it in match expressions. I've added tests for them too nevertheless.
This commit is contained in:
commit
07f6efc4e7
2 changed files with 34 additions and 0 deletions
|
@ -85,6 +85,7 @@ impl<'a> InferenceContext<'a> {
|
|||
let ty = match &self.body[tgt_expr] {
|
||||
Expr::Missing => self.err_ty(),
|
||||
&Expr::If { condition, then_branch, else_branch } => {
|
||||
let expected = &expected.adjust_for_branches(&mut self.table);
|
||||
self.infer_expr(
|
||||
condition,
|
||||
&Expectation::has_type(TyKind::Scalar(Scalar::Bool).intern(Interner)),
|
||||
|
|
|
@ -122,6 +122,23 @@ fn test() {
|
|||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn if_else_adjust_for_branches_discard_type_var() {
|
||||
check_no_mismatches(
|
||||
r#"
|
||||
fn test() {
|
||||
let f = || {
|
||||
if true {
|
||||
&""
|
||||
} else {
|
||||
""
|
||||
}
|
||||
};
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn match_first_coerce() {
|
||||
check_no_mismatches(
|
||||
|
@ -182,6 +199,22 @@ fn test() {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn match_adjust_for_branches_discard_type_var() {
|
||||
check_no_mismatches(
|
||||
r#"
|
||||
fn test() {
|
||||
let f = || {
|
||||
match 0i32 {
|
||||
0i32 => &"",
|
||||
_ => "",
|
||||
}
|
||||
};
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn return_coerce_unknown() {
|
||||
check_types(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue