Rollup merge of #117152 - compiler-errors:no-ret-coercion, r=chenyukang

Fix unwrap suggestion for async fn

Use `body_fn_sig` to get the expected return type of the function instead of `ret_coercion` in `FnCtxt`. This avoids accessing the `ret_coercion` when it's already mutably borrowed (e.g. when checking `return` expressions).

Fixes #117144

r? `@chenyukang`
This commit is contained in:
Matthias Krüger 2023-10-25 19:51:14 +02:00 committed by GitHub
commit 585a122264
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 12 deletions

View file

@ -1747,19 +1747,17 @@ pub(crate) fn suggest_missing_unwrap_expect(
expected: Ty<'tcx>,
found: Ty<'tcx>,
) -> bool {
let ty::Adt(adt, args) = found.kind() else { return false };
let ty::Adt(adt, args) = found.kind() else {
return false;
};
let ret_ty_matches = |diagnostic_item| {
if let Some(ret_ty) = self
.ret_coercion
.as_ref()
.map(|c| self.resolve_vars_if_possible(c.borrow().expected_ty()))
&& let ty::Adt(kind, _) = ret_ty.kind()
&& self.tcx.get_diagnostic_item(diagnostic_item) == Some(kind.did())
{
true
} else {
false
}
let Some(sig) = self.body_fn_sig() else {
return false;
};
let ty::Adt(kind, _) = sig.output().kind() else {
return false;
};
self.tcx.is_diagnostic_item(diagnostic_item, kind.did())
};
// don't suggest anything like `Ok(ok_val).unwrap()` , `Some(some_val).unwrap()`,

View file

@ -0,0 +1,22 @@
// edition: 2021
async fn dont_suggest() -> i32 {
if false {
return Ok(6);
//~^ ERROR mismatched types
}
5
}
async fn do_suggest() -> i32 {
if false {
let s = Ok(6);
return s;
//~^ ERROR mismatched types
}
5
}
fn main() {}

View file

@ -0,0 +1,25 @@
error[E0308]: mismatched types
--> $DIR/async-unwrap-suggestion.rs:5:16
|
LL | return Ok(6);
| ^^^^^ expected `i32`, found `Result<{integer}, _>`
|
= note: expected type `i32`
found enum `Result<{integer}, _>`
error[E0308]: mismatched types
--> $DIR/async-unwrap-suggestion.rs:15:16
|
LL | return s;
| ^ expected `i32`, found `Result<{integer}, _>`
|
= note: expected type `i32`
found enum `Result<{integer}, _>`
help: consider using `Result::expect` to unwrap the `Result<{integer}, _>` value, panicking if the value is a `Result::Err`
|
LL | return s.expect("REASON");
| +++++++++++++++++
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`.