Skip to content

Commit

Permalink
Rollup merge of #98879 - compiler-errors:async-closure-wrap-parens, r…
Browse files Browse the repository at this point in the history
…=oli-obk

Fix "wrap closure in parenthesis" suggestion for `async` closure

Fixes #98023
  • Loading branch information
JohnTitor authored Jul 4, 2022
2 parents c9857bf + eef5630 commit fc9b5de
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 5 deletions.
27 changes: 24 additions & 3 deletions compiler/rustc_typeck/src/check/callee.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,15 +280,36 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
callee_node: &hir::ExprKind<'_>,
callee_span: Span,
) {
let hir_id = self.tcx.hir().get_parent_node(hir_id);
let parent_node = self.tcx.hir().get(hir_id);
let hir = self.tcx.hir();
let parent_hir_id = hir.get_parent_node(hir_id);
let parent_node = hir.get(parent_hir_id);
if let (
hir::Node::Expr(hir::Expr {
kind: hir::ExprKind::Closure { fn_decl_span, .. }, ..
kind: hir::ExprKind::Closure { fn_decl_span, body, .. },
..
}),
hir::ExprKind::Block(..),
) = (parent_node, callee_node)
{
let fn_decl_span = if hir.body(*body).generator_kind
== Some(hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Closure))
{
// Actually need to unwrap a few more layers of HIR to get to
// the _real_ closure...
let async_closure = hir.get_parent_node(hir.get_parent_node(parent_hir_id));
if let hir::Node::Expr(hir::Expr {
kind: hir::ExprKind::Closure { fn_decl_span, .. },
..
}) = hir.get(async_closure)
{
*fn_decl_span
} else {
return;
}
} else {
*fn_decl_span
};

let start = fn_decl_span.shrink_to_lo();
let end = callee_span.shrink_to_hi();
err.multipart_suggestion(
Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/suggestions/suggest-on-bare-closure-call.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
// edition:2021

#![feature(async_closure)]

fn main() {
let _ = ||{}();
//~^ ERROR expected function, found `()`

let _ = async ||{}();
//~^ ERROR expected function, found `()`
}
17 changes: 15 additions & 2 deletions src/test/ui/suggestions/suggest-on-bare-closure-call.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0618]: expected function, found `()`
--> $DIR/suggest-on-bare-closure-call.rs:2:15
--> $DIR/suggest-on-bare-closure-call.rs:6:15
|
LL | let _ = ||{}();
| ^^--
Expand All @@ -11,6 +11,19 @@ help: if you meant to create this closure and immediately call it, surround the
LL | let _ = (||{})();
| + +

error: aborting due to previous error
error[E0618]: expected function, found `()`
--> $DIR/suggest-on-bare-closure-call.rs:9:21
|
LL | let _ = async ||{}();
| ^^--
| |
| call expression requires function
|
help: if you meant to create this closure and immediately call it, surround the closure with parentheses
|
LL | let _ = (async ||{})();
| + +

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0618`.

0 comments on commit fc9b5de

Please sign in to comment.