1# `bytemuck` changelog
2
3## 1.19
4
5* Adds the `#[track_caller]` attribute to functions which may panic.
6
7## 1.18
8
9* Adds the `latest_stable_rust` cargo feature, which is a blanket feature that turns all other features on that are both sound and compatible with Stable rust.
10
11## 1.17.1
12
13* Adds `#[repr(C)]` to the `union Transmute<A, B>` type that's used internally
14  for most of the transmutations.
15
16## 1.17.0
17
18* Makes the `must_cast` versions of the by-value and by-ref casts be `const`.
19  The mut ref cast is unaffected for now (mut references aren't yet stable in `const fn`).
20  This increases the MSRV of using that particular feature from 1.57 to 1.64.
21
22## 1.16.3
23
24* Fully described in https://github.com/Lokathor/bytemuck/pull/256, This makes
25  casting slices to/from ZST elements more consistent between the crate's core
26  module and other modules.
27
28## 1.16.2
29
30* Fixes potential UB where `BoxBytes` could attempt to free a dangling pointer
31  if the `Layout` is zero sized. This type was introduced in 1.14.1, so that
32  version and the others up to and including 1.16.1 are now yanked for safety.
33
34## 1.16.1
35
36* **NOT SEMVER SUPPORTED:** Adds the  `nightly_float` Cargo feature. This
37  activates the `f16` and `f128` nightly features, and then provides `Zeroable`
38  and `Pod` impls for those types.
39
40## 1.16.0
41
42* Adds a `const_zeroed` feature (MSRV 1.75) which puts a `zeroed` fn at the crate root.
43  This is just like the `Zeroable::zeroed` method, but as a `const fn`.
44
45## 1.15.0
46
47This primarily relaxes the bounds on a `From` impl.
48
49Previously:
50
51> `impl<T: NoUninit> From<Box<T>> for BoxBytes`
52
53Now:
54
55> `impl<T: ?Sized + sealed::BoxBytesOf> From<Box<T>> for BoxBytes`
56
57All related functions and methods are similarly updated.
58
59We believe this to be backwards compatible with all previous uses,
60and now `BoxBytes` can be converted to/from more types than before.
61
62## 1.14.3
63
64* The new std simd nightly features are apparently arch-specific.
65  This adjusts the feature activation to be x86/ x86_64 only.
66
67## 1.14.2
68
69* Changes the name of the Nightly feature activated by the crate's
70  `nightly_stdsimd` feature. This is needed as of (approximately) Nightly
71  2024-02-06 and later, because the Nightly feature was changed.
72
73## 1.14.1
74
75* docs clarifications.
76
77## 1.14
78
79* `write_zeroes` and `fill_zeroes` functions: Writes (to one) or fills (a slice)
80  zero bytes to all bytes covered by the provided reference. If your type has
81  padding, this will even zero out the padding bytes.
82* `align_offset` feature: causes pointer alignment checks to use the
83  `align_offset` pointer method rather than as-casting the pointer to `usize`.
84  This *may* improve codegen, if the compiler would have otherwise thought that
85  the pointer address escaped. No formal benchmarks have been done either way.
86* `must_cast` feature: Adds `must_*` family of functions. These functions will
87  fail to compile if the cast requested can't be statically known to succeed.
88  The error messages can be kinda bad when this happens, but eliminating the
89  possibility of a runtime error might be worth it to you.
90
91## 1.13.1
92
93* Remove the requirement for the *source* data type to be `AnyBitPattern` on
94  `pod_collect_to_vec`, allowing you to pod collect vecs of `char` into vecs of
95  `u32`, or whatever.
96
97## 1.13
98
99* Now depends on `bytemuck_derive-1.4.0`
100* Various small enhancements that would have been patch version updates, but
101  which have been rolled into this minor version update.
102
103## 1.12.4
104
105* This has additional impls for existing traits and cleans up some internal code,
106  but there's no new functions so I guess it counts as just a patch release.
107
108## 1.12.3
109
110* This bugfix makes the crate do stuff with `Arc` or not based on the
111  `target_has_atomic` config. Previously, some targets that have allocation but
112  not atomics were getting errors. This raises the MSRV of the
113  `extern_crate_alloc` feature to 1.60, but opt-in features are *not* considered
114  to be hard locked to 1.34 like the basic build of the crate is.
115
116## 1.12.2
117
118* Fixes `try_pod_read_unaligned` bug that made it always fail unless the target
119  type was exactly pointer sized in which case UB *could* happen. The
120  `CheckedBitPattern::is_valid_bit_pattern` was being asked to check that a
121  *reference* to the `pod` value was a valid bit pattern, rather than the actual
122  bit pattern itself, and so the check could in some cases be illegally
123  bypassed.
124
125## 1.12.1
126
127* Patch bumped the required `bytemuck_derive` version because of a regression in
128  how it handled `align(N)` attributes.
129
130## 1.12
131
132* This minor version bump is caused by a version bump in our `bytemuck_derive`
133  dependency, which is in turn caused by a mixup in the minimum version of `syn`
134  that `bytemuck_derive` uses. See [Issue
135  122](https://github.com/Lokathor/bytemuck/issues/122). There's not any
136  specific "new" API as you might normally expect from a minor version bump.
137* [pali](https://github.com/pali6) fixed a problem with SPIR-V builds being
138  broken. The error handling functions were trying to be generic over `Display`,
139  which the error types normally support, except on SPIR-V targets (which run on
140  the GPU and don't have text formatting).
141
142## 1.11
143
144* [WaffleLapkin](https://github.com/WaffleLapkin) added `wrap_box` and `peel_box`
145  to the `TransparentWrapperAlloc` trait. Default impls of these functions are
146  provided, and (as usual with the transparent trait stuff) you should not override
147  the default versions.
148
149## 1.10
150
151* [TheEdward162](https://github.com/TheEdward162) added the `ZeroableInOption`
152  and `PodInOption` traits. These are for types that are `Zeroable` or `Pod`
153  *when in an option*, but not on their own. We provide impls for the various
154  "NonZeroINTEGER" types in `core`, and if you need to newtype a NonZero value
155  then you can impl these traits when you use `repr(transparent)`.
156
157## 1.9.1
158
159* Bumped the minimum `bytemuck_derive` dependency version from `1.0` to `1.1`.
160  The fact that `bytemuck` and `bytemuck_derive` are separate crates at all is
161  an unfortunate technical limit of current Rust, woe and calamity.
162
163## 1.9.0
164
165* [fu5ha](https://github.com/fu5ha) added the `NoUninit`, `AnyBitPattern`, and
166  `CheckedBitPattern` traits. This allows for a more fine-grained level of
167  detail in what casting operations are allowed for a type. Types that already
168  implement `Zeroable` and `Pod` will have a blanket impl for these new traits.
169  This is a "preview" of the direction that the crate will probably go in the
170  eventual 2.0 version. We're still waiting on [Project Safe
171  Transmute](https://github.com/rust-lang/project-safe-transmute) for an actual
172  2.0 version of the crate, but until then please enjoy this preview.
173* Also Fusha added better support for `union` types in the derive macros. I
174  still don't know how any of the proc-macro stuff works at all, so please
175  direct questions to her.
176
177## 1.8.0
178
179* `try_pod_read_unaligned` and `pod_read_unaligned` let you go from `&[u8]` to
180  `T:Pod` without worrying about alignment.
181
182## 1.7.3
183
184* Experimental support for the `portable_simd` language extension under the
185  `nightly_portable_simd` cargo feature. As the name implies, this is an
186  experimental crate feature and it's **not** part of the semver contract. All
187  it does is add the appropriate `Zeroable` and `Pod` impls.
188
189## 1.7.2
190
191* Why does this repo keep being hit with publishing problems? What did I do to
192  deserve this curse, Ferris? This doesn't ever happen with tinyvec or fermium,
193  only bytemuck.
194
195## 1.7.1
196
197* **Soundness Fix:** The wrap/peel methods for owned value conversion, added to
198  `TransparentWrapper` in 1.6, can cause a double-drop if used with types that
199  impl `Drop`. The fix was simply to add a `ManuallyDrop` layer around the value
200  before doing the `transmute_copy` that is used to wrap/peel. While this fix
201  could technically be backported to the 1.6 series, since 1.7 is semver
202  compatible anyway the 1.6 series has simply been yanked.
203
204## 1.7
205
206* In response to [Unsafe Code Guidelines Issue
207  #286](https://github.com/rust-lang/unsafe-code-guidelines/issues/286), this
208  version of Bytemuck has a ***Soundness-Required Breaking Change***. This is
209  "allowed" under Rust's backwards-compatibility guidelines, but it's still
210  annoying of course so we're trying to keep the damage minimal.
211  * **The Reason:** It turns out that pointer values should not have been `Pod`. More
212    specifically, `ptr as usize` is *not* the same operation as calling
213    `transmute::<_, usize>(ptr)`.
214  * LLVM has yet to fully sort out their story, but until they do, transmuting
215    pointers can cause miscompilations. They may fix things up in the future,
216    but we're not gonna just wait and have broken code in the mean time.
217  * **The Fix:** The breaking change is that the `Pod` impls for `*const T`,
218    `*mut T`, and `Option<NonNull<T>` are now gated behind the
219    `unsound_ptr_pod_impl` feature, which is off by default.
220  * You are *strongly discouraged* from using this feature, but if a dependency
221    of yours doesn't work when you upgrade to 1.7 because it relied on pointer
222    casting, then you might wish to temporarily enable the feature just to get
223    that dependency to build. Enabled features are global across all users of a
224    given semver compatible version, so if you enable the feature in your own
225    crate, your dependency will also end up getting the feature too, and then
226    it'll be able to compile.
227  * Please move away from using this feature as soon as you can. Consider it to
228    *already* be deprecated.
229  * [PR 65](https://github.com/Lokathor/bytemuck/pull/65)
230
231## 1.6.3
232
233* Small goof with an errant `;`, so [PR 69](https://github.com/Lokathor/bytemuck/pull/69)
234  *actually* got things working on SPIR-V.
235
236## 1.6.2
237
238cargo upload goof! ignore this one.
239
240## 1.6.1
241
242* [DJMcNab](https://github.com/DJMcNab) did a fix so that the crate can build for SPIR-V
243  [PR 67](https://github.com/Lokathor/bytemuck/pull/67)
244
245## 1.6
246
247* The `TransparentWrapper` trait now has more methods. More ways to wrap, and
248  now you can "peel" too! Note that we don't call it "unwrap" because that name
249  is too strongly associated with the Option/Result methods.
250  Thanks to [LU15W1R7H](https://github.com/LU15W1R7H) for doing
251  [PR 58](https://github.com/Lokathor/bytemuck/pull/58)
252* Min Const Generics! Now there's Pod and Zeroable for arrays of any size when
253  you turn on the `min_const_generics` crate feature.
254  [zakarumych](https://github.com/zakarumych) got the work started in
255  [PR 59](https://github.com/Lokathor/bytemuck/pull/59),
256  and [chorman0773](https://github.com/chorman0773) finished off the task in
257  [PR 63](https://github.com/Lokathor/bytemuck/pull/63)
258
259## 1.5.1
260
261* Fix `bytes_of` failing on zero sized types.
262  [PR 53](https://github.com/Lokathor/bytemuck/pull/53)
263
264## 1.5
265
266* Added `pod_collect_to_vec`, which will gather a slice into a vec,
267allowing you to change the pod type while also safely ignoring alignment.
268[PR 50](https://github.com/Lokathor/bytemuck/pull/50)
269
270## 1.4.2
271
272* [Kimundi](https://github.com/Kimundi) fixed an issue that could make `try_zeroed_box`
273stack overflow for large values at low optimization levels.
274[PR 43](https://github.com/Lokathor/bytemuck/pull/43)
275
276## 1.4.1
277
278* [thomcc](https://github.com/thomcc) fixed up the CI and patched over a soundness hole in `offset_of!`.
279[PR 38](https://github.com/Lokathor/bytemuck/pull/38)
280
281## 1.4
282
283* [icewind1991](https://github.com/icewind1991) has contributed the proc-macros
284  for deriving impls of `Pod`, `TransparentWrapper`, `Zeroable`!! Everyone has
285  been waiting for this one folks! It's a big deal. Just enable the `derive`
286  cargo feature and then you'll be able to derive the traits on your types. It
287  generates all the appropriate tests for you.
288* The `zeroable_maybe_uninit` feature now adds a `Zeroable` impl to the
289  `MaybeUninit` type. This is only behind a feature flag because `MaybeUninit`
290  didn't exist back in `1.34.0` (the minimum rust version of `bytemuck`).
291
292## 1.3.1
293
294* The entire crate is now available under the `Apache-2.0 OR MIT` license as
295  well as the previous `Zlib` license
296  [#24](https://github.com/Lokathor/bytemuck/pull/24).
297* [HeroicKatora](https://github.com/HeroicKatora) added the
298  `try_zeroed_slice_box` function
299  [#10](https://github.com/Lokathor/bytemuck/pull/17). `zeroed_slice_box` is
300  also available.
301* The `offset_of!` macro now supports a 2-arg version. For types that impl
302  Default, it'll just make an instance using `default` and then call over to the
303  3-arg version.
304* The `PodCastError` type now supports `Hash` and `Display`. Also if you enable
305  the `extern_crate_std` feature then it will support `std::error::Error`.
306* We now provide a `TransparentWrapper<T>` impl for `core::num::Wrapper<T>`.
307* The error type of `try_from_bytes` and `try_from_bytes_mut` when the input
308  isn't aligned has been corrected from being `AlignmentMismatch` (intended for
309  allocation casting only) to `TargetAlignmentGreaterAndInputNotAligned`.
310
311## 1.3.0
312
313* Had a bug because the CI was messed up! It wasn't soundness related, because
314  it prevented the crate from building entirely if the `extern_crate_alloc`
315  feature was used. Still, this is yanked, sorry.
316
317## 1.2.0
318
319* [thomcc](https://github.com/thomcc) added many things:
320  * A fully sound `offset_of!` macro
321    [#10](https://github.com/Lokathor/bytemuck/pull/10)
322  * A `Contiguous` trait for when you've got enums with declared values
323    all in a row [#12](https://github.com/Lokathor/bytemuck/pull/12)
324  * A `TransparentWrapper` marker trait for when you want to more clearly
325    enable adding and removing a wrapper struct to its inner value
326    [#15](https://github.com/Lokathor/bytemuck/pull/15)
327  * Now MIRI is run on CI in every single push!
328    [#16](https://github.com/Lokathor/bytemuck/pull/16)
329
330## 1.1.0
331
332* [SimonSapin](https://github.com/SimonSapin) added `from_bytes`,
333  `from_bytes_mut`, `try_from_bytes`, and `try_from_bytes_mut` ([PR
334  Link](https://github.com/Lokathor/bytemuck/pull/8))
335
336## 1.0.1
337
338* Changed to the [zlib](https://opensource.org/licenses/Zlib) license.
339* Added much more proper documentation.
340* Reduced the minimum Rust version to 1.34
341