Skip to content

Commit

Permalink
Unrolled build for rust-lang#117686
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#117686 - compiler-errors:gen-body, r=wesleywiser

Build pre-coroutine-transform coroutine body on error

I was accidentally building the post-transform coroutine body, rather than the pre-transform coroutine body. There's no pinning expected here yet, and the return type isn't yet transformed into `CoroutineState`.

Fixes rust-lang#117670
  • Loading branch information
rust-timer committed Nov 15, 2023
2 parents dd430bc + 0ba7d19 commit a3aacb9
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 11 deletions.
12 changes: 1 addition & 11 deletions compiler/rustc_mir_build/src/build/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -656,17 +656,7 @@ fn construct_error(tcx: TyCtxt<'_>, def_id: LocalDefId, guar: ErrorGuaranteed) -
let args = args.as_coroutine();
let yield_ty = args.yield_ty();
let return_ty = args.return_ty();
let self_ty = Ty::new_adt(
tcx,
tcx.adt_def(tcx.lang_items().pin_type().unwrap()),
tcx.mk_args(&[Ty::new_mut_ref(tcx, tcx.lifetimes.re_erased, coroutine_ty).into()]),
);
let coroutine_state = Ty::new_adt(
tcx,
tcx.adt_def(tcx.lang_items().coroutine_state().unwrap()),
tcx.mk_args(&[yield_ty.into(), return_ty.into()]),
);
(vec![self_ty, args.resume_ty()], coroutine_state, Some(yield_ty))
(vec![coroutine_ty, args.resume_ty()], return_ty, Some(yield_ty))
}
dk => bug!("{:?} is not a body: {:?}", def_id, dk),
};
Expand Down
8 changes: 8 additions & 0 deletions tests/ui/mir/build-async-error-body-correctly.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// edition: 2021

async fn asyncfn() {
let binding = match true {};
//~^ ERROR non-exhaustive patterns: type `bool` is non-empty
}

fn main() {}
17 changes: 17 additions & 0 deletions tests/ui/mir/build-async-error-body-correctly.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
error[E0004]: non-exhaustive patterns: type `bool` is non-empty
--> $DIR/build-async-error-body-correctly.rs:4:25
|
LL | let binding = match true {};
| ^^^^
|
= note: the matched value is of type `bool`
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern as shown
|
LL ~ let binding = match true {
LL + _ => todo!(),
LL ~ };
|

error: aborting due to previous error

For more information about this error, try `rustc --explain E0004`.

0 comments on commit a3aacb9

Please sign in to comment.