Auto merge of #118847 - eholk:for-await, r=compiler-errors
Add support for `for await` loops This adds support for `for await` loops. This includes parsing, desugaring in AST->HIR lowering, and adding some support functions to the library. Given a loop like: ```rust for await i in iter { ... } ``` this is desugared to something like: ```rust let mut iter = iter.into_async_iter(); while let Some(i) = loop { match core::pin::Pin::new(&mut iter).poll_next(cx) { Poll::Ready(i) => break i, Poll::Pending => yield, } } { ... } ``` This PR also adds a basic `IntoAsyncIterator` trait. This is partly for symmetry with the way `Iterator` and `IntoIterator` work. The other reason is that for async iterators it's helpful to have a place apart from the data structure being iterated over to store state. `IntoAsyncIterator` gives us a good place to do this. I've gated this feature behind `async_for_loop` and opened #118898 as the feature tracking issue. r? `@compiler-errors`
This commit is contained in:
commit
208dd2032b
34 changed files with 367 additions and 79 deletions
|
@ -4258,11 +4258,11 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
|
|||
});
|
||||
}
|
||||
|
||||
ExprKind::ForLoop(ref pat, ref iter_expr, ref block, label) => {
|
||||
self.visit_expr(iter_expr);
|
||||
ExprKind::ForLoop { ref pat, ref iter, ref body, label, kind: _ } => {
|
||||
self.visit_expr(iter);
|
||||
self.with_rib(ValueNS, RibKind::Normal, |this| {
|
||||
this.resolve_pattern_top(pat, PatternSource::For);
|
||||
this.resolve_labeled_block(label, expr.id, block);
|
||||
this.resolve_labeled_block(label, expr.id, body);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -1409,7 +1409,7 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
|
|||
| ExprKind::Unary(..)
|
||||
| ExprKind::If(..)
|
||||
| ExprKind::While(..)
|
||||
| ExprKind::ForLoop(..)
|
||||
| ExprKind::ForLoop { .. }
|
||||
| ExprKind::Match(..),
|
||||
..
|
||||
}),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue