// SPDX-License-Identifier: GPL-2.0-or-later use std::ptr; /// Encapsulates the requirement that /// `MaybeUninit::::zeroed().assume_init()` does not cause undefined /// behavior. This trait in principle could be implemented as just: /// /// ``` /// const ZERO: Self = unsafe { /// ::core::mem::MaybeUninit::<$crate::bindings::Property>::zeroed().assume_init() /// }, /// ``` /// /// The need for a manual implementation is only because `zeroed()` cannot /// be used as a `const fn` prior to Rust 1.75.0. Once we can assume a new /// enough version of the compiler, we could provide a `#[derive(Zeroable)]` /// macro to check at compile-time that all struct fields are Zeroable, and /// use the above blanket implementation of the `ZERO` constant. /// /// # Safety /// /// Because the implementation of `ZERO` is manual, it does not make /// any assumption on the safety of `zeroed()`. However, other users of the /// trait could use it that way. Do not add this trait to a type unless /// all-zeroes is a valid value for the type. In particular, remember that /// raw pointers can be zero, but references and `NonNull` cannot pub unsafe trait Zeroable: Default { const ZERO: Self; } unsafe impl Zeroable for crate::bindings::Property__bindgen_ty_1 { const ZERO: Self = Self { i: 0 }; } unsafe impl Zeroable for crate::bindings::Property { const ZERO: Self = Self { name: ptr::null(), info: ptr::null(), offset: 0, bitnr: 0, bitmask: 0, set_default: false, defval: Zeroable::ZERO, arrayoffset: 0, arrayinfo: ptr::null(), arrayfieldsize: 0, link_type: ptr::null(), }; } unsafe impl Zeroable for crate::bindings::VMStateDescription { const ZERO: Self = Self { name: ptr::null(), unmigratable: false, early_setup: false, version_id: 0, minimum_version_id: 0, priority: crate::bindings::MigrationPriority::MIG_PRI_DEFAULT, pre_load: None, post_load: None, pre_save: None, post_save: None, needed: None, dev_unplug_pending: None, fields: ptr::null(), subsections: ptr::null(), }; } unsafe impl Zeroable for crate::bindings::MemoryRegionOps__bindgen_ty_1 { const ZERO: Self = Self { min_access_size: 0, max_access_size: 0, unaligned: false, accepts: None, }; } unsafe impl Zeroable for crate::bindings::MemoryRegionOps__bindgen_ty_2 { const ZERO: Self = Self { min_access_size: 0, max_access_size: 0, unaligned: false, }; }