Skip to content

Commit

Permalink
Round generator sizes to multiple of their alignment
Browse files Browse the repository at this point in the history
  • Loading branch information
tmandry committed Aug 2, 2019
1 parent c43753f commit 14be088
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/librustc/ty/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
29 changes: 29 additions & 0 deletions src/test/ui/async-await/issue-62658.rs
Original file line number Diff line number Diff line change
@@ -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();
}

0 comments on commit 14be088

Please sign in to comment.