Make the coroutine def id of an async closure the child of the closure def id

This commit is contained in:
Michael Goulet 2024-01-27 00:50:31 +00:00
parent 6b4f1c5e78
commit 5d8c1780fa
3 changed files with 43 additions and 6 deletions

View File

@ -289,12 +289,18 @@ fn visit_expr(&mut self, expr: &'a Expr) {
// we must create two defs.
let closure_def = self.create_def(expr.id, kw::Empty, DefKind::Closure, expr.span);
match closure.coroutine_kind {
Some(coroutine_kind) => self.create_def(
coroutine_kind.closure_id(),
kw::Empty,
DefKind::Closure,
expr.span,
),
Some(coroutine_kind) => {
self.with_parent(closure_def, |this| {
let coroutine_def = this.create_def(
coroutine_kind.closure_id(),
kw::Empty,
DefKind::Closure,
expr.span,
);
this.with_parent(coroutine_def, |this| visit::walk_expr(this, expr));
});
return;
}
None => closure_def,
}
}

View File

@ -0,0 +1,14 @@
// compile-flags: -Zverbose-internals
// edition:2021
#![feature(async_closure)]
fn main() {
let x = async || {};
//~^ NOTE the expected `async` closure body
let () = x();
//~^ ERROR mismatched types
//~| NOTE this expression has type `{static main::{closure#0}::{closure#0} upvar_tys=
//~| NOTE expected `async` closure body, found `()`
//~| NOTE expected `async` closure body `{static main::{closure#0}::{closure#0}
}

View File

@ -0,0 +1,17 @@
error[E0308]: mismatched types
--> $DIR/def-path.rs:9:9
|
LL | let x = async || {};
| -- the expected `async` closure body
LL |
LL | let () = x();
| ^^ --- this expression has type `{static main::{closure#0}::{closure#0} upvar_tys=?7t witness=?8t}`
| |
| expected `async` closure body, found `()`
|
= note: expected `async` closure body `{static main::{closure#0}::{closure#0} upvar_tys=?7t witness=?8t}`
found unit type `()`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.