Skip to content

Commit 374df78

Browse files
authored
Make the Pod/NoUninit derive macros use assert! to check size equality, instead of transmute. (#320)
1 parent 6633a51 commit 374df78

1 file changed

Lines changed: 13 additions & 8 deletions

File tree

derive/src/traits.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ impl Derivable for Pod {
8080
match &input.data {
8181
Data::Struct(_) => {
8282
let assert_no_padding = if !completly_packed {
83-
Some(generate_assert_no_padding(input, None)?)
83+
Some(generate_assert_no_padding(input, None, "Pod")?)
8484
} else {
8585
None
8686
};
@@ -263,7 +263,8 @@ impl Derivable for NoUninit {
263263

264264
match &input.data {
265265
Data::Struct(DataStruct { .. }) => {
266-
let assert_no_padding = generate_assert_no_padding(&input, None)?;
266+
let assert_no_padding =
267+
generate_assert_no_padding(&input, None, "NoUninit")?;
267268
let assert_fields_are_no_padding = generate_fields_are_trait(
268269
&input,
269270
None,
@@ -312,7 +313,7 @@ impl Derivable for NoUninit {
312313
.iter()
313314
.map(|variant| {
314315
let assert_no_padding =
315-
generate_assert_no_padding(&input, Some(variant))?;
316+
generate_assert_no_padding(&input, Some(variant), "NoUninit")?;
316317
let assert_fields_are_no_padding = generate_fields_are_trait(
317318
&input,
318319
Some(variant),
@@ -1046,7 +1047,7 @@ fn generate_checked_bit_pattern_enum_with_fields(
10461047
/// the type is equal to the sum of the size of it's fields and discriminant
10471048
/// (for enums, this must be asserted for each variant).
10481049
fn generate_assert_no_padding(
1049-
input: &DeriveInput, enum_variant: Option<&Variant>,
1050+
input: &DeriveInput, enum_variant: Option<&Variant>, for_trait: &str,
10501051
) -> Result<TokenStream> {
10511052
let struct_type = &input.ident;
10521053
let fields = get_fields(input, enum_variant)?;
@@ -1073,10 +1074,14 @@ fn generate_assert_no_padding(
10731074
quote!(0)
10741075
};
10751076

1076-
Ok(quote! {const _: fn() = || {
1077-
#[doc(hidden)]
1078-
struct TypeWithoutPadding([u8; #size_sum]);
1079-
let _ = ::core::mem::transmute::<#struct_type, TypeWithoutPadding>;
1077+
let message =
1078+
format!("derive({for_trait}) was applied to a type with padding");
1079+
1080+
Ok(quote! {const _: () = {
1081+
assert!(
1082+
::core::mem::size_of::<#struct_type>() == (#size_sum),
1083+
#message,
1084+
);
10801085
};})
10811086
}
10821087

0 commit comments

Comments
 (0)