mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
rust: pin-init: implement ZeroableOption
for function pointers with up to 20 arguments
`Option<[unsafe] [extern "abi"] fn(...args...) -> ret>` is documented
[1] to also have the `None` variant equal all zeroes.
Link: https://doc.rust-lang.org/stable/std/option/index.html#representation [1]
Link: b6c1ab4fb3
Link: https://lore.kernel.org/all/20250523145125.523275-7-lossin@kernel.org
Signed-off-by: Benno Lossin <lossin@kernel.org>
This commit is contained in:
parent
9f47353870
commit
ec87ec35ca
@ -1662,6 +1662,22 @@ macro_rules! impl_tuple_zeroable {
|
||||
|
||||
impl_tuple_zeroable!(A, B, C, D, E, F, G, H, I, J);
|
||||
|
||||
macro_rules! impl_fn_zeroable_option {
|
||||
([$($abi:literal),* $(,)?] $args:tt) => {
|
||||
$(impl_fn_zeroable_option!({extern $abi} $args);)*
|
||||
$(impl_fn_zeroable_option!({unsafe extern $abi} $args);)*
|
||||
};
|
||||
({$($prefix:tt)*} {$(,)?}) => {};
|
||||
({$($prefix:tt)*} {$ret:ident, $($rest:ident),* $(,)?}) => {
|
||||
// SAFETY: function pointers are part of the option layout optimization:
|
||||
// <https://doc.rust-lang.org/stable/std/option/index.html#representation>.
|
||||
unsafe impl<$ret, $($rest),*> ZeroableOption for $($prefix)* fn($($rest),*) -> $ret {}
|
||||
impl_fn_zeroable_option!({$($prefix)*} {$($rest),*,});
|
||||
};
|
||||
}
|
||||
|
||||
impl_fn_zeroable_option!(["Rust", "C"] { A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U });
|
||||
|
||||
/// This trait allows creating an instance of `Self` which contains exactly one
|
||||
/// [structurally pinned value](https://doc.rust-lang.org/std/pin/index.html#projections-and-structural-pinning).
|
||||
///
|
||||
|
Loading…
Reference in New Issue
Block a user