Make the coroutine def id of an async closure the child of the closure def id
This commit is contained in:
parent
6b4f1c5e78
commit
5d8c1780fa
3 changed files with 43 additions and 6 deletions
|
@ -289,12 +289,18 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
|
||||||
// we must create two defs.
|
// we must create two defs.
|
||||||
let closure_def = self.create_def(expr.id, kw::Empty, DefKind::Closure, expr.span);
|
let closure_def = self.create_def(expr.id, kw::Empty, DefKind::Closure, expr.span);
|
||||||
match closure.coroutine_kind {
|
match closure.coroutine_kind {
|
||||||
Some(coroutine_kind) => self.create_def(
|
Some(coroutine_kind) => {
|
||||||
|
self.with_parent(closure_def, |this| {
|
||||||
|
let coroutine_def = this.create_def(
|
||||||
coroutine_kind.closure_id(),
|
coroutine_kind.closure_id(),
|
||||||
kw::Empty,
|
kw::Empty,
|
||||||
DefKind::Closure,
|
DefKind::Closure,
|
||||||
expr.span,
|
expr.span,
|
||||||
),
|
);
|
||||||
|
this.with_parent(coroutine_def, |this| visit::walk_expr(this, expr));
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
None => closure_def,
|
None => closure_def,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
14
tests/ui/async-await/async-closures/def-path.rs
Normal file
14
tests/ui/async-await/async-closures/def-path.rs
Normal 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}
|
||||||
|
}
|
17
tests/ui/async-await/async-closures/def-path.stderr
Normal file
17
tests/ui/async-await/async-closures/def-path.stderr
Normal 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`.
|
Loading…
Add table
Add a link
Reference in a new issue