Fix: infer type of async block with tail return expr #17174
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #17106
The
infer_async_block
method calls theinfer_block
method internally, which returns the never type without coercion whentail_expr
isNone
andctx.diverges
isDiverges::Always
.This is the reason for the bug in this issue.rust-analyzer/crates/hir-ty/src/infer/expr.rs
Lines 1411 to 1413 in cfce2bb
This PR solves the bug by adding a process to coerce after calling
infer_block
method.This code passes all the tests, including tests I added for this isuue, however, I am not sure if this solution is right. I think that this solution is an ad hoc solution. So, I would appreciate to have your review.
I apologize if I'm off the mark, but
infer_async_block
method should be rewritten to share code with the process of infering type ofexpr::Closure
instead of theinfer_block
method. That way it will be closer to the infer process of rustc.