From f861420a170f13900a5133b72da339d709f648e1 Mon Sep 17 00:00:00 2001 From: Tanner Rogalsky Date: Sun, 17 May 2020 12:14:30 -0400 Subject: [PATCH 1/3] Add tests validating Serialize derivation for packed structs. --- test_suite/tests/test_macros.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test_suite/tests/test_macros.rs b/test_suite/tests/test_macros.rs index c0c807ec7..bcd16b483 100644 --- a/test_suite/tests/test_macros.rs +++ b/test_suite/tests/test_macros.rs @@ -1878,3 +1878,19 @@ fn test_internally_tagged_newtype_variant_containing_unit_struct() { ], ); } + +#[deny(safe_packed_borrows)] +#[test] +fn test_packed_struct_can_derive_serialize() { + #[derive(Copy, Clone, Serialize)] + #[repr(packed, C)] + struct PackedC { + t: f32, + } + + #[derive(Copy, Clone, Serialize)] + #[repr(C, packed)] + struct CPacked { + t: f32, + } +} From 5806e6bb24eb389a628f2fd1c04423e46718ec26 Mon Sep 17 00:00:00 2001 From: Tanner Rogalsky Date: Sun, 17 May 2020 12:14:42 -0400 Subject: [PATCH 2/3] Improved packed repr matching. --- serde_derive/src/internals/attr.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/serde_derive/src/internals/attr.rs b/serde_derive/src/internals/attr.rs index 44f757021..691a156d2 100644 --- a/serde_derive/src/internals/attr.rs +++ b/serde_derive/src/internals/attr.rs @@ -597,8 +597,19 @@ impl Container { for attr in &item.attrs { if attr.path.is_ident("repr") { let _ = attr.parse_args_with(|input: ParseStream| { - is_packed |= input.parse::()? == "packed"; - Ok(()) + input.step(|cursor| { + let mut rest = *cursor; + while let Some((tt, next)) = rest.token_tree() { + match &tt { + TokenTree::Ident(ident) if ident == "packed" => { + is_packed |= true; + return Ok(((), next)); + } + _ => rest = next, + } + } + Err(cursor.error("no `packed` was found in the reprs")) + }) }); } } From b7051208e0a344ef3b3d7ec675b9240666a9aa18 Mon Sep 17 00:00:00 2001 From: Tanner Rogalsky Date: Tue, 19 May 2020 16:01:41 -0400 Subject: [PATCH 3/3] add alignment specific packed repr tests --- test_suite/tests/test_macros.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test_suite/tests/test_macros.rs b/test_suite/tests/test_macros.rs index bcd16b483..c6c0c1785 100644 --- a/test_suite/tests/test_macros.rs +++ b/test_suite/tests/test_macros.rs @@ -1893,4 +1893,16 @@ fn test_packed_struct_can_derive_serialize() { struct CPacked { t: f32, } + + #[derive(Copy, Clone, Serialize)] + #[repr(C, packed(2))] + struct CPacked2 { + t: f32, + } + + #[derive(Copy, Clone, Serialize)] + #[repr(packed(2), C)] + struct Packed2C { + t: f32, + } }