rust: zerocopy: update to v0.8.52

Update our vendored copy of `zerocopy` (and `zerocopy-derive`) to v0.8.52.

Most SPDX identifiers have been added upstream at our request [1]
(without parentheses -- supporting them is an issue on the kernel side,
but it does already reduce our differences). The CSS one for `rustdoc`
was added too [2], but will be picked up in a later version.

For `zerocopy`, enable `--cfg no_fp_fmt_parse`, which was added at our
request to avoid our local workaround [3]. This means one less difference,
thus indicate so in our `README.md`.

For `zerocopy-derive`, enable `--cfg zerocopy_unstable_linux`. This
allows us to use `#[derive(zerocopy_derive::most_traits)]`, a new feature
upstream added for us [4]. We noticed a minor doc render bug [5], which
will be fixed for a future version too.

The following script may be used to check for the remaining differences:

    for path in $(cd rust/zerocopy-derive/ && find . -type f ! -name README.md); do
        curl --silent --show-error --location \
            https://github.com/google/zerocopy/raw/v0.8.52/zerocopy/zerocopy-derive/src/$path |
            git diff --no-index - rust/zerocopy-derive/$path &&
            echo $path: OK
    done

    for path in $(cd rust/zerocopy/ && find . -type f ! -name README.md); do
        curl --silent --show-error --location \
            https://github.com/google/zerocopy/raw/v0.8.52/zerocopy/$path |
            git diff --no-index - rust/zerocopy/$path &&
            echo $path: OK
    done

Cc: Joshua Liebow-Feeser <joshlf@google.com>
Cc: Jack Wrenn <jswrenn@google.com>
Link: https://github.com/google/zerocopy/issues/3428 [1]
Link: https://github.com/google/zerocopy/issues/3457 [2]
Link: https://github.com/google/zerocopy/issues/3426 [3]
Link: https://github.com/google/zerocopy/pull/3416 [4]
Link: https://github.com/google/zerocopy/issues/3466 [5]
Acked-by: Nicolas Schier <n.schier@fritz.com>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Link: https://patch.msgid.link/20260625231919.692444-1-ojeda@kernel.org
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
Miguel Ojeda 2026-06-26 01:19:19 +02:00
parent 4688cf884b
commit 2808a39639
31 changed files with 174 additions and 76 deletions

View File

@ -84,11 +84,15 @@ core-flags := \
--edition=$(core-edition) \ --edition=$(core-edition) \
$(call cfgs-to-flags,$(core-cfgs)) $(call cfgs-to-flags,$(core-cfgs))
zerocopy-cfgs := \
no_fp_fmt_parse
zerocopy-flags := \ zerocopy-flags := \
--cap-lints=allow --cap-lints=allow \
$(call cfgs-to-flags,$(zerocopy-cfgs))
zerocopy-envs := \ zerocopy-envs := \
CARGO_PKG_VERSION=0.8.50 CARGO_PKG_VERSION=0.8.52
proc_macro2-cfgs := \ proc_macro2-cfgs := \
feature="proc-macro" \ feature="proc-macro" \
@ -128,11 +132,15 @@ syn-flags := \
--extern quote \ --extern quote \
$(call cfgs-to-flags,$(syn-cfgs)) $(call cfgs-to-flags,$(syn-cfgs))
zerocopy_derive-cfgs := \
zerocopy_unstable_linux
zerocopy_derive-flags := \ zerocopy_derive-flags := \
--cap-lints=allow \ --cap-lints=allow \
--extern proc_macro2 \ --extern proc_macro2 \
--extern quote \ --extern quote \
--extern syn --extern syn \
$(call cfgs-to-flags,$(zerocopy_derive-cfgs))
pin_init_internal-cfgs := \ pin_init_internal-cfgs := \
kernel USE_RUSTC_FEATURES kernel USE_RUSTC_FEATURES
@ -644,9 +652,11 @@ quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L
rust-analyzer: rust-analyzer:
$(Q)MAKEFLAGS= $(srctree)/scripts/generate_rust_analyzer.py \ $(Q)MAKEFLAGS= $(srctree)/scripts/generate_rust_analyzer.py \
--cfgs='core=$(core-cfgs)' $(core-edition) \ --cfgs='core=$(core-cfgs)' $(core-edition) \
--cfgs='zerocopy=$(zerocopy-cfgs)' \
--cfgs='proc_macro2=$(proc_macro2-cfgs)' \ --cfgs='proc_macro2=$(proc_macro2-cfgs)' \
--cfgs='quote=$(quote-cfgs)' \ --cfgs='quote=$(quote-cfgs)' \
--cfgs='syn=$(syn-cfgs)' \ --cfgs='syn=$(syn-cfgs)' \
--cfgs='zerocopy_derive=$(zerocopy_derive-cfgs)' \
--cfgs='pin_init_internal=$(pin_init_internal-cfgs)' \ --cfgs='pin_init_internal=$(pin_init_internal-cfgs)' \
--cfgs='pin_init=$(pin_init-cfgs)' \ --cfgs='pin_init=$(pin_init-cfgs)' \
--envs='zerocopy=$(zerocopy-envs)' \ --envs='zerocopy=$(zerocopy-envs)' \

View File

@ -1,14 +1,14 @@
# `zerocopy-derive` # `zerocopy-derive`
These source files come from the Rust `zerocopy-derive` crate, version v0.8.50 These source files come from the Rust `zerocopy-derive` crate, version v0.8.52
(released 2026-05-31), hosted in the <https://github.com/google/zerocopy> (released 2026-06-09), hosted in the <https://github.com/google/zerocopy>
repository, licensed under "BSD-2-Clause OR Apache-2.0 OR MIT" and only repository, licensed under "BSD-2-Clause OR Apache-2.0 OR MIT" and only
modified to add the SPDX license identifiers and to remove the generation of modified to tweak the SPDX license identifiers and to remove the generation of
non-ASCII identifiers. non-ASCII identifiers.
For copyright details, please see: For copyright details, please see:
https://github.com/google/zerocopy/blob/v0.8.50/README.md?plain=1 https://github.com/google/zerocopy/blob/v0.8.52/README.md?plain=1
https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-BSD https://github.com/google/zerocopy/blob/v0.8.52/LICENSE-BSD
https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-APACHE https://github.com/google/zerocopy/blob/v0.8.52/LICENSE-APACHE
https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-MIT https://github.com/google/zerocopy/blob/v0.8.52/LICENSE-MIT

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
use proc_macro2::{Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use syn::{ use syn::{
parse_quote, Data, DataEnum, DataStruct, DataUnion, Error, Expr, ExprLit, ExprUnary, Lit, UnOp, parse_quote, Data, DataEnum, DataStruct, DataUnion, Error, Expr, ExprLit, ExprUnary, Lit, UnOp,

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
use proc_macro2::{Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use quote::quote; use quote::quote;
use syn::{Data, DataEnum, DataStruct, DataUnion, Error, Type}; use syn::{Data, DataEnum, DataStruct, DataUnion, Error, Type};

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::quote; use quote::quote;
use syn::{parse_quote, Data, Error, Type}; use syn::{parse_quote, Data, Error, Type};
@ -87,7 +87,6 @@ fn pointer_to_metadata(ptr: *mut Self) -> <Self as #zerocopy_crate::KnownLayout>
}; };
let inner_extras = { let inner_extras = {
let leading_fields_tys = leading_fields_tys.clone();
let methods = make_methods(*trailing_field_ty); let methods = make_methods(*trailing_field_ty);
let (_, ty_generics, _) = ctx.ast.generics.split_for_impl(); let (_, ty_generics, _) = ctx.ast.generics.split_for_impl();

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
pub mod from_bytes; pub mod from_bytes;
pub mod into_bytes; pub mod into_bytes;
pub mod known_layout; pub mod known_layout;
@ -15,8 +15,8 @@
util::{Ctx, DataExt, FieldBounds, ImplBlockBuilder, Trait}, util::{Ctx, DataExt, FieldBounds, ImplBlockBuilder, Trait},
}; };
pub(crate) fn derive_immutable(ctx: &Ctx, _top_level: Trait) -> TokenStream { pub(crate) fn derive_immutable(ctx: &Ctx, _top_level: Trait) -> Result<TokenStream, Error> {
match &ctx.ast.data { Ok(match &ctx.ast.data {
Data::Struct(strct) => { Data::Struct(strct) => {
ImplBlockBuilder::new(ctx, strct, Trait::Immutable, FieldBounds::ALL_SELF).build() ImplBlockBuilder::new(ctx, strct, Trait::Immutable, FieldBounds::ALL_SELF).build()
} }
@ -26,7 +26,7 @@ pub(crate) fn derive_immutable(ctx: &Ctx, _top_level: Trait) -> TokenStream {
Data::Union(unn) => { Data::Union(unn) => {
ImplBlockBuilder::new(ctx, unn, Trait::Immutable, FieldBounds::ALL_SELF).build() ImplBlockBuilder::new(ctx, unn, Trait::Immutable, FieldBounds::ALL_SELF).build()
} }
} })
} }
pub(crate) fn derive_hash(ctx: &Ctx, _top_level: Trait) -> Result<TokenStream, Error> { pub(crate) fn derive_hash(ctx: &Ctx, _top_level: Trait) -> Result<TokenStream, Error> {
@ -97,16 +97,20 @@ pub(crate) fn derive_split_at(ctx: &Ctx, _top_level: Trait) -> Result<TokenStrea
match &ctx.ast.data { match &ctx.ast.data {
Data::Struct(_) => {} Data::Struct(_) => {}
Data::Enum(_) | Data::Union(_) => { Data::Enum(_) | Data::Union(_) => {
return Err(Error::new(Span::call_site(), "can only be applied to structs")); return ctx
.error_or_skip(Error::new(Span::call_site(), "can only be applied to structs"));
} }
}; };
if repr.get_packed().is_some() { if repr.get_packed().is_some() {
return Err(Error::new(Span::call_site(), "must not have #[repr(packed)] attribute")); return ctx.error_or_skip(Error::new(
Span::call_site(),
"must not have #[repr(packed)] attribute",
));
} }
if !(repr.is_c() || repr.is_transparent()) { if !(repr.is_c() || repr.is_transparent()) {
return Err(Error::new( return ctx.error_or_skip(Error::new(
Span::call_site(), Span::call_site(),
"must have #[repr(C)] or #[repr(transparent)] in order to guarantee this type's layout is splitable", "must have #[repr(C)] or #[repr(transparent)] in order to guarantee this type's layout is splitable",
)); ));
@ -116,7 +120,7 @@ pub(crate) fn derive_split_at(ctx: &Ctx, _top_level: Trait) -> Result<TokenStrea
let trailing_field = if let Some(((_, _, trailing_field), _)) = fields.split_last() { let trailing_field = if let Some(((_, _, trailing_field), _)) = fields.split_last() {
trailing_field trailing_field
} else { } else {
return Err(Error::new(Span::call_site(), "must at least one field")); return ctx.error_or_skip(Error::new(Span::call_site(), "must at least one field"));
}; };
let zerocopy_crate = &ctx.zerocopy_crate; let zerocopy_crate = &ctx.zerocopy_crate;

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::quote; use quote::quote;
use syn::{ use syn::{
@ -531,8 +531,8 @@ fn project(slf: #zerocopy_crate::pointer::PtrInner<'_, Self>) -> *mut <Self as #
data, data,
Trait::ProjectField { Trait::ProjectField {
variant_id: variant_id.clone(), variant_id: variant_id.clone(),
field: field.clone(), field,
field_id: field_id.clone(), field_id,
invariants: parse_quote!((Aliasing, Alignment, #zerocopy_crate::invariant::Initialized)), invariants: parse_quote!((Aliasing, Alignment, #zerocopy_crate::invariant::Initialized)),
}, },
FieldBounds::None, FieldBounds::None,

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
use proc_macro2::{Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use syn::{Data, DataEnum, DataStruct, DataUnion, Error}; use syn::{Data, DataEnum, DataStruct, DataUnion, Error};

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2019 The Fuchsia Authors // Copyright 2019 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
@ -129,6 +129,40 @@ fn into_ts(self) -> proc_macro2::TokenStream {
derive!(ByteEq => derive_eq => crate::derive::derive_eq); derive!(ByteEq => derive_eq => crate::derive::derive_eq);
derive!(SplitAt => derive_split_at => crate::derive::derive_split_at); derive!(SplitAt => derive_split_at => crate::derive::derive_split_at);
#[cfg_attr(zerocopy_unstable_linux, doc(hidden))]
#[proc_macro_derive(most_traits, attributes(zerocopy))]
pub fn most_traits(ts: proc_macro::TokenStream) -> proc_macro::TokenStream {
let ast = syn::parse_macro_input!(ts as DeriveInput);
let ctx = match Ctx::try_from_derive_input(ast) {
Ok(ctx) => ctx,
Err(e) => return e.into_compile_error().into(),
}
.skip_on_error();
// top-level traits for which to attempt a derive
let derives: [(fn(&Ctx, Trait) -> _, _); 6] = [
(crate::derive::known_layout::derive, Trait::KnownLayout),
(crate::derive::derive_immutable, Trait::Immutable),
(crate::derive::from_bytes::derive_from_bytes, Trait::FromBytes),
(crate::derive::into_bytes::derive_into_bytes, Trait::IntoBytes),
(crate::derive::derive_split_at, Trait::SplitAt),
(crate::derive::unaligned::derive_unaligned, Trait::Unaligned),
];
let mut tokens = proc_macro2::TokenStream::new();
for (derive, t) in derives {
tokens.extend(derive(&ctx, t))
}
// We wrap in `const_block` as a backstop in case any derive fails
// to wrap its output in `const_block` (and thus fails to annotate)
// with the full set of `#[allow(...)]` attributes).
let ts = const_block([Some(tokens)]);
#[cfg(test)]
crate::util::testutil::check_hygiene(ts.clone());
ts.into()
}
/// Deprecated: prefer [`FromZeros`] instead. /// Deprecated: prefer [`FromZeros`] instead.
#[deprecated(since = "0.8.0", note = "`FromZeroes` was renamed to `FromZeros`")] #[deprecated(since = "0.8.0", note = "`FromZeroes` was renamed to `FromZeros`")]
#[doc(hidden)] #[doc(hidden)]

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2019 The Fuchsia Authors // Copyright 2019 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2019 The Fuchsia Authors // Copyright 2019 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
@ -98,6 +98,11 @@ pub(crate) fn with_input(&self, input: &DeriveInput) -> Self {
} }
} }
pub(crate) fn skip_on_error(mut self) -> Self {
self.skip_on_error = true;
self
}
pub(crate) fn core_path(&self) -> TokenStream { pub(crate) fn core_path(&self) -> TokenStream {
let zerocopy_crate = &self.zerocopy_crate; let zerocopy_crate = &self.zerocopy_crate;
quote!(#zerocopy_crate::util::macro_util::core_reexport) quote!(#zerocopy_crate::util::macro_util::core_reexport)
@ -106,20 +111,21 @@ pub(crate) fn core_path(&self) -> TokenStream {
pub(crate) fn cfg_compile_error(&self) -> TokenStream { pub(crate) fn cfg_compile_error(&self) -> TokenStream {
// By checking both during the compilation of the proc macro *and* in // By checking both during the compilation of the proc macro *and* in
// the generated code, we ensure that `--cfg // the generated code, we ensure that `--cfg
// zerocopy_unstable_derive_on_error` need only be passed *either* when // zerocopy_unstable_linux` need only be passed *either* when
// compiling this crate *or* when compiling the user's crate. The former // compiling this crate *or* when compiling the user's crate. The former
// is preferable, but in some situations (such as when cross-compiling // is preferable, but in some situations (such as when cross-compiling
// using `cargo build --target`), it doesn't get propagated to this // using `cargo build --target`), it doesn't get propagated to this
// crate's build by default. // crate's build by default.
if cfg!(zerocopy_unstable_derive_on_error) { if cfg!(zerocopy_unstable_linux) {
quote!() quote!()
} else if let Some(span) = self.on_error_span { } else if let Some(span) = self.on_error_span {
let core = self.core_path(); let core = self.core_path();
let error_message = "`on_error` is experimental; pass '--cfg zerocopy_unstable_derive_on_error' to enable"; let error_message =
"`on_error` is experimental; pass '--cfg zerocopy_unstable_linux' to enable";
quote::quote_spanned! {span=> quote::quote_spanned! {span=>
#[allow(unused_attributes, unexpected_cfgs)] #[allow(unused_attributes, unexpected_cfgs)]
const _: () = { const _: () = {
#[cfg(not(zerocopy_unstable_derive_on_error))] #[cfg(not(zerocopy_unstable_linux))]
#core::compile_error!(#error_message); #core::compile_error!(#error_message);
}; };
} }
@ -612,6 +618,20 @@ fn bound_tt(ty: &Type, traits: impl Iterator<Item = Trait>, ctx: &Ctx) -> WhereP
} }
}; };
let zerocopy_bounds =
field_type_bounds
.into_iter()
.chain(padding_check_bound)
.chain(self_bounds)
.map(|bound| {
if self.ctx.skip_on_error {
parse_quote!(for<'zc> #bound)
} else {
bound.clone()
}
})
.collect::<Vec<_>>();
let bounds = self let bounds = self
.ctx .ctx
.ast .ast
@ -621,9 +641,7 @@ fn bound_tt(ty: &Type, traits: impl Iterator<Item = Trait>, ctx: &Ctx) -> WhereP
.map(|where_clause| where_clause.predicates.iter()) .map(|where_clause| where_clause.predicates.iter())
.into_iter() .into_iter()
.flatten() .flatten()
.chain(field_type_bounds.iter()) .chain(zerocopy_bounds.iter());
.chain(padding_check_bound.iter())
.chain(self_bounds.iter());
// The parameters with trait bounds, but without type defaults. // The parameters with trait bounds, but without type defaults.
let mut params: Vec<_> = self let mut params: Vec<_> = self

View File

@ -1,14 +1,13 @@
# `zerocopy` # `zerocopy`
These source files come from the Rust `zerocopy` crate, version v0.8.50 These source files come from the Rust `zerocopy` crate, version v0.8.52
(released 2026-05-31), hosted in the <https://github.com/google/zerocopy> (released 2026-06-09), hosted in the <https://github.com/google/zerocopy>
repository, licensed under "BSD-2-Clause OR Apache-2.0 OR MIT" and only repository, licensed under "BSD-2-Clause OR Apache-2.0 OR MIT" and only
modified to add the SPDX license identifiers and to remove `Display` modified to tweak the SPDX license identifiers.
for `f32` and `f64`.
For copyright details, please see: For copyright details, please see:
https://github.com/google/zerocopy/blob/v0.8.50/README.md?plain=1 https://github.com/google/zerocopy/blob/v0.8.52/README.md?plain=1
https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-BSD https://github.com/google/zerocopy/blob/v0.8.52/LICENSE-BSD
https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-APACHE https://github.com/google/zerocopy/blob/v0.8.52/LICENSE-APACHE
https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-MIT https://github.com/google/zerocopy/blob/v0.8.52/LICENSE-MIT

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2024 The Fuchsia Authors // Copyright 2024 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2019 The Fuchsia Authors // Copyright 2019 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
@ -164,6 +164,42 @@ fn fmt(&self, _: &mut Formatter<'_>) -> fmt::Result {
/// A type alias for [`LittleEndian`]. /// A type alias for [`LittleEndian`].
pub type LE = LittleEndian; pub type LE = LittleEndian;
macro_rules! impl_dbg_trait {
($name:ident, $native:ident) => {
impl<O: ByteOrder> Debug for $name<O> {
#[inline]
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
// This results in a format like "U16(42)".
f.debug_tuple(stringify!($name)).field(&self.get()).finish()
}
}
};
}
macro_rules! impl_dbg_traits {
($name:ident, $native:ident, "floating point number") => {
#[cfg(not(no_fp_fmt_parse))]
impl_dbg_trait!($name, $native);
#[cfg(no_fp_fmt_parse)]
impl<O: ByteOrder> Debug for $name<O> {
#[inline]
fn fmt(&self, _f: &mut Formatter<'_>) -> fmt::Result {
panic!("floating point support is turned off");
}
}
};
($name:ident, $native:ident, "unsigned integer") => {
impl_dbg_traits!($name, $native, @all_types);
};
($name:ident, $native:ident, "signed integer") => {
impl_dbg_traits!($name, $native, @all_types);
};
($name:ident, $native:ident, @all_types) => {
impl_dbg_trait!($name, $native);
};
}
macro_rules! impl_fmt_trait { macro_rules! impl_fmt_trait {
($name:ident, $native:ident, $trait:ident) => { ($name:ident, $native:ident, $trait:ident) => {
impl<O: ByteOrder> $trait for $name<O> { impl<O: ByteOrder> $trait for $name<O> {
@ -177,6 +213,8 @@ fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
macro_rules! impl_fmt_traits { macro_rules! impl_fmt_traits {
($name:ident, $native:ident, "floating point number") => { ($name:ident, $native:ident, "floating point number") => {
#[cfg(not(no_fp_fmt_parse))]
impl_fmt_trait!($name, $native, Display);
}; };
($name:ident, $native:ident, "unsigned integer") => { ($name:ident, $native:ident, "unsigned integer") => {
impl_fmt_traits!($name, $native, @all_types); impl_fmt_traits!($name, $native, @all_types);
@ -687,16 +725,9 @@ fn eq(&self, other: &$native) -> bool {
} }
} }
impl_dbg_traits!($name, $native, $number_kind);
impl_fmt_traits!($name, $native, $number_kind); impl_fmt_traits!($name, $native, $number_kind);
impl_ops_traits!($name, $native, $number_kind); impl_ops_traits!($name, $native, $number_kind);
impl<O: ByteOrder> Debug for $name<O> {
#[inline]
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
// This results in a format like "U16(42)".
f.debug_tuple(stringify!($name)).field(&self.get()).finish()
}
}
}; };
} }

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2024 The Fuchsia Authors // Copyright 2024 The Fuchsia Authors
// //
// Licensed under the 2-Clause BSD License <LICENSE-BSD or // Licensed under the 2-Clause BSD License <LICENSE-BSD or

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2024 The Fuchsia Authors // Copyright 2024 The Fuchsia Authors
// //
// Licensed under the 2-Clause BSD License <LICENSE-BSD or // Licensed under the 2-Clause BSD License <LICENSE-BSD or

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2024 The Fuchsia Authors // Copyright 2024 The Fuchsia Authors
// //
// Licensed under the 2-Clause BSD License <LICENSE-BSD or // Licensed under the 2-Clause BSD License <LICENSE-BSD or
@ -1359,7 +1359,7 @@ mod $mod {
#[cfg(not(no_zerocopy_aarch64_simd_1_59_0))] #[cfg(not(no_zerocopy_aarch64_simd_1_59_0))]
simd_arch_mod!( simd_arch_mod!(
#[cfg(all( #[cfg(all(
target_arch = "aarch64", target_arch = "aarch64",
any( any(
target_endian = "little", target_endian = "little",
not(no_zerocopy_aarch64_simd_be_1_87_0) not(no_zerocopy_aarch64_simd_be_1_87_0)

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2024 The Fuchsia Authors // Copyright 2024 The Fuchsia Authors
// //
// Licensed under the 2-Clause BSD License <LICENSE-BSD or // Licensed under the 2-Clause BSD License <LICENSE-BSD or

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2018 The Fuchsia Authors // Copyright 2018 The Fuchsia Authors
// //
// Licensed under the 2-Clause BSD License <LICENSE-BSD or // Licensed under the 2-Clause BSD License <LICENSE-BSD or
@ -12,7 +12,7 @@
// After updating the following doc comment, make sure to run the following // After updating the following doc comment, make sure to run the following
// command to update `README.md` based on its contents: // command to update `README.md` based on its contents:
// //
// cargo -q run --manifest-path tools/Cargo.toml -p generate-readme > README.md // (cd .. && cargo -q run --manifest-path tools/Cargo.toml -p generate-readme) > README.md
//! ***<span style="font-size: 140%">Fast, safe, <span //! ***<span style="font-size: 140%">Fast, safe, <span
//! style="color:red;">compile error</span>. Pick two.</span>*** //! style="color:red;">compile error</span>. Pick two.</span>***
@ -174,7 +174,7 @@
//! //!
//! [Miri]: https://github.com/rust-lang/miri //! [Miri]: https://github.com/rust-lang/miri
//! [Kani]: https://github.com/model-checking/kani //! [Kani]: https://github.com/model-checking/kani
//! [soundness policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#soundness //! [soundness policy]: https://github.com/google/zerocopy/blob/main/zerocopy/POLICIES.md#soundness
//! //!
//! # Relationship to Project Safe Transmute //! # Relationship to Project Safe Transmute
//! //!
@ -203,7 +203,7 @@
//! //!
//! See our [MSRV policy]. //! See our [MSRV policy].
//! //!
//! [MSRV policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#msrv //! [MSRV policy]: https://github.com/google/zerocopy/blob/main/zerocopy/POLICIES.md#msrv
//! //!
//! # Changelog //! # Changelog
//! //!
@ -435,6 +435,9 @@
WARNING WARNING
}; };
#[doc(hidden)]
#[cfg(all(any(feature = "derive", test), zerocopy_unstable_linux))]
pub use zerocopy_derive::most_traits;
/// Implements [`KnownLayout`]. /// Implements [`KnownLayout`].
/// ///
/// This derive analyzes various aspects of a type's layout that are needed for /// This derive analyzes various aspects of a type's layout that are needed for
@ -2832,7 +2835,7 @@ fn try_ref_from_suffix_with_elems(
/// ``` /// ```
/// ///
/// [`try_mut_from_bytes`]: TryFromBytes::try_mut_from_bytes /// [`try_mut_from_bytes`]: TryFromBytes::try_mut_from_bytes
/// ///
#[doc = codegen_header!("h5", "try_mut_from_bytes_with_elems")] #[doc = codegen_header!("h5", "try_mut_from_bytes_with_elems")]
/// ///
/// See [`TryFromBytes::try_ref_from_bytes_with_elems`](#method.try_ref_from_bytes_with_elems.codegen). /// See [`TryFromBytes::try_ref_from_bytes_with_elems`](#method.try_ref_from_bytes_with_elems.codegen).

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2024 The Fuchsia Authors // Copyright 2024 The Fuchsia Authors
// //
// Licensed under the 2-Clause BSD License <LICENSE-BSD or // Licensed under the 2-Clause BSD License <LICENSE-BSD or

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2024 The Fuchsia Authors // Copyright 2024 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2024 The Fuchsia Authors // Copyright 2024 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2023 The Fuchsia Authors // Copyright 2023 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2023 The Fuchsia Authors // Copyright 2023 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2025 The Fuchsia Authors // Copyright 2025 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2024 The Fuchsia Authors // Copyright 2024 The Fuchsia Authors
// //
// Licensed under the 2-Clause BSD License <LICENSE-BSD or // Licensed under the 2-Clause BSD License <LICENSE-BSD or

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2025 The Fuchsia Authors // Copyright 2025 The Fuchsia Authors
// //
// Licensed under the 2-Clause BSD License <LICENSE-BSD or // Licensed under the 2-Clause BSD License <LICENSE-BSD or

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2022 The Fuchsia Authors // Copyright 2022 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2023 The Fuchsia Authors // Copyright 2023 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2023 The Fuchsia Authors // Copyright 2023 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0

View File

@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT // SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
//
// Copyright 2023 The Fuchsia Authors // Copyright 2023 The Fuchsia Authors
// //
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0 // Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0