mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-27 04:19:13 +00:00
Fix coercion of async block
This commit is contained in:
parent
56bee2ddaf
commit
da3fa2b7f0
2 changed files with 42 additions and 1 deletions
|
@ -933,8 +933,23 @@ impl InferenceContext<'_> {
|
||||||
let prev_ret_coercion =
|
let prev_ret_coercion =
|
||||||
mem::replace(&mut self.return_coercion, Some(CoerceMany::new(ret_ty.clone())));
|
mem::replace(&mut self.return_coercion, Some(CoerceMany::new(ret_ty.clone())));
|
||||||
|
|
||||||
|
let expected = &Expectation::has_type(ret_ty);
|
||||||
let (_, inner_ty) = self.with_breakable_ctx(BreakableKind::Border, None, None, |this| {
|
let (_, inner_ty) = self.with_breakable_ctx(BreakableKind::Border, None, None, |this| {
|
||||||
this.infer_block(tgt_expr, *id, statements, *tail, None, &Expectation::has_type(ret_ty))
|
let ty = this.infer_block(tgt_expr, *id, statements, *tail, None, expected);
|
||||||
|
if let Some(target) = expected.only_has_type(&mut this.table) {
|
||||||
|
match this.coerce(Some(tgt_expr), &ty, &target) {
|
||||||
|
Ok(res) => res,
|
||||||
|
Err(_) => {
|
||||||
|
this.result.type_mismatches.insert(
|
||||||
|
tgt_expr.into(),
|
||||||
|
TypeMismatch { expected: target.clone(), actual: ty.clone() },
|
||||||
|
);
|
||||||
|
target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ty
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
self.diverges = prev_diverges;
|
self.diverges = prev_diverges;
|
||||||
|
|
|
@ -1120,4 +1120,30 @@ fn test() {
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn type_hints_async_block() {
|
||||||
|
check_types(
|
||||||
|
r#"
|
||||||
|
//- minicore: future
|
||||||
|
async fn main() {
|
||||||
|
let _x = async { 8_i32 };
|
||||||
|
//^^ impl Future<Output = i32>
|
||||||
|
}"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn type_hints_async_block_with_tail_return_exp() {
|
||||||
|
check_types(
|
||||||
|
r#"
|
||||||
|
//- minicore: future
|
||||||
|
async fn main() {
|
||||||
|
let _x = async {
|
||||||
|
//^^ impl Future<Output = i32>
|
||||||
|
return 8_i32;
|
||||||
|
};
|
||||||
|
}"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue