Skip to content

Commit 1933e5a

Browse files
authored
Stop Using Internal APIs (#116)
1 parent 5470b4f commit 1933e5a

File tree

8 files changed

+218
-81
lines changed

8 files changed

+218
-81
lines changed

.config/topic.dic

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
18
1+
19
22
≥1
3+
APIs
34
Changelog
45
CHANGELOG
56
derive_bounded

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
- `no_drop` item-level option to `ZeroizeOnDrop` which does not implement
1212
`Drop` but instead only asserts that every field implements `ZeroizeOnDrop`.
1313

14+
### Fixed
15+
- Stop depending on unstable APIs for `Eq` for `ZeroizeOnDrop`.
16+
1417
## [1.4.0] - 2025-05-01
1518

1619
### Added

src/test/basic.rs

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,23 @@ fn struct_() -> Result<()> {
4545
}
4646
}
4747

48-
#[automatically_derived]
49-
impl<T> ::core::cmp::Eq for Test<T> {
50-
#[inline]
51-
fn assert_receiver_is_total_eq(&self) {
52-
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
48+
const _: () = {
49+
trait DeriveWhereAssertEq {
50+
fn assert(&self);
51+
}
5352

54-
// For some reason the comparison fails without the extra space at the end.
55-
let _: __AssertEq<std::marker::PhantomData<T> >;
53+
impl<T> DeriveWhereAssertEq for Test<T> {
54+
fn assert(&self) {
55+
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
56+
57+
// For some reason the comparison fails without the extra space at the end.
58+
let _: __AssertEq<std::marker::PhantomData<T> >;
59+
}
5660
}
57-
}
61+
};
62+
63+
#[automatically_derived]
64+
impl<T> ::core::cmp::Eq for Test<T> { }
5865

5966
#[automatically_derived]
6067
impl<T> ::core::hash::Hash for Test<T> {
@@ -141,16 +148,23 @@ fn tuple() -> Result<()> {
141148
}
142149
}
143150

144-
#[automatically_derived]
145-
impl<T> ::core::cmp::Eq for Test<T> {
146-
#[inline]
147-
fn assert_receiver_is_total_eq(&self) {
148-
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
151+
const _: () = {
152+
trait DeriveWhereAssertEq {
153+
fn assert(&self);
154+
}
155+
156+
impl<T> DeriveWhereAssertEq for Test<T> {
157+
fn assert(&self) {
158+
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
149159

150-
// For some reason the comparison fails without the extra space at the end.
151-
let _: __AssertEq<std::marker::PhantomData<T> >;
160+
// For some reason the comparison fails without the extra space at the end.
161+
let _: __AssertEq<std::marker::PhantomData<T> >;
162+
}
152163
}
153-
}
164+
};
165+
166+
#[automatically_derived]
167+
impl<T> ::core::cmp::Eq for Test<T> { }
154168

155169
#[automatically_derived]
156170
impl<T> ::core::hash::Hash for Test<T> {
@@ -287,17 +301,24 @@ fn enum_() -> Result<()> {
287301
}
288302
}
289303

290-
#[automatically_derived]
291-
impl<T> ::core::cmp::Eq for Test<T> {
292-
#[inline]
293-
fn assert_receiver_is_total_eq(&self) {
294-
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
304+
const _: () = {
305+
trait DeriveWhereAssertEq {
306+
fn assert(&self);
307+
}
308+
309+
impl<T> DeriveWhereAssertEq for Test<T> {
310+
fn assert(&self) {
311+
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
295312

296-
// For some reason the comparison fails without the extra space at the end.
297-
let _: __AssertEq<std::marker::PhantomData<T> >;
298-
let _: __AssertEq<std::marker::PhantomData<T> >;
313+
// For some reason the comparison fails without the extra space at the end.
314+
let _: __AssertEq<std::marker::PhantomData<T> >;
315+
let _: __AssertEq<std::marker::PhantomData<T> >;
316+
}
299317
}
300-
}
318+
};
319+
320+
#[automatically_derived]
321+
impl<T> ::core::cmp::Eq for Test<T> { }
301322

302323
#[automatically_derived]
303324
impl<T> ::core::hash::Hash for Test<T> {

src/test/bound.rs

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -235,19 +235,28 @@ fn check_trait_bounds() -> Result<()> {
235235
}
236236
}
237237

238+
const _: () = {
239+
trait DeriveWhereAssertEq {
240+
fn assert(&self);
241+
}
242+
243+
impl<T, U> DeriveWhereAssertEq for Test<T, U>
244+
where T: ::core::cmp::Eq
245+
{
246+
fn assert(&self) {
247+
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
248+
249+
// For some reason the comparison fails without the extra space at the end.
250+
let _: __AssertEq<T >;
251+
let _: __AssertEq<std::marker::PhantomData<U> >;
252+
}
253+
}
254+
};
255+
238256
#[automatically_derived]
239257
impl<T, U> ::core::cmp::Eq for Test<T, U>
240258
where T: ::core::cmp::Eq
241-
{
242-
#[inline]
243-
fn assert_receiver_is_total_eq(&self) {
244-
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
245-
246-
// For some reason the comparison fails without the extra space at the end.
247-
let _: __AssertEq<T >;
248-
let _: __AssertEq<std::marker::PhantomData<U> >;
249-
}
250-
}
259+
{ }
251260

252261
#[automatically_derived]
253262
impl<T, U> ::core::hash::Hash for Test<T, U>
@@ -377,21 +386,32 @@ fn check_multiple_trait_bounds() -> Result<()> {
377386
}
378387
}
379388

389+
const _: () = {
390+
trait DeriveWhereAssertEq {
391+
fn assert(&self);
392+
}
393+
394+
impl<T, U, V> DeriveWhereAssertEq for Test<T, U, V>
395+
where
396+
T: ::core::cmp::Eq,
397+
U: ::core::cmp::Eq
398+
{
399+
fn assert(&self) {
400+
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
401+
402+
// For some reason the comparison fails without the extra space at the end.
403+
let _: __AssertEq<T >;
404+
let _: __AssertEq<std::marker::PhantomData<(U, V)> >;
405+
}
406+
}
407+
};
408+
380409
#[automatically_derived]
381410
impl<T, U, V> ::core::cmp::Eq for Test<T, U, V>
382411
where
383412
T: ::core::cmp::Eq,
384413
U: ::core::cmp::Eq
385-
{
386-
#[inline]
387-
fn assert_receiver_is_total_eq(&self) {
388-
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
389-
390-
// For some reason the comparison fails without the extra space at the end.
391-
let _: __AssertEq<T >;
392-
let _: __AssertEq<std::marker::PhantomData<(U, V)> >;
393-
}
394-
}
414+
{ }
395415

396416
#[automatically_derived]
397417
impl<T, U, V> ::core::hash::Hash for Test<T, U, V>

src/test/zeroize.rs

Lines changed: 74 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,28 @@ fn drop() -> Result<()> {
5252
where T: ::zeroize::ZeroizeOnDrop
5353
{
5454
fn drop(&mut self) {
55-
use ::zeroize::__internal::AssertZeroize;
56-
use ::zeroize::__internal::AssertZeroizeOnDrop;
55+
trait AssertZeroizeOnDrop {
56+
fn __derive_where_zeroize_or_on_drop(self);
57+
}
58+
59+
impl<T: ::zeroize::ZeroizeOnDrop + ?::core::marker::Sized> AssertZeroizeOnDrop for &&mut T {
60+
fn __derive_where_zeroize_or_on_drop(self) {}
61+
}
62+
63+
trait AssertZeroize {
64+
fn __derive_where_zeroize_or_on_drop(&mut self);
65+
}
66+
67+
impl<T: ::zeroize::Zeroize + ?::core::marker::Sized> AssertZeroize for T {
68+
fn __derive_where_zeroize_or_on_drop(&mut self) {
69+
::zeroize::Zeroize::zeroize(self);
70+
}
71+
}
5772

5873
match self {
5974
Test(ref mut __field_0, ref mut __field_1) => {
60-
__field_0.zeroize_or_on_drop();
61-
__field_1.zeroize_or_on_drop();
75+
__field_0.__derive_where_zeroize_or_on_drop();
76+
__field_1.__derive_where_zeroize_or_on_drop();
6277
}
6378
}
6479
}
@@ -92,13 +107,28 @@ fn both() -> Result<()> {
92107
where T: ::zeroize::ZeroizeOnDrop
93108
{
94109
fn drop(&mut self) {
95-
use ::zeroize::__internal::AssertZeroize;
96-
use ::zeroize::__internal::AssertZeroizeOnDrop;
110+
trait AssertZeroizeOnDrop {
111+
fn __derive_where_zeroize_or_on_drop(self);
112+
}
113+
114+
impl<T: ::zeroize::ZeroizeOnDrop + ?::core::marker::Sized> AssertZeroizeOnDrop for &&mut T {
115+
fn __derive_where_zeroize_or_on_drop(self) {}
116+
}
117+
118+
trait AssertZeroize {
119+
fn __derive_where_zeroize_or_on_drop(&mut self);
120+
}
121+
122+
impl<T: ::zeroize::Zeroize + ?::core::marker::Sized> AssertZeroize for T {
123+
fn __derive_where_zeroize_or_on_drop(&mut self) {
124+
::zeroize::Zeroize::zeroize(self);
125+
}
126+
}
97127

98128
match self {
99129
Test(ref mut __field_0, ref mut __field_1) => {
100-
__field_0.zeroize_or_on_drop();
101-
__field_1.zeroize_or_on_drop();
130+
__field_0.__derive_where_zeroize_or_on_drop();
131+
__field_1.__derive_where_zeroize_or_on_drop();
102132
}
103133
}
104134
}
@@ -188,12 +218,27 @@ fn crate_drop() -> Result<()> {
188218
where T: zeroize_::ZeroizeOnDrop
189219
{
190220
fn drop(&mut self) {
191-
use zeroize_::__internal::AssertZeroize;
192-
use zeroize_::__internal::AssertZeroizeOnDrop;
221+
trait AssertZeroizeOnDrop {
222+
fn __derive_where_zeroize_or_on_drop(self);
223+
}
224+
225+
impl<T: zeroize_::ZeroizeOnDrop + ?::core::marker::Sized> AssertZeroizeOnDrop for &&mut T {
226+
fn __derive_where_zeroize_or_on_drop(self) {}
227+
}
228+
229+
trait AssertZeroize {
230+
fn __derive_where_zeroize_or_on_drop(&mut self);
231+
}
232+
233+
impl<T: zeroize_::Zeroize + ?::core::marker::Sized> AssertZeroize for T {
234+
fn __derive_where_zeroize_or_on_drop(&mut self) {
235+
zeroize_::Zeroize::zeroize(self);
236+
}
237+
}
193238

194239
match self {
195240
Test(ref mut __field_0) => {
196-
__field_0.zeroize_or_on_drop();
241+
__field_0.__derive_where_zeroize_or_on_drop();
197242
}
198243
}
199244
}
@@ -285,12 +330,27 @@ fn enum_skip_drop() -> Result<()> {
285330
#[automatically_derived]
286331
impl <T> ::core::ops::Drop for Test<T> {
287332
fn drop(&mut self) {
288-
use ::zeroize::__internal::AssertZeroize;
289-
use ::zeroize::__internal::AssertZeroizeOnDrop;
333+
trait AssertZeroizeOnDrop {
334+
fn __derive_where_zeroize_or_on_drop(self);
335+
}
336+
337+
impl<T: ::zeroize::ZeroizeOnDrop + ?::core::marker::Sized> AssertZeroizeOnDrop for &&mut T {
338+
fn __derive_where_zeroize_or_on_drop(self) {}
339+
}
340+
341+
trait AssertZeroize {
342+
fn __derive_where_zeroize_or_on_drop(&mut self);
343+
}
344+
345+
impl<T: ::zeroize::Zeroize + ?::core::marker::Sized> AssertZeroize for T {
346+
fn __derive_where_zeroize_or_on_drop(&mut self) {
347+
::zeroize::Zeroize::zeroize(self);
348+
}
349+
}
290350

291351
match self {
292352
Test::A(ref mut __field_0) => {
293-
__field_0.zeroize_or_on_drop();
353+
__field_0.__derive_where_zeroize_or_on_drop();
294354
}
295355
Test::B(ref mut __field_0) => { }
296356
}

src/trait_.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,8 +292,8 @@ pub trait TraitImpl: Deref<Target = Trait> {
292292
None
293293
}
294294

295-
/// Trait to implement. Only used for [`ZeroizeOnDrop`](https://docs.rs/zeroize/latest/zeroize/trait.ZeroizeOnDrop.html)
296-
/// because it implements [`Drop`] and not itself.
295+
/// Trait to implement. Only used by [`Eq`] and
296+
/// [`ZeroizeOnDrop`](https://docs.rs/zeroize/latest/zeroize/trait.ZeroizeOnDrop.html).
297297
fn impl_item(
298298
&self,
299299
imp: &ImplGenerics<'_>,

src/trait_/eq.rs

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
//! [`Eq`](trait@std::cmp::Eq) implementation.
22
3-
use std::ops::Deref;
3+
use std::{borrow::Cow, ops::Deref};
44

55
use proc_macro2::TokenStream;
66
use quote::quote;
7+
use syn::{Ident, ImplGenerics, Path, TypeGenerics, WhereClause};
78

89
use crate::{util, Data, DeriveTrait, DeriveWhere, Item, SplitGenerics, Trait, TraitImpl};
910

@@ -19,10 +20,37 @@ impl TraitImpl for Eq {
1920
DeriveTrait::Eq
2021
}
2122

22-
fn path(&self) -> syn::Path {
23+
fn path(&self) -> Path {
2324
util::path_from_strs(&["core", "cmp", "Eq"])
2425
}
2526

27+
fn additional_impl(&self) -> Option<(Path, TokenStream)> {
28+
Some((self.path(), quote! {}))
29+
}
30+
31+
fn impl_item(
32+
&self,
33+
imp: &ImplGenerics<'_>,
34+
ident: &Ident,
35+
ty: &TypeGenerics<'_>,
36+
where_clause: &Option<Cow<'_, WhereClause>>,
37+
body: TokenStream,
38+
) -> TokenStream {
39+
quote! {
40+
const _: () = {
41+
trait DeriveWhereAssertEq {
42+
fn assert(&self);
43+
}
44+
45+
impl #imp DeriveWhereAssertEq for #ident #ty
46+
#where_clause
47+
{
48+
#body
49+
}
50+
};
51+
}
52+
}
53+
2654
fn build_signature(
2755
&self,
2856
_derive_where: &DeriveWhere,
@@ -31,8 +59,7 @@ impl TraitImpl for Eq {
3159
body: &TokenStream,
3260
) -> TokenStream {
3361
quote! {
34-
#[inline]
35-
fn assert_receiver_is_total_eq(&self) {
62+
fn assert(&self) {
3663
struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
3764

3865
#body

0 commit comments

Comments
 (0)