From af175ddcdcfeddf6814b67bce8abb68a954981eb Mon Sep 17 00:00:00 2001 From: Zachary S Date: Sun, 7 Aug 2022 00:02:25 -0500 Subject: [PATCH] Add test for async closure types. (rebased onto 6dfd8ae) --- crates/hir-def/src/body/pretty.rs | 2 +- crates/hir-ty/src/tests/traits.rs | 40 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/crates/hir-def/src/body/pretty.rs b/crates/hir-def/src/body/pretty.rs index 610b7d8008d..de3d995c9a0 100644 --- a/crates/hir-def/src/body/pretty.rs +++ b/crates/hir-def/src/body/pretty.rs @@ -386,7 +386,7 @@ impl<'a> Printer<'a> { self.print_type_ref(ret_ty); } (None, ClosureKind::Async) => { - w!(self, " -> impl Future"); // FIXME(zachs18): {unknown} or ()? + w!(self, " -> impl Future"); } (None, _) => {} } diff --git a/crates/hir-ty/src/tests/traits.rs b/crates/hir-ty/src/tests/traits.rs index 015085bde45..4e9b1611fb2 100644 --- a/crates/hir-ty/src/tests/traits.rs +++ b/crates/hir-ty/src/tests/traits.rs @@ -82,6 +82,46 @@ async fn test() { ); } +#[test] +fn infer_async_closure() { + check_types( + r#" +//- minicore: future, option +async fn test() { + let f = async move |x: i32| x + 42; + f; +// ^ |i32| -> impl Future + let a = f(4); + a; +// ^ impl Future + let x = a.await; + x; +// ^ i32 + let f = async move || 42; + f; +// ^ || -> impl Future + let a = f(); + a; +// ^ impl Future + let x = a.await; + x; +// ^ i32 + let b = ((async move || {})()).await; + b; +// ^ () + let c = async move || { + let y = None; + y + // ^ Option + }; + let _: Option = c().await; + c; +// ^ || -> impl Future> +} +"#, + ); +} + #[test] fn auto_sized_async_block() { check_no_mismatches(