Skip to content

Commit feffe06

Browse files
Compute layout with spans for better cycle errors in coroutines
1 parent 2b603f9 commit feffe06

File tree

4 files changed

+28
-17
lines changed

4 files changed

+28
-17
lines changed

compiler/rustc_ast_lowering/src/expr.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -792,8 +792,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
792792
// debuggers and debugger extensions expect it to be called `__awaitee`. They use
793793
// this name to identify what is being awaited by a suspended async functions.
794794
let awaitee_ident = Ident::with_dummy_span(sym::__awaitee);
795-
let (awaitee_pat, awaitee_pat_hid) =
796-
self.pat_ident_binding_mode(span, awaitee_ident, hir::BindingAnnotation::MUT);
795+
let (awaitee_pat, awaitee_pat_hid) = self.pat_ident_binding_mode(
796+
gen_future_span,
797+
awaitee_ident,
798+
hir::BindingAnnotation::MUT,
799+
);
797800

798801
let task_context_ident = Ident::with_dummy_span(sym::_task_context);
799802

compiler/rustc_ty_utils/src/layout.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -740,11 +740,11 @@ fn coroutine_layout<'tcx>(
740740
};
741741
let tag_layout = cx.tcx.mk_layout(LayoutS::scalar(cx, tag));
742742

743-
let promoted_layouts = ineligible_locals
744-
.iter()
745-
.map(|local| subst_field(info.field_tys[local].ty))
746-
.map(|ty| Ty::new_maybe_uninit(tcx, ty))
747-
.map(|ty| Ok(cx.layout_of(ty)?.layout));
743+
let promoted_layouts = ineligible_locals.iter().map(|local| {
744+
let field_ty = subst_field(info.field_tys[local].ty);
745+
let uninit_ty = Ty::new_maybe_uninit(tcx, field_ty);
746+
Ok(cx.spanned_layout_of(uninit_ty, info.field_tys[local].source_info.span)?.layout)
747+
});
748748
let prefix_layouts = args
749749
.as_coroutine()
750750
.prefix_tys()

tests/ui/type-alias-impl-trait/indirect-recursion-issue-112047.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// edition: 2021
22
// build-fail
3-
//~^^ ERROR cycle detected when computing layout of
43

54
#![feature(impl_trait_in_assoc_type)]
65

@@ -21,6 +20,7 @@ impl Recur for () {
2120

2221
fn recur(self) -> Self::Recur {
2322
async move { recur(self).await; }
23+
//~^^ ERROR cycle detected when computing layout of
2424
}
2525
}
2626

tests/ui/type-alias-impl-trait/indirect-recursion-issue-112047.stderr

+17-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
1-
error[E0391]: cycle detected when computing layout of `{async block@$DIR/indirect-recursion-issue-112047.rs:23:9: 23:42}`
1+
error[E0391]: cycle detected when computing layout of `{async block@$DIR/indirect-recursion-issue-112047.rs:22:9: 22:42}`
2+
--> $DIR/indirect-recursion-issue-112047.rs:22:22
23
|
3-
= note: ...which requires computing layout of `core::mem::maybe_uninit::MaybeUninit<{async fn body@$DIR/indirect-recursion-issue-112047.rs:15:31: 17:2}>`...
4-
= note: ...which requires computing layout of `core::mem::manually_drop::ManuallyDrop<{async fn body@$DIR/indirect-recursion-issue-112047.rs:15:31: 17:2}>`...
5-
= note: ...which requires computing layout of `{async fn body@$DIR/indirect-recursion-issue-112047.rs:15:31: 17:2}`...
4+
LL | async move { recur(self).await; }
5+
| ^^^^^^^^^^^^^^^^^
6+
|
7+
= note: ...which requires computing layout of `core::mem::maybe_uninit::MaybeUninit<{async fn body@$DIR/indirect-recursion-issue-112047.rs:14:31: 16:2}>`...
8+
= note: ...which requires computing layout of `core::mem::manually_drop::ManuallyDrop<{async fn body@$DIR/indirect-recursion-issue-112047.rs:14:31: 16:2}>`...
9+
note: ...which requires computing layout of `{async fn body@$DIR/indirect-recursion-issue-112047.rs:14:31: 16:2}`...
10+
--> $DIR/indirect-recursion-issue-112047.rs:15:5
11+
|
12+
LL | t.recur().await;
13+
| ^^^^^^^^^^^^^^^
614
= note: ...which requires computing layout of `core::mem::maybe_uninit::MaybeUninit<<() as Recur>::Recur>`...
7-
= note: ...which requires computing layout of `core::mem::maybe_uninit::MaybeUninit<{async block@$DIR/indirect-recursion-issue-112047.rs:23:9: 23:42}>`...
8-
= note: ...which requires computing layout of `core::mem::manually_drop::ManuallyDrop<{async block@$DIR/indirect-recursion-issue-112047.rs:23:9: 23:42}>`...
9-
= note: ...which again requires computing layout of `{async block@$DIR/indirect-recursion-issue-112047.rs:23:9: 23:42}`, completing the cycle
10-
note: cycle used when elaborating drops for `<impl at $DIR/indirect-recursion-issue-112047.rs:19:1: 19:18>::recur`
11-
--> $DIR/indirect-recursion-issue-112047.rs:22:5
15+
= note: ...which requires computing layout of `core::mem::maybe_uninit::MaybeUninit<{async block@$DIR/indirect-recursion-issue-112047.rs:22:9: 22:42}>`...
16+
= note: ...which requires computing layout of `core::mem::manually_drop::ManuallyDrop<{async block@$DIR/indirect-recursion-issue-112047.rs:22:9: 22:42}>`...
17+
= note: ...which again requires computing layout of `{async block@$DIR/indirect-recursion-issue-112047.rs:22:9: 22:42}`, completing the cycle
18+
note: cycle used when elaborating drops for `<impl at $DIR/indirect-recursion-issue-112047.rs:18:1: 18:18>::recur`
19+
--> $DIR/indirect-recursion-issue-112047.rs:21:5
1220
|
1321
LL | fn recur(self) -> Self::Recur {
1422
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0 commit comments

Comments
 (0)