diff options
| author | Arpad Borsos <swatinem@swatinem.de> | 2022-11-19 18:23:32 +0100 |
|---|---|---|
| committer | Arpad Borsos <swatinem@swatinem.de> | 2022-11-19 18:23:32 +0100 |
| commit | b59090ebe3779732033c7d984e1f8b369798b3a4 (patch) | |
| tree | 243c15270243e5a7f6691f7386cae2cb5e3b3e6f | |
| parent | 62c627c7a3a9b3e193a5ae6e1ec7348bc5136301 (diff) | |
| download | rust-b59090ebe3779732033c7d984e1f8b369798b3a4.tar.gz rust-b59090ebe3779732033c7d984e1f8b369798b3a4.zip | |
Lower return type outside async block creation
This allows feeding a different output type to async blocks with a different `ImplTraitContext`.
| -rw-r--r-- | compiler/rustc_ast_lowering/src/expr.rs | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/compiler/rustc_ast_lowering/src/expr.rs b/compiler/rustc_ast_lowering/src/expr.rs index eaa5a38388a..7cb794c2b09 100644 --- a/compiler/rustc_ast_lowering/src/expr.rs +++ b/compiler/rustc_ast_lowering/src/expr.rs @@ -588,17 +588,12 @@ impl<'hir> LoweringContext<'_, 'hir> { &mut self, capture_clause: CaptureBy, closure_node_id: NodeId, - ret_ty: Option<AstP<Ty>>, + ret_ty: Option<hir::FnRetTy<'hir>>, span: Span, async_gen_kind: hir::AsyncGeneratorKind, body: impl FnOnce(&mut Self) -> hir::Expr<'hir>, ) -> hir::ExprKind<'hir> { - let output = match ret_ty { - Some(ty) => hir::FnRetTy::Return( - self.lower_ty(&ty, &ImplTraitContext::Disallowed(ImplTraitPosition::AsyncBlock)), - ), - None => hir::FnRetTy::DefaultReturn(self.lower_span(span)), - }; + let output = ret_ty.unwrap_or_else(|| hir::FnRetTy::DefaultReturn(self.lower_span(span))); // Resume argument type. We let the compiler infer this to simplify the lowering. It is // fully constrained by `future::from_generator`. @@ -1003,8 +998,13 @@ impl<'hir> LoweringContext<'_, 'hir> { // Transform `async |x: u8| -> X { ... }` into // `|x: u8| future_from_generator(|| -> X { ... })`. let body_id = this.lower_fn_body(&outer_decl, |this| { - let async_ret_ty = - if let FnRetTy::Ty(ty) = &decl.output { Some(ty.clone()) } else { None }; + let async_ret_ty = if let FnRetTy::Ty(ty) = &decl.output { + let itctx = ImplTraitContext::Disallowed(ImplTraitPosition::AsyncBlock); + Some(hir::FnRetTy::Return(this.lower_ty(&ty, &itctx))) + } else { + None + }; + let async_body = this.make_async_expr( capture_clause, inner_closure_id, |
