Round generator sizes to multiple of their alignment

Fixes #62658.
This commit is contained in:
Tyler Mandry 2019-08-01 18:24:12 -07:00
parent c43753f910
commit 14be088677
2 changed files with 31 additions and 0 deletions

View File

@ -1540,6 +1540,8 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
Ok(variant)
}).collect::<Result<IndexVec<VariantIdx, _>, _>>()?;
size = size.align_to(align.abi);
let abi = if prefix.abi.is_uninhabited() ||
variants.iter().all(|v| v.abi.is_uninhabited()) {
Abi::Uninhabited

View File

@ -0,0 +1,29 @@
// This test created a generator whose size was not rounded to a multiple of its
// alignment. This caused an assertion error in codegen.
// build-pass
// edition:2018
#![feature(async_await)]
async fn noop() {}
async fn foo() {
// This suspend should be the largest variant.
{
let x = [0u8; 17];
noop().await;
println!("{:?}", x);
}
// Add one variant that's aligned to 8 bytes.
{
let x = 0u64;
noop().await;
println!("{:?}", x);
}
}
fn main() {
let _ = foo();
}