- }) => (
- match return_ty.output {
- hir::FnRetTy::DefaultReturn(_) => tcx.sess.source_map().end_point(*span),
- hir::FnRetTy::Return(_) => return_ty.output.span(),
- },
- if gen_move.is_some() { " of generator" } else { " of closure" },
- ),
- hir::Node::ImplItem(hir::ImplItem {
- kind: hir::ImplItemKind::Fn(method_sig, _),
- ..
- }) => (method_sig.decl.output.span(), ""),
- _ => (self.body.span, ""),
+ }) => {
+ let (mut span, mut hir_ty) = match return_ty.output {
+ hir::FnRetTy::DefaultReturn(_) => {
+ (tcx.sess.source_map().end_point(*span), None)
+ }
+ hir::FnRetTy::Return(hir_ty) => (return_ty.output.span(), Some(hir_ty)),
+ };
+ let mir_description = match hir.body(*body_id).generator_kind {
+ Some(hir::GeneratorKind::Async(gen)) => match gen {
+ hir::AsyncGeneratorKind::Block => " of async block",
+ hir::AsyncGeneratorKind::Closure => " of async closure",
+ hir::AsyncGeneratorKind::Fn => {
+ let parent_item = hir.get(hir.get_parent_item(mir_hir_id));
+ let output = &parent_item
+ .fn_decl()
+ .expect("generator lowered from async fn should be in fn")
+ .output;
+ span = output.span();
+ if let hir::FnRetTy::Return(ret) = output {
+ hir_ty = Some(self.get_future_inner_return_ty(*ret));
+ }
+ " of async function"
+ }
+ },
+ Some(hir::GeneratorKind::Gen) => " of generator",
+ None => " of closure",
+ };
+ (span, mir_description, hir_ty)
+ }
+ node => match node.fn_decl() {
+ Some(fn_decl) => {
+ let hir_ty = match fn_decl.output {
+ hir::FnRetTy::DefaultReturn(_) => None,
+ hir::FnRetTy::Return(ty) => Some(ty),
+ };
+ (fn_decl.output.span(), "", hir_ty)
+ }
+ None => (self.body.span, "", None),
+ },