diff --git a/derive/src/traits.rs b/derive/src/traits.rs index 455d1ef7..815e77c8 100644 --- a/derive/src/traits.rs +++ b/derive/src/traits.rs @@ -592,6 +592,11 @@ fn get_repr(attributes: &[Attribute]) -> Result { | (None, b) => b, | _ => bail!("conflicting representation hints"), }, + align: match (a.align, b.align) { + | (a, None) => a, + | (None, b) => b, + | _ => bail!("conflicting representation hints"), + }, }) }) } @@ -643,12 +648,13 @@ macro_rules! mk_repr {( #[derive(Clone, Copy)] struct Representation { packed: Option, + align: Option, repr: Repr, } impl Default for Representation { fn default() -> Self { - Self { packed: None, repr: Repr::Rust } + Self { packed: None, align: None, repr: Repr::Rust } } } @@ -672,6 +678,12 @@ macro_rules! mk_repr {( let _: Option = input.parse()?; continue; }, + "align" => { + let contents; parenthesized!(contents in input); + ret.align = Some(LitInt::base10_parse::(&contents.parse()?)?); + let _: Option = input.parse()?; + continue; + }, $( stringify!($xn) => Repr::$Xn, )* diff --git a/derive/tests/basic.rs b/derive/tests/basic.rs index 3e164bbf..5e055555 100644 --- a/derive/tests/basic.rs +++ b/derive/tests/basic.rs @@ -185,3 +185,7 @@ fn anybitpattern_implies_zeroable() { let test = AnyBitPatternTest::zeroed(); assert_eq!(test, AnyBitPatternTest { a: 0, b: 0 }); } + +#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C, align(16))] +struct Issue127 {}