Skip to content

Commit 4b5ad2e

Browse files
committed
Support skipping variants with ZeroizeOnDrop
1 parent ad5422d commit 4b5ad2e

File tree

3 files changed

+56
-24
lines changed

3 files changed

+56
-24
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111
- Use the `Copy` implementation for `Clone` and the `Ord` implementation for
1212
`PartialOrd` when custom bounds are present.
1313

14+
### Fixed
15+
- Support skipping only some variants with `ZeroizeOnDrop`.
16+
1417
## [1.2.7] - 2023-12-14
1518

1619
### Fixed

src/test/zeroize.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,3 +230,36 @@ fn fqs() -> Result<()> {
230230
},
231231
)
232232
}
233+
234+
#[test]
235+
fn enum_skip() -> Result<()> {
236+
test_derive(
237+
quote! {
238+
#[derive_where(ZeroizeOnDrop)]
239+
enum Test<T> {
240+
A(std::marker::PhantomData<T>),
241+
#[derive_where(skip_inner)]
242+
B(std::marker::PhantomData<T>),
243+
}
244+
},
245+
quote! {
246+
#[automatically_derived]
247+
impl <T> ::core::ops::Drop for Test<T> {
248+
fn drop(&mut self) {
249+
use ::zeroize::__internal::AssertZeroize;
250+
use ::zeroize::__internal::AssertZeroizeOnDrop;
251+
252+
match self {
253+
Test::A(ref mut __field_0) => {
254+
__field_0.zeroize_or_on_drop();
255+
}
256+
Test::B(ref mut __field_0) => { }
257+
}
258+
}
259+
}
260+
261+
#[automatically_derived]
262+
impl<T> ::zeroize::ZeroizeOnDrop for Test<T> { }
263+
},
264+
)
265+
}

src/trait_/zeroize_on_drop.rs

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -140,37 +140,33 @@ impl TraitImpl for ZeroizeOnDrop {
140140
trait_: &DeriveTrait,
141141
data: &Data,
142142
) -> TokenStream {
143-
if data.is_empty(**trait_) {
144-
TokenStream::new()
145-
} else {
146-
match data.simple_type() {
147-
SimpleType::Struct(fields) | SimpleType::Tuple(fields) => {
148-
#[cfg(feature = "zeroize-on-drop")]
149-
{
150-
let self_pattern = fields.self_pattern_mut();
151-
let self_ident = data.iter_self_ident(**trait_);
152-
153-
quote! {
154-
#self_pattern => {
155-
#(#self_ident.zeroize_or_on_drop();)*
156-
}
143+
match data.simple_type() {
144+
SimpleType::Struct(fields) | SimpleType::Tuple(fields) => {
145+
#[cfg(feature = "zeroize-on-drop")]
146+
{
147+
let self_pattern = fields.self_pattern_mut();
148+
let self_ident = data.iter_self_ident(**trait_);
149+
150+
quote! {
151+
#self_pattern => {
152+
#(#self_ident.zeroize_or_on_drop();)*
157153
}
158154
}
159-
#[cfg(not(feature = "zeroize-on-drop"))]
160-
{
161-
// Use unused variables.
162-
let _ = fields;
155+
}
156+
#[cfg(not(feature = "zeroize-on-drop"))]
157+
{
158+
// Use unused variables.
159+
let _ = fields;
163160

164-
let path = util::path_from_root_and_strs(trait_.crate_(), &["Zeroize"]);
161+
let path = util::path_from_root_and_strs(trait_.crate_(), &["Zeroize"]);
165162

166-
quote! {
167-
#path::zeroize(self);
168-
}
163+
quote! {
164+
#path::zeroize(self);
169165
}
170166
}
171-
SimpleType::Unit(_) => TokenStream::new(),
172-
SimpleType::Union => unreachable!("unexpected trait for union"),
173167
}
168+
SimpleType::Unit(_) => TokenStream::new(),
169+
SimpleType::Union => unreachable!("unexpected trait for union"),
174170
}
175171
}
176172
}

0 commit comments

Comments
 (0)