# `bytemuck` changelog

## 1.21

* Implement `Pod` and `Zeroable` for `core::arch::{x86, x86_64}::__m512`, `__m512d` and `__m512i` without nightly.
  Requires Rust 1.72, and is gated through the `avx512_simd` cargo feature.
* Allow the use of `must_cast_mut` and `must_cast_slice_mut` in const contexts.
  Requires Rust 1.83, and is gated through the `must_cast_extra` cargo feature.
* internal: introduced the `maybe_const_fn` macro that allows defining some function
  to be const depending upon some `cfg` predicate.

## 1.20

* New functions to allocate zeroed `Arc` and `Rc`. Requires Rust 1.82
* `TransparentWrapper` impls for `core::cmp::Reverse` and `core::num::Saturating`.
* internal: Simplified the library's `fill_zeroes` calls to `write_bytes`

## 1.19

* Adds the `#[track_caller]` attribute to functions which may panic.

## 1.18

* 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.

## 1.17.1

* Adds `#[repr(C)]` to the `union Transmute<A, B>` type that's used internally
  for most of the transmutations.

## 1.17.0

* Makes the `must_cast` versions of the by-value and by-ref casts be `const`.
  The mut ref cast is unaffected for now (mut references aren't yet stable in `const fn`).
  This increases the MSRV of using that particular feature from 1.57 to 1.64.

## 1.16.3

* Fully described in https://github.com/Lokathor/bytemuck/pull/256, This makes
  casting slices to/from ZST elements more consistent between the crate's core
  module and other modules.

## 1.16.2

* Fixes potential UB where `BoxBytes` could attempt to free a dangling pointer
  if the `Layout` is zero sized. This type was introduced in 1.14.1, so that
  version and the others up to and including 1.16.1 are now yanked for safety.

## 1.16.1

* **NOT SEMVER SUPPORTED:** Adds the  `nightly_float` Cargo feature. This
  activates the `f16` and `f128` nightly features, and then provides `Zeroable`
  and `Pod` impls for those types.

## 1.16.0

* Adds a `const_zeroed` feature (MSRV 1.75) which puts a `zeroed` fn at the crate root.
  This is just like the `Zeroable::zeroed` method, but as a `const fn`.

## 1.15.0

This primarily relaxes the bounds on a `From` impl.

Previously:

> `impl<T: NoUninit> From<Box<T>> for BoxBytes`

Now:

> `impl<T: ?Sized + sealed::BoxBytesOf> From<Box<T>> for BoxBytes`

All related functions and methods are similarly updated.

We believe this to be backwards compatible with all previous uses,
and now `BoxBytes` can be converted to/from more types than before.

## 1.14.3

* The new std simd nightly features are apparently arch-specific.
  This adjusts the feature activation to be x86/ x86_64 only.

## 1.14.2

* Changes the name of the Nightly feature activated by the crate's
  `nightly_stdsimd` feature. This is needed as of (approximately) Nightly
  2024-02-06 and later, because the Nightly feature was changed.

## 1.14.1

* docs clarifications.

## 1.14

* `write_zeroes` and `fill_zeroes` functions: Writes (to one) or fills (a slice)
  zero bytes to all bytes covered by the provided reference. If your type has
  padding, this will even zero out the padding bytes.
* `align_offset` feature: causes pointer alignment checks to use the
  `align_offset` pointer method rather than as-casting the pointer to `usize`.
  This *may* improve codegen, if the compiler would have otherwise thought that
  the pointer address escaped. No formal benchmarks have been done either way.
* `must_cast` feature: Adds `must_*` family of functions. These functions will
  fail to compile if the cast requested can't be statically known to succeed.
  The error messages can be kinda bad when this happens, but eliminating the
  possibility of a runtime error might be worth it to you.

## 1.13.1

* Remove the requirement for the *source* data type to be `AnyBitPattern` on
  `pod_collect_to_vec`, allowing you to pod collect vecs of `char` into vecs of
  `u32`, or whatever.

## 1.13

* Now depends on `bytemuck_derive-1.4.0`
* Various small enhancements that would have been patch version updates, but
  which have been rolled into this minor version update.

## 1.12.4

* This has additional impls for existing traits and cleans up some internal code,
  but there's no new functions so I guess it counts as just a patch release.

## 1.12.3

* This bugfix makes the crate do stuff with `Arc` or not based on the
  `target_has_atomic` config. Previously, some targets that have allocation but
  not atomics were getting errors. This raises the MSRV of the
  `extern_crate_alloc` feature to 1.60, but opt-in features are *not* considered
  to be hard locked to 1.34 like the basic build of the crate is.

## 1.12.2

* Fixes `try_pod_read_unaligned` bug that made it always fail unless the target
  type was exactly pointer sized in which case UB *could* happen. The
  `CheckedBitPattern::is_valid_bit_pattern` was being asked to check that a
  *reference* to the `pod` value was a valid bit pattern, rather than the actual
  bit pattern itself, and so the check could in some cases be illegally
  bypassed.

## 1.12.1

* Patch bumped the required `bytemuck_derive` version because of a regression in
  how it handled `align(N)` attributes.

## 1.12

* This minor version bump is caused by a version bump in our `bytemuck_derive`
  dependency, which is in turn caused by a mixup in the minimum version of `syn`
  that `bytemuck_derive` uses. See [Issue
  122](https://github.com/Lokathor/bytemuck/issues/122). There's not any
  specific "new" API as you might normally expect from a minor version bump.
* [pali](https://github.com/pali6) fixed a problem with SPIR-V builds being
  broken. The error handling functions were trying to be generic over `Display`,
  which the error types normally support, except on SPIR-V targets (which run on
  the GPU and don't have text formatting).

## 1.11

* [WaffleLapkin](https://github.com/WaffleLapkin) added `wrap_box` and `peel_box`
  to the `TransparentWrapperAlloc` trait. Default impls of these functions are
  provided, and (as usual with the transparent trait stuff) you should not override
  the default versions.

## 1.10

* [TheEdward162](https://github.com/TheEdward162) added the `ZeroableInOption`
  and `PodInOption` traits. These are for types that are `Zeroable` or `Pod`
  *when in an option*, but not on their own. We provide impls for the various
  "NonZeroINTEGER" types in `core`, and if you need to newtype a NonZero value
  then you can impl these traits when you use `repr(transparent)`.

## 1.9.1

* Bumped the minimum `bytemuck_derive` dependency version from `1.0` to `1.1`.
  The fact that `bytemuck` and `bytemuck_derive` are separate crates at all is
  an unfortunate technical limit of current Rust, woe and calamity.

## 1.9.0

* [fu5ha](https://github.com/fu5ha) added the `NoUninit`, `AnyBitPattern`, and
  `CheckedBitPattern` traits. This allows for a more fine-grained level of
  detail in what casting operations are allowed for a type. Types that already
  implement `Zeroable` and `Pod` will have a blanket impl for these new traits.
  This is a "preview" of the direction that the crate will probably go in the
  eventual 2.0 version. We're still waiting on [Project Safe
  Transmute](https://github.com/rust-lang/project-safe-transmute) for an actual
  2.0 version of the crate, but until then please enjoy this preview.
* Also Fusha added better support for `union` types in the derive macros. I
  still don't know how any of the proc-macro stuff works at all, so please
  direct questions to her.

## 1.8.0

* `try_pod_read_unaligned` and `pod_read_unaligned` let you go from `&[u8]` to
  `T:Pod` without worrying about alignment.

## 1.7.3

* Experimental support for the `portable_simd` language extension under the
  `nightly_portable_simd` cargo feature. As the name implies, this is an
  experimental crate feature and it's **not** part of the semver contract. All
  it does is add the appropriate `Zeroable` and `Pod` impls.

## 1.7.2

* Why does this repo keep being hit with publishing problems? What did I do to
  deserve this curse, Ferris? This doesn't ever happen with tinyvec or fermium,
  only bytemuck.

## 1.7.1

* **Soundness Fix:** The wrap/peel methods for owned value conversion, added to
  `TransparentWrapper` in 1.6, can cause a double-drop if used with types that
  impl `Drop`. The fix was simply to add a `ManuallyDrop` layer around the value
  before doing the `transmute_copy` that is used to wrap/peel. While this fix
  could technically be backported to the 1.6 series, since 1.7 is semver
  compatible anyway the 1.6 series has simply been yanked.

## 1.7

* In response to [Unsafe Code Guidelines Issue
  #286](https://github.com/rust-lang/unsafe-code-guidelines/issues/286), this
  version of Bytemuck has a ***Soundness-Required Breaking Change***. This is
  "allowed" under Rust's backwards-compatibility guidelines, but it's still
  annoying of course so we're trying to keep the damage minimal.
  * **The Reason:** It turns out that pointer values should not have been `Pod`. More
    specifically, `ptr as usize` is *not* the same operation as calling
    `transmute::<_, usize>(ptr)`.
  * LLVM has yet to fully sort out their story, but until they do, transmuting
    pointers can cause miscompilations. They may fix things up in the future,
    but we're not gonna just wait and have broken code in the mean time.
  * **The Fix:** The breaking change is that the `Pod` impls for `*const T`,
    `*mut T`, and `Option<NonNull<T>` are now gated behind the
    `unsound_ptr_pod_impl` feature, which is off by default.
  * You are *strongly discouraged* from using this feature, but if a dependency
    of yours doesn't work when you upgrade to 1.7 because it relied on pointer
    casting, then you might wish to temporarily enable the feature just to get
    that dependency to build. Enabled features are global across all users of a
    given semver compatible version, so if you enable the feature in your own
    crate, your dependency will also end up getting the feature too, and then
    it'll be able to compile.
  * Please move away from using this feature as soon as you can. Consider it to
    *already* be deprecated.
  * [PR 65](https://github.com/Lokathor/bytemuck/pull/65)

## 1.6.3

* Small goof with an errant `;`, so [PR 69](https://github.com/Lokathor/bytemuck/pull/69)
  *actually* got things working on SPIR-V.

## 1.6.2

cargo upload goof! ignore this one.

## 1.6.1

* [DJMcNab](https://github.com/DJMcNab) did a fix so that the crate can build for SPIR-V
  [PR 67](https://github.com/Lokathor/bytemuck/pull/67)

## 1.6

* The `TransparentWrapper` trait now has more methods. More ways to wrap, and
  now you can "peel" too! Note that we don't call it "unwrap" because that name
  is too strongly associated with the Option/Result methods.
  Thanks to [LU15W1R7H](https://github.com/LU15W1R7H) for doing
  [PR 58](https://github.com/Lokathor/bytemuck/pull/58)
* Min Const Generics! Now there's Pod and Zeroable for arrays of any size when
  you turn on the `min_const_generics` crate feature.
  [zakarumych](https://github.com/zakarumych) got the work started in
  [PR 59](https://github.com/Lokathor/bytemuck/pull/59),
  and [chorman0773](https://github.com/chorman0773) finished off the task in
  [PR 63](https://github.com/Lokathor/bytemuck/pull/63)

## 1.5.1

* Fix `bytes_of` failing on zero sized types.
  [PR 53](https://github.com/Lokathor/bytemuck/pull/53)

## 1.5

* Added `pod_collect_to_vec`, which will gather a slice into a vec,
allowing you to change the pod type while also safely ignoring alignment.
[PR 50](https://github.com/Lokathor/bytemuck/pull/50)

## 1.4.2

* [Kimundi](https://github.com/Kimundi) fixed an issue that could make `try_zeroed_box`
stack overflow for large values at low optimization levels.
[PR 43](https://github.com/Lokathor/bytemuck/pull/43)

## 1.4.1

* [thomcc](https://github.com/thomcc) fixed up the CI and patched over a soundness hole in `offset_of!`.
[PR 38](https://github.com/Lokathor/bytemuck/pull/38)

## 1.4

* [icewind1991](https://github.com/icewind1991) has contributed the proc-macros
  for deriving impls of `Pod`, `TransparentWrapper`, `Zeroable`!! Everyone has
  been waiting for this one folks! It's a big deal. Just enable the `derive`
  cargo feature and then you'll be able to derive the traits on your types. It
  generates all the appropriate tests for you.
* The `zeroable_maybe_uninit` feature now adds a `Zeroable` impl to the
  `MaybeUninit` type. This is only behind a feature flag because `MaybeUninit`
  didn't exist back in `1.34.0` (the minimum rust version of `bytemuck`).

## 1.3.1

* The entire crate is now available under the `Apache-2.0 OR MIT` license as
  well as the previous `Zlib` license
  [#24](https://github.com/Lokathor/bytemuck/pull/24).
* [HeroicKatora](https://github.com/HeroicKatora) added the
  `try_zeroed_slice_box` function
  [#10](https://github.com/Lokathor/bytemuck/pull/17). `zeroed_slice_box` is
  also available.
* The `offset_of!` macro now supports a 2-arg version. For types that impl
  Default, it'll just make an instance using `default` and then call over to the
  3-arg version.
* The `PodCastError` type now supports `Hash` and `Display`. Also if you enable
  the `extern_crate_std` feature then it will support `std::error::Error`.
* We now provide a `TransparentWrapper<T>` impl for `core::num::Wrapper<T>`.
* The error type of `try_from_bytes` and `try_from_bytes_mut` when the input
  isn't aligned has been corrected from being `AlignmentMismatch` (intended for
  allocation casting only) to `TargetAlignmentGreaterAndInputNotAligned`.

## 1.3.0

* Had a bug because the CI was messed up! It wasn't soundness related, because
  it prevented the crate from building entirely if the `extern_crate_alloc`
  feature was used. Still, this is yanked, sorry.

## 1.2.0

* [thomcc](https://github.com/thomcc) added many things:
  * A fully sound `offset_of!` macro
    [#10](https://github.com/Lokathor/bytemuck/pull/10)
  * A `Contiguous` trait for when you've got enums with declared values
    all in a row [#12](https://github.com/Lokathor/bytemuck/pull/12)
  * A `TransparentWrapper` marker trait for when you want to more clearly
    enable adding and removing a wrapper struct to its inner value
    [#15](https://github.com/Lokathor/bytemuck/pull/15)
  * Now MIRI is run on CI in every single push!
    [#16](https://github.com/Lokathor/bytemuck/pull/16)

## 1.1.0

* [SimonSapin](https://github.com/SimonSapin) added `from_bytes`,
  `from_bytes_mut`, `try_from_bytes`, and `try_from_bytes_mut` ([PR
  Link](https://github.com/Lokathor/bytemuck/pull/8))

## 1.0.1

* Changed to the [zlib](https://opensource.org/licenses/Zlib) license.
* Added much more proper documentation.
* Reduced the minimum Rust version to 1.34
