Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 13 additions & 8 deletions derive/src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ impl Derivable for Pod {
match &input.data {
Data::Struct(_) => {
let assert_no_padding = if !completly_packed {
Some(generate_assert_no_padding(input, None)?)
Some(generate_assert_no_padding(input, None, "Pod")?)
} else {
None
};
Expand Down Expand Up @@ -263,7 +263,8 @@ impl Derivable for NoUninit {

match &input.data {
Data::Struct(DataStruct { .. }) => {
let assert_no_padding = generate_assert_no_padding(&input, None)?;
let assert_no_padding =
generate_assert_no_padding(&input, None, "NoUninit")?;
let assert_fields_are_no_padding = generate_fields_are_trait(
&input,
None,
Expand Down Expand Up @@ -312,7 +313,7 @@ impl Derivable for NoUninit {
.iter()
.map(|variant| {
let assert_no_padding =
generate_assert_no_padding(&input, Some(variant))?;
generate_assert_no_padding(&input, Some(variant), "NoUninit")?;
let assert_fields_are_no_padding = generate_fields_are_trait(
&input,
Some(variant),
Expand Down Expand Up @@ -1046,7 +1047,7 @@ fn generate_checked_bit_pattern_enum_with_fields(
/// the type is equal to the sum of the size of it's fields and discriminant
/// (for enums, this must be asserted for each variant).
fn generate_assert_no_padding(
input: &DeriveInput, enum_variant: Option<&Variant>,
input: &DeriveInput, enum_variant: Option<&Variant>, for_trait: &str,
) -> Result<TokenStream> {
let struct_type = &input.ident;
let fields = get_fields(input, enum_variant)?;
Expand All @@ -1073,10 +1074,14 @@ fn generate_assert_no_padding(
quote!(0)
};

Ok(quote! {const _: fn() = || {
#[doc(hidden)]
struct TypeWithoutPadding([u8; #size_sum]);
let _ = ::core::mem::transmute::<#struct_type, TypeWithoutPadding>;
let message =
format!("derive({for_trait}) was applied to a type with padding");

Ok(quote! {const _: () = {
assert!(
::core::mem::size_of::<#struct_type>() == (#size_sum),
#message,
);
};})
}

Expand Down
Loading