diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/codegen/mod.rs | 5 | ||||
-rw-r--r-- | src/codegen/struct_layout.rs | 14 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 5411b2a0..39babb6b 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1776,8 +1776,9 @@ impl CodeGenerator for CompInfo { let align = layout.align; let check_struct_align = - if align > ctx.target_pointer_size() { - // FIXME when [RFC 1358](https://github.com/rust-lang/rust/issues/33626) ready + if align > ctx.target_pointer_size() && + !ctx.options().rust_features().repr_align + { None } else { Some(quote! { diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs index d2be5aff..3a641f4a 100644 --- a/src/codegen/struct_layout.rs +++ b/src/codegen/struct_layout.rs @@ -286,8 +286,18 @@ impl<'a> StructLayoutTracker<'a> { } pub fn requires_explicit_align(&self, layout: Layout) -> bool { - self.max_field_align < layout.align && - layout.align <= self.ctx.target_pointer_size() + if self.max_field_align >= layout.align { + return false; + } + // At this point we require explicit alignment, but we may not be able + // to generate the right bits, let's double check. + if self.ctx.options().rust_features().repr_align { + return true; + } + + // We can only generate up-to a word of alignment unless we support + // repr(align). + layout.align <= self.ctx.target_pointer_size() } fn padding_bytes(&self, layout: Layout) -> usize { |