Skip to content

Commit a1ca52e

Browse files
committed
Auto merge of #14486 - HKalbasi:dev, r=Veykril
Desugar async fn completely fix #14479
2 parents 265f830 + c26b12d commit a1ca52e

File tree

5 files changed

+56
-21
lines changed

5 files changed

+56
-21
lines changed

crates/hir-def/src/body.rs

+15-7
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,9 @@ impl Body {
353353
let _p = profile::span("body_with_source_map_query");
354354
let mut params = None;
355355

356-
let (file_id, module, body) = match def {
356+
let (file_id, module, body, is_async_fn) = match def {
357357
DefWithBodyId::FunctionId(f) => {
358+
let data = db.function_data(f);
358359
let f = f.lookup(db);
359360
let src = f.source(db);
360361
params = src.value.param_list().map(|param_list| {
@@ -371,27 +372,33 @@ impl Body {
371372
}),
372373
)
373374
});
374-
(src.file_id, f.module(db), src.value.body().map(ast::Expr::from))
375+
(
376+
src.file_id,
377+
f.module(db),
378+
src.value.body().map(ast::Expr::from),
379+
data.has_async_kw(),
380+
)
375381
}
376382
DefWithBodyId::ConstId(c) => {
377383
let c = c.lookup(db);
378384
let src = c.source(db);
379-
(src.file_id, c.module(db), src.value.body())
385+
(src.file_id, c.module(db), src.value.body(), false)
380386
}
381387
DefWithBodyId::StaticId(s) => {
382388
let s = s.lookup(db);
383389
let src = s.source(db);
384-
(src.file_id, s.module(db), src.value.body())
390+
(src.file_id, s.module(db), src.value.body(), false)
385391
}
386392
DefWithBodyId::VariantId(v) => {
387393
let e = v.parent.lookup(db);
388394
let src = v.parent.child_source(db);
389395
let variant = &src.value[v.local_id];
390-
(src.file_id, e.container, variant.expr())
396+
(src.file_id, e.container, variant.expr(), false)
391397
}
392398
};
393399
let expander = Expander::new(db, file_id, module);
394-
let (mut body, source_map) = Body::new(db, expander, params, body, module.krate);
400+
let (mut body, source_map) =
401+
Body::new(db, expander, params, body, module.krate, is_async_fn);
395402
body.shrink_to_fit();
396403

397404
(Arc::new(body), Arc::new(source_map))
@@ -421,8 +428,9 @@ impl Body {
421428
params: Option<(ast::ParamList, impl Iterator<Item = bool>)>,
422429
body: Option<ast::Expr>,
423430
krate: CrateId,
431+
is_async_fn: bool,
424432
) -> (Body, BodySourceMap) {
425-
lower::lower(db, expander, params, body, krate)
433+
lower::lower(db, expander, params, body, krate, is_async_fn)
426434
}
427435

428436
fn shrink_to_fit(&mut self) {

crates/hir-def/src/body/lower.rs

+22-2
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ pub(super) fn lower(
8484
params: Option<(ast::ParamList, impl Iterator<Item = bool>)>,
8585
body: Option<ast::Expr>,
8686
krate: CrateId,
87+
is_async_fn: bool,
8788
) -> (Body, BodySourceMap) {
8889
ExprCollector {
8990
db,
@@ -105,7 +106,7 @@ pub(super) fn lower(
105106
is_lowering_assignee_expr: false,
106107
is_lowering_generator: false,
107108
}
108-
.collect(params, body)
109+
.collect(params, body, is_async_fn)
109110
}
110111

111112
struct ExprCollector<'a> {
@@ -141,6 +142,7 @@ impl ExprCollector<'_> {
141142
mut self,
142143
param_list: Option<(ast::ParamList, impl Iterator<Item = bool>)>,
143144
body: Option<ast::Expr>,
145+
is_async_fn: bool,
144146
) -> (Body, BodySourceMap) {
145147
if let Some((param_list, mut attr_enabled)) = param_list {
146148
if let Some(self_param) =
@@ -170,7 +172,25 @@ impl ExprCollector<'_> {
170172
}
171173
};
172174

173-
self.body.body_expr = self.collect_expr_opt(body);
175+
self.body.body_expr = if is_async_fn {
176+
self.current_try_block =
177+
Some(self.alloc_label_desugared(Label { name: Name::generate_new_name() }));
178+
let expr = self.collect_expr_opt(body);
179+
let expr = self.alloc_expr_desugared(Expr::Block {
180+
id: None,
181+
statements: Box::new([]),
182+
tail: Some(expr),
183+
label: self.current_try_block,
184+
});
185+
let expr = self.alloc_expr_desugared(Expr::Async {
186+
id: None,
187+
statements: Box::new([]),
188+
tail: Some(expr),
189+
});
190+
expr
191+
} else {
192+
self.collect_expr_opt(body)
193+
};
174194
(self.body, self.source_map)
175195
}
176196

crates/hir-ty/src/infer.rs

-5
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,6 @@ pub(crate) struct InferenceContext<'a> {
459459
resume_yield_tys: Option<(Ty, Ty)>,
460460
diverges: Diverges,
461461
breakables: Vec<BreakableContext>,
462-
is_async_fn: bool,
463462
}
464463

465464
#[derive(Clone, Debug)]
@@ -527,7 +526,6 @@ impl<'a> InferenceContext<'a> {
527526
resolver,
528527
diverges: Diverges::Maybe,
529528
breakables: Vec::new(),
530-
is_async_fn: false,
531529
}
532530
}
533531

@@ -639,9 +637,6 @@ impl<'a> InferenceContext<'a> {
639637
self.infer_top_pat(*pat, &ty);
640638
}
641639
let return_ty = &*data.ret_type;
642-
if data.has_async_kw() {
643-
self.is_async_fn = true;
644-
}
645640

646641
let ctx = crate::lower::TyLoweringContext::new(self.db, &self.resolver)
647642
.with_impl_trait_mode(ImplTraitLoweringMode::Opaque);

crates/hir-ty/src/infer/expr.rs

+1-7
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,6 @@ impl<'a> InferenceContext<'a> {
293293

294294
// FIXME: lift these out into a struct
295295
let prev_diverges = mem::replace(&mut self.diverges, Diverges::Maybe);
296-
let prev_is_async_fn = mem::replace(&mut self.is_async_fn, false);
297296
let prev_ret_ty = mem::replace(&mut self.return_ty, ret_ty.clone());
298297
let prev_ret_coercion =
299298
mem::replace(&mut self.return_coercion, Some(CoerceMany::new(ret_ty)));
@@ -307,7 +306,6 @@ impl<'a> InferenceContext<'a> {
307306
self.diverges = prev_diverges;
308307
self.return_ty = prev_ret_ty;
309308
self.return_coercion = prev_ret_coercion;
310-
self.is_async_fn = prev_is_async_fn;
311309
self.resume_yield_tys = prev_resume_yield_tys;
312310

313311
ty
@@ -963,11 +961,7 @@ impl<'a> InferenceContext<'a> {
963961
.as_mut()
964962
.expect("infer_return called outside function body")
965963
.expected_ty();
966-
let return_expr_ty = if self.is_async_fn {
967-
self.infer_async_block(expr, &None, &[], &Some(expr))
968-
} else {
969-
self.infer_expr_inner(expr, &Expectation::HasType(ret_ty))
970-
};
964+
let return_expr_ty = self.infer_expr_inner(expr, &Expectation::HasType(ret_ty));
971965
let mut coerce_many = self.return_coercion.take().unwrap();
972966
coerce_many.coerce(self, Some(expr), &return_expr_ty);
973967
self.return_coercion = Some(coerce_many);

crates/hir-ty/src/tests/simple.rs

+18
Original file line numberDiff line numberDiff line change
@@ -2094,6 +2094,24 @@ async fn main() {
20942094
"#]],
20952095
)
20962096
}
2097+
2098+
#[test]
2099+
fn async_fn_and_try_operator() {
2100+
check_no_mismatches(
2101+
r#"
2102+
//- minicore: future, result, fn, try, from
2103+
async fn foo() -> Result<(), ()> {
2104+
Ok(())
2105+
}
2106+
2107+
async fn bar() -> Result<(), ()> {
2108+
let x = foo().await?;
2109+
Ok(x)
2110+
}
2111+
"#,
2112+
)
2113+
}
2114+
20972115
#[test]
20982116
fn async_block_early_return() {
20992117
check_infer(

0 commit comments

Comments
 (0)