Skip to main content

rustc_public/
abi.rs

1use std::fmt::{self, Debug};
2use std::num::NonZero;
3use std::ops::RangeInclusive;
4
5use serde::Serialize;
6
7use crate::compiler_interface::with;
8use crate::mir::FieldIdx;
9use crate::target::{MachineInfo, MachineSize as Size};
10use crate::ty::{Align, Ty, VariantIdx, index_impl};
11use crate::{Error, ThreadLocalIndex, error};
12
13/// A function ABI definition.
14#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnAbi {
    #[inline]
    fn clone(&self) -> FnAbi {
        FnAbi {
            args: ::core::clone::Clone::clone(&self.args),
            ret: ::core::clone::Clone::clone(&self.ret),
            fixed_count: ::core::clone::Clone::clone(&self.fixed_count),
            conv: ::core::clone::Clone::clone(&self.conv),
            c_variadic: ::core::clone::Clone::clone(&self.c_variadic),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FnAbi {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "FnAbi", "args",
            &self.args, "ret", &self.ret, "fixed_count", &self.fixed_count,
            "conv", &self.conv, "c_variadic", &&self.c_variadic)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FnAbi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FnAbi {
    #[inline]
    fn eq(&self, other: &FnAbi) -> bool {
        self.fixed_count == other.fixed_count &&
                        self.c_variadic == other.c_variadic &&
                    self.args == other.args && self.ret == other.ret &&
            self.conv == other.conv
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for FnAbi {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Vec<ArgAbi>>;
        let _: ::core::cmp::AssertParamIsEq<ArgAbi>;
        let _: ::core::cmp::AssertParamIsEq<u32>;
        let _: ::core::cmp::AssertParamIsEq<CallConvention>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for FnAbi {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.args, state);
        ::core::hash::Hash::hash(&self.ret, state);
        ::core::hash::Hash::hash(&self.fixed_count, state);
        ::core::hash::Hash::hash(&self.conv, state);
        ::core::hash::Hash::hash(&self.c_variadic, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for FnAbi {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer, "FnAbi",
                            false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "args", &self.args)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ret", &self.ret)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "fixed_count", &self.fixed_count)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "conv", &self.conv)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "c_variadic", &self.c_variadic)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
15pub struct FnAbi {
16    /// The types of each argument.
17    pub args: Vec<ArgAbi>,
18
19    /// The expected return type.
20    pub ret: ArgAbi,
21
22    /// The count of declared arguments (excluding variadic and implicit arguments).
23    ///
24    /// This may be less than `args.len()` for C variadic functions (which have
25    /// additional variadic arguments) or `#[track_caller]` functions (which have
26    /// an implicit caller location argument).
27    pub fixed_count: u32,
28
29    /// The ABI convention.
30    pub conv: CallConvention,
31
32    /// Whether this is a variadic C function,
33    pub c_variadic: bool,
34}
35
36/// Information about the ABI of a function's argument, or return value.
37#[derive(#[automatically_derived]
impl ::core::clone::Clone for ArgAbi {
    #[inline]
    fn clone(&self) -> ArgAbi {
        ArgAbi {
            ty: ::core::clone::Clone::clone(&self.ty),
            layout: ::core::clone::Clone::clone(&self.layout),
            mode: ::core::clone::Clone::clone(&self.mode),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ArgAbi {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "ArgAbi", "ty",
            &self.ty, "layout", &self.layout, "mode", &&self.mode)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ArgAbi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ArgAbi {
    #[inline]
    fn eq(&self, other: &ArgAbi) -> bool {
        self.ty == other.ty && self.layout == other.layout &&
            self.mode == other.mode
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ArgAbi {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ty>;
        let _: ::core::cmp::AssertParamIsEq<Layout>;
        let _: ::core::cmp::AssertParamIsEq<PassMode>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for ArgAbi {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.ty, state);
        ::core::hash::Hash::hash(&self.layout, state);
        ::core::hash::Hash::hash(&self.mode, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ArgAbi {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer, "ArgAbi",
                            false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "layout", &self.layout)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "mode", &self.mode)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
38pub struct ArgAbi {
39    pub ty: Ty,
40    pub layout: Layout,
41    pub mode: PassMode,
42}
43
44/// How a function argument should be passed in to the target function.
45///
46/// The pass mode is determined by the platform's calling convention and the
47/// argument's type layout. The same Rust type may use different pass modes
48/// on different targets or when register availability changes.
49///
50/// Note: for the Rust ABI, pass modes may not correspond to any valid C
51/// calling convention (e.g., using more return registers than the platform
52/// C ABI allows). Further processing may be needed depending on the target.
53#[derive(#[automatically_derived]
impl ::core::clone::Clone for PassMode {
    #[inline]
    fn clone(&self) -> PassMode {
        match self {
            PassMode::Ignore => PassMode::Ignore,
            PassMode::Direct(__self_0) =>
                PassMode::Direct(::core::clone::Clone::clone(__self_0)),
            PassMode::Pair(__self_0, __self_1) =>
                PassMode::Pair(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            PassMode::Cast { pad_i32_count: __self_0, cast: __self_1 } =>
                PassMode::Cast {
                    pad_i32_count: ::core::clone::Clone::clone(__self_0),
                    cast: ::core::clone::Clone::clone(__self_1),
                },
            PassMode::Indirect {
                attrs: __self_0, meta_attrs: __self_1, on_stack: __self_2 } =>
                PassMode::Indirect {
                    attrs: ::core::clone::Clone::clone(__self_0),
                    meta_attrs: ::core::clone::Clone::clone(__self_1),
                    on_stack: ::core::clone::Clone::clone(__self_2),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for PassMode {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            PassMode::Ignore =>
                ::core::fmt::Formatter::write_str(f, "Ignore"),
            PassMode::Direct(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Direct",
                    &__self_0),
            PassMode::Pair(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Pair",
                    __self_0, &__self_1),
            PassMode::Cast { pad_i32_count: __self_0, cast: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Cast",
                    "pad_i32_count", __self_0, "cast", &__self_1),
            PassMode::Indirect {
                attrs: __self_0, meta_attrs: __self_1, on_stack: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Indirect", "attrs", __self_0, "meta_attrs", __self_1,
                    "on_stack", &__self_2),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PassMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PassMode {
    #[inline]
    fn eq(&self, other: &PassMode) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (PassMode::Direct(__self_0), PassMode::Direct(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (PassMode::Pair(__self_0, __self_1),
                    PassMode::Pair(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (PassMode::Cast { pad_i32_count: __self_0, cast: __self_1 },
                    PassMode::Cast { pad_i32_count: __arg1_0, cast: __arg1_1 })
                    => __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (PassMode::Indirect {
                    attrs: __self_0, meta_attrs: __self_1, on_stack: __self_2 },
                    PassMode::Indirect {
                    attrs: __arg1_0, meta_attrs: __arg1_1, on_stack: __arg1_2 })
                    =>
                    __self_2 == __arg1_2 && __self_0 == __arg1_0 &&
                        __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for PassMode {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ArgAttributes>;
        let _: ::core::cmp::AssertParamIsEq<u8>;
        let _: ::core::cmp::AssertParamIsEq<CastTarget>;
        let _: ::core::cmp::AssertParamIsEq<Option<ArgAttributes>>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for PassMode {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            PassMode::Direct(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            PassMode::Pair(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            PassMode::Cast { pad_i32_count: __self_0, cast: __self_1 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            PassMode::Indirect {
                attrs: __self_0, meta_attrs: __self_1, on_stack: __self_2 } =>
                {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state);
                ::core::hash::Hash::hash(__self_2, state)
            }
            _ => {}
        }
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for PassMode {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    PassMode::Ignore =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "PassMode", 0u32, "Ignore"),
                    PassMode::Direct(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "PassMode", 1u32, "Direct", __field0),
                    PassMode::Pair(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "PassMode", 2u32, "Pair", 0 + 1 + 1)?;
                        _serde::ser::SerializeTupleVariant::serialize_field(&mut __serde_state,
                                __field0)?;
                        _serde::ser::SerializeTupleVariant::serialize_field(&mut __serde_state,
                                __field1)?;
                        _serde::ser::SerializeTupleVariant::end(__serde_state)
                    }
                    PassMode::Cast { ref pad_i32_count, ref cast } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "PassMode", 3u32, "Cast", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "pad_i32_count", pad_i32_count)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "cast", cast)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    PassMode::Indirect { ref attrs, ref meta_attrs, ref on_stack
                        } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "PassMode", 4u32, "Indirect", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "attrs", attrs)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "meta_attrs", meta_attrs)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "on_stack", on_stack)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
54pub enum PassMode {
55    /// Ignore the argument.
56    ///
57    /// The argument is either uninhabited or a ZST (zero-sized type).
58    Ignore,
59    /// Pass the argument directly in a single register.
60    ///
61    /// Used for primitive types and small values that fit in one register.
62    Direct(ArgAttributes),
63    /// Pass the argument directly in two registers.
64    ///
65    /// Used for types represented as a pair of values (e.g., a fat pointer
66    /// consisting of a data pointer and a length/vtable pointer).
67    Pair(ArgAttributes, ArgAttributes),
68    /// Pass the argument after reinterpreting it as a different register layout.
69    ///
70    /// Used for aggregates (structs, tuples) that the platform ABI passes in
71    /// registers. The argument's bytes are reinterpreted as the register
72    /// sequence described by [`CastTarget`]. See its documentation for details.
73    Cast { pad_i32_count: u8, cast: CastTarget },
74    /// Pass the argument indirectly via a pointer.
75    ///
76    /// The caller places the value in memory and passes a pointer to it.
77    /// When `on_stack` is true, the value is placed at a fixed stack offset
78    /// rather than passed as a regular pointer argument.
79    Indirect {
80        attrs: ArgAttributes,
81        /// Attributes for the metadata pointer (vtable or length) of unsized arguments.
82        /// Only present for unsized types (e.g., `dyn Trait`, `[T]`).
83        meta_attrs: Option<ArgAttributes>,
84        on_stack: bool,
85    },
86}
87
88/// Attributes of a function argument that affect its ABI.
89///
90/// Not all internal compiler attributes are exposed here, as some are
91/// LLVM-specific optimization hints. The internal representation is kept
92/// private so it can be expanded in the future.
93#[derive(#[automatically_derived]
impl ::core::clone::Clone for ArgAttributes {
    #[inline]
    fn clone(&self) -> ArgAttributes {
        ArgAttributes {
            arg_ext: ::core::clone::Clone::clone(&self.arg_ext),
            pointee_size: ::core::clone::Clone::clone(&self.pointee_size),
            pointee_align: ::core::clone::Clone::clone(&self.pointee_align),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ArgAttributes {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "ArgAttributes",
            "arg_ext", &self.arg_ext, "pointee_size", &self.pointee_size,
            "pointee_align", &&self.pointee_align)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ArgAttributes { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ArgAttributes {
    #[inline]
    fn eq(&self, other: &ArgAttributes) -> bool {
        self.arg_ext == other.arg_ext &&
                self.pointee_size == other.pointee_size &&
            self.pointee_align == other.pointee_align
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ArgAttributes {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ArgExtension>;
        let _: ::core::cmp::AssertParamIsEq<Size>;
        let _: ::core::cmp::AssertParamIsEq<Option<Align>>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for ArgAttributes {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.arg_ext, state);
        ::core::hash::Hash::hash(&self.pointee_size, state);
        ::core::hash::Hash::hash(&self.pointee_align, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ArgAttributes {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "ArgAttributes", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "arg_ext", &self.arg_ext)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "pointee_size", &self.pointee_size)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "pointee_align", &self.pointee_align)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
94pub struct ArgAttributes {
95    pub(crate) arg_ext: ArgExtension,
96    pub(crate) pointee_size: Size,
97    pub(crate) pointee_align: Option<Align>,
98}
99
100impl ArgAttributes {
101    /// Return how this argument should be extended when passed in a register.
102    ///
103    /// Relevant for integer arguments smaller than the register width.
104    pub fn arg_extension(&self) -> ArgExtension {
105        self.arg_ext
106    }
107
108    /// Return the minimum alignment of the pointee, if applicable.
109    ///
110    /// This is relevant for `PassMode::Indirect` arguments where the pointer
111    /// must satisfy a particular alignment.
112    pub fn pointee_align(&self) -> Option<Align> {
113        self.pointee_align
114    }
115
116    /// Return the minimum dereferenceable size of the pointee, if known.
117    pub fn pointee_size(&self) -> Size {
118        self.pointee_size
119    }
120}
121
122/// How a small integer argument should be extended to fill a register.
123#[derive(#[automatically_derived]
impl ::core::marker::Copy for ArgExtension { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ArgExtension { }
#[automatically_derived]
impl ::core::clone::Clone for ArgExtension {
    #[inline]
    fn clone(&self) -> ArgExtension { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ArgExtension {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                ArgExtension::None => "None",
                ArgExtension::Zext => "Zext",
                ArgExtension::Sext => "Sext",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ArgExtension { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ArgExtension {
    #[inline]
    fn eq(&self, other: &ArgExtension) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ArgExtension { }Eq, #[automatically_derived]
impl ::core::hash::Hash for ArgExtension {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ArgExtension {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ArgExtension::None =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ArgExtension", 0u32, "None"),
                    ArgExtension::Zext =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ArgExtension", 1u32, "Zext"),
                    ArgExtension::Sext =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ArgExtension", 2u32, "Sext"),
                }
            }
        }
    };Serialize)]
124pub enum ArgExtension {
125    /// No extension required.
126    None,
127    /// Zero-extend to the register width.
128    Zext,
129    /// Sign-extend to the register width.
130    Sext,
131}
132
133/// Describes the ABI type that an argument is transmuted to for `PassMode::Cast`.
134///
135/// When an argument is "cast," its raw bytes are reinterpreted as a sequence of
136/// register-sized values for passing. This struct describes that target layout:
137///
138/// 1. The `prefix` registers are laid out first, like fields of a `repr(C)` struct
139///    (i.e., with alignment padding between them).
140/// 2. After the prefix, `rest.unit` is repeated enough times to cover `rest.total`,
141///    starting at `rest_offset` (or immediately after the prefix if `None`).
142///
143/// For example, on x86_64 a `struct { i32, f64 }` might be cast to a prefix of
144/// `[Reg::i64()]` followed by a rest of `Reg::f64()` — placing the first 8 bytes
145/// in an integer register and the second 8 bytes in a floating-point register.
146#[derive(#[automatically_derived]
impl ::core::clone::Clone for CastTarget {
    #[inline]
    fn clone(&self) -> CastTarget {
        CastTarget {
            prefix: ::core::clone::Clone::clone(&self.prefix),
            rest_offset: ::core::clone::Clone::clone(&self.rest_offset),
            rest: ::core::clone::Clone::clone(&self.rest),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for CastTarget {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "CastTarget",
            "prefix", &self.prefix, "rest_offset", &self.rest_offset, "rest",
            &&self.rest)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CastTarget { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CastTarget {
    #[inline]
    fn eq(&self, other: &CastTarget) -> bool {
        self.prefix == other.prefix && self.rest_offset == other.rest_offset
            && self.rest == other.rest
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CastTarget {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Vec<Reg>>;
        let _: ::core::cmp::AssertParamIsEq<Option<Size>>;
        let _: ::core::cmp::AssertParamIsEq<Uniform>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for CastTarget {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.prefix, state);
        ::core::hash::Hash::hash(&self.rest_offset, state);
        ::core::hash::Hash::hash(&self.rest, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for CastTarget {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "CastTarget", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "prefix", &self.prefix)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "rest_offset", &self.rest_offset)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "rest", &self.rest)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
147pub struct CastTarget {
148    /// Leading registers of potentially different types, laid out with `repr(C)` padding.
149    pub prefix: Vec<Reg>,
150    /// The byte offset where `rest` begins, if explicitly set.
151    /// When `None`, `rest` starts immediately after the prefix.
152    pub rest_offset: Option<Size>,
153    /// The repeated trailing register type filling the remainder of the value.
154    pub rest: Uniform,
155}
156
157impl CastTarget {
158    /// Return the total size of the ABI type this argument is cast to.
159    pub fn size(&self) -> Size {
160        let prefix_size: usize = self.prefix.iter().map(|r| r.size.bits()).sum();
161        Size::from_bits(prefix_size + self.rest.total.bits())
162    }
163}
164
165/// A sequence of registers of the same kind used to pass an argument.
166#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Uniform { }
#[automatically_derived]
impl ::core::clone::Clone for Uniform {
    #[inline]
    fn clone(&self) -> Uniform {
        let _: ::core::clone::AssertParamIsClone<Reg>;
        let _: ::core::clone::AssertParamIsClone<Size>;
        let _: ::core::clone::AssertParamIsClone<bool>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Uniform { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Uniform {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "Uniform",
            "unit", &self.unit, "total", &self.total, "is_consecutive",
            &&self.is_consecutive)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Uniform { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Uniform {
    #[inline]
    fn eq(&self, other: &Uniform) -> bool {
        self.is_consecutive == other.is_consecutive && self.unit == other.unit
            && self.total == other.total
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Uniform {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Reg>;
        let _: ::core::cmp::AssertParamIsEq<Size>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Uniform {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.unit, state);
        ::core::hash::Hash::hash(&self.total, state);
        ::core::hash::Hash::hash(&self.is_consecutive, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for Uniform {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "Uniform", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "unit", &self.unit)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "total", &self.total)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_consecutive", &self.is_consecutive)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
167pub struct Uniform {
168    /// The type of register used.
169    pub unit: Reg,
170    /// The total size of the argument, which can be:
171    /// * equal to `unit.size` (one scalar/vector),
172    /// * a multiple of `unit.size` (an array of scalar/vectors),
173    /// * if `unit.kind` is `Integer`, the last element can be shorter, i.e., `{ i64, i64, i32 }`
174    ///   for 64-bit integers with a total size of 20 bytes. When the argument is actually passed,
175    ///   this size will be rounded up to the nearest multiple of `unit.size`.
176    pub total: Size,
177    /// Whether the argument is consecutive: either all values are passed in registers, or all on
178    /// the stack with no additional padding between elements.
179    pub is_consecutive: bool,
180}
181
182impl Uniform {
183    /// Return the number of registers needed to cover `total`.
184    pub fn reg_count(&self) -> usize {
185        if self.unit.size.bits() == 0 {
186            return 0;
187        }
188        (self.total.bits() + self.unit.size.bits() - 1) / self.unit.size.bits()
189    }
190}
191
192/// A register type used in ABI calling conventions.
193#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Reg { }
#[automatically_derived]
impl ::core::clone::Clone for Reg {
    #[inline]
    fn clone(&self) -> Reg {
        let _: ::core::clone::AssertParamIsClone<RegKind>;
        let _: ::core::clone::AssertParamIsClone<Size>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Reg { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Reg {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Reg", "kind",
            &self.kind, "size", &&self.size)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Reg { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Reg {
    #[inline]
    fn eq(&self, other: &Reg) -> bool {
        self.kind == other.kind && self.size == other.size
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Reg {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<RegKind>;
        let _: ::core::cmp::AssertParamIsEq<Size>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Reg {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.kind, state);
        ::core::hash::Hash::hash(&self.size, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for Reg {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer, "Reg",
                            false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "size", &self.size)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
194pub struct Reg {
195    pub kind: RegKind,
196    pub size: Size,
197}
198
199/// The kind of a register used in calling conventions.
200#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RegKind { }
#[automatically_derived]
impl ::core::clone::Clone for RegKind {
    #[inline]
    fn clone(&self) -> RegKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RegKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for RegKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RegKind::Integer => "Integer",
                RegKind::Float => "Float",
                RegKind::Vector => "Vector",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RegKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RegKind {
    #[inline]
    fn eq(&self, other: &RegKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RegKind { }Eq, #[automatically_derived]
impl ::core::hash::Hash for RegKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for RegKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    RegKind::Integer =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "RegKind", 0u32, "Integer"),
                    RegKind::Float =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "RegKind", 1u32, "Float"),
                    RegKind::Vector =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "RegKind", 2u32, "Vector"),
                }
            }
        }
    };Serialize)]
201pub enum RegKind {
202    Integer,
203    Float,
204    Vector,
205}
206
207/// The layout of a type, alongside the type itself.
208#[derive(#[automatically_derived]
impl ::core::marker::Copy for TyAndLayout { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TyAndLayout { }
#[automatically_derived]
impl ::core::clone::Clone for TyAndLayout {
    #[inline]
    fn clone(&self) -> TyAndLayout {
        let _: ::core::clone::AssertParamIsClone<Ty>;
        let _: ::core::clone::AssertParamIsClone<Layout>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TyAndLayout {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "TyAndLayout",
            "ty", &self.ty, "layout", &&self.layout)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for TyAndLayout { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TyAndLayout {
    #[inline]
    fn eq(&self, other: &TyAndLayout) -> bool {
        self.ty == other.ty && self.layout == other.layout
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TyAndLayout {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ty>;
        let _: ::core::cmp::AssertParamIsEq<Layout>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for TyAndLayout {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.ty, state);
        ::core::hash::Hash::hash(&self.layout, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for TyAndLayout {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "TyAndLayout", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "layout", &self.layout)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
209pub struct TyAndLayout {
210    pub ty: Ty,
211    pub layout: Layout,
212}
213
214/// The layout of a type, including its size, alignment, field offsets, and backend representation.
215#[derive(#[automatically_derived]
impl ::core::clone::Clone for LayoutShape {
    #[inline]
    fn clone(&self) -> LayoutShape {
        LayoutShape {
            fields: ::core::clone::Clone::clone(&self.fields),
            variants: ::core::clone::Clone::clone(&self.variants),
            value_repr: ::core::clone::Clone::clone(&self.value_repr),
            abi_align: ::core::clone::Clone::clone(&self.abi_align),
            size: ::core::clone::Clone::clone(&self.size),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for LayoutShape {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "LayoutShape",
            "fields", &self.fields, "variants", &self.variants, "value_repr",
            &self.value_repr, "abi_align", &self.abi_align, "size",
            &&self.size)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LayoutShape { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LayoutShape {
    #[inline]
    fn eq(&self, other: &LayoutShape) -> bool {
        self.fields == other.fields && self.variants == other.variants &&
                    self.value_repr == other.value_repr &&
                self.abi_align == other.abi_align && self.size == other.size
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LayoutShape {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<FieldsShape>;
        let _: ::core::cmp::AssertParamIsEq<VariantsShape>;
        let _: ::core::cmp::AssertParamIsEq<ValueRepr>;
        let _: ::core::cmp::AssertParamIsEq<Align>;
        let _: ::core::cmp::AssertParamIsEq<Size>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for LayoutShape {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.fields, state);
        ::core::hash::Hash::hash(&self.variants, state);
        ::core::hash::Hash::hash(&self.value_repr, state);
        ::core::hash::Hash::hash(&self.abi_align, state);
        ::core::hash::Hash::hash(&self.size, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for LayoutShape {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "LayoutShape", false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "fields", &self.fields)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "variants", &self.variants)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "value_repr", &self.value_repr)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "abi_align", &self.abi_align)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "size", &self.size)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
216pub struct LayoutShape {
217    /// The fields location within the layout
218    pub fields: FieldsShape,
219
220    /// Encodes information about multi-variant layouts.
221    /// Even with `Multiple` variants, a layout still has its own fields! Those are then
222    /// shared between all variants.
223    ///
224    /// To access all fields of this layout, both `fields` and the fields of the active variant
225    /// must be taken into account.
226    pub variants: VariantsShape,
227
228    /// A hint for how backends should represent this type: as a scalar, vector, or aggregate.
229    pub value_repr: ValueRepr,
230
231    /// The ABI mandated alignment in bytes.
232    pub abi_align: Align,
233
234    /// The size of this layout in bytes.
235    pub size: Size,
236}
237
238impl LayoutShape {
239    /// Returns `true` if the layout corresponds to an unsized type.
240    #[inline]
241    pub fn is_unsized(&self) -> bool {
242        self.value_repr.is_unsized()
243    }
244
245    #[inline]
246    pub fn is_sized(&self) -> bool {
247        !self.value_repr.is_unsized()
248    }
249
250    /// Returns `true` if the type is sized and a 1-ZST (meaning it has size 0 and alignment 1).
251    pub fn is_1zst(&self) -> bool {
252        self.is_sized() && self.size.bits() == 0 && self.abi_align == 1
253    }
254}
255
256#[derive(#[automatically_derived]
impl ::core::marker::Copy for Layout { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Layout { }
#[automatically_derived]
impl ::core::clone::Clone for Layout {
    #[inline]
    fn clone(&self) -> Layout {
        let _: ::core::clone::AssertParamIsClone<usize>;
        let _: ::core::clone::AssertParamIsClone<ThreadLocalIndex>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Layout {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Layout",
            &self.0, &&self.1)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Layout { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Layout {
    #[inline]
    fn eq(&self, other: &Layout) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Layout {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<usize>;
        let _: ::core::cmp::AssertParamIsEq<ThreadLocalIndex>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Layout {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state);
        ::core::hash::Hash::hash(&self.1, state)
    }
}Hash)]
257pub struct Layout(usize, ThreadLocalIndex);
258impl crate::IndexedVal for Layout {
    fn to_val(index: usize) -> Self { Layout(index, crate::ThreadLocalIndex) }
    fn to_index(&self) -> usize { self.0 }
}
impl ::serde::Serialize for Layout {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
        S: ::serde::Serializer {
        let n: usize = self.0;
        ::serde::Serialize::serialize(&n, serializer)
    }
}index_impl!(Layout);
259
260impl Layout {
261    pub fn shape(self) -> LayoutShape {
262        with(|cx| cx.layout_shape(self))
263    }
264}
265
266/// Describes the number and position of fields within a type's layout.
267#[derive(#[automatically_derived]
impl ::core::clone::Clone for FieldsShape {
    #[inline]
    fn clone(&self) -> FieldsShape {
        match self {
            FieldsShape::Primitive => FieldsShape::Primitive,
            FieldsShape::Union(__self_0) =>
                FieldsShape::Union(::core::clone::Clone::clone(__self_0)),
            FieldsShape::Array { stride: __self_0, count: __self_1 } =>
                FieldsShape::Array {
                    stride: ::core::clone::Clone::clone(__self_0),
                    count: ::core::clone::Clone::clone(__self_1),
                },
            FieldsShape::Arbitrary { offsets: __self_0 } =>
                FieldsShape::Arbitrary {
                    offsets: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FieldsShape {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            FieldsShape::Primitive =>
                ::core::fmt::Formatter::write_str(f, "Primitive"),
            FieldsShape::Union(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Union",
                    &__self_0),
            FieldsShape::Array { stride: __self_0, count: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Array",
                    "stride", __self_0, "count", &__self_1),
            FieldsShape::Arbitrary { offsets: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Arbitrary", "offsets", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FieldsShape { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FieldsShape {
    #[inline]
    fn eq(&self, other: &FieldsShape) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (FieldsShape::Union(__self_0), FieldsShape::Union(__arg1_0))
                    => __self_0 == __arg1_0,
                (FieldsShape::Array { stride: __self_0, count: __self_1 },
                    FieldsShape::Array { stride: __arg1_0, count: __arg1_1 }) =>
                    __self_1 == __arg1_1 && __self_0 == __arg1_0,
                (FieldsShape::Arbitrary { offsets: __self_0 },
                    FieldsShape::Arbitrary { offsets: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for FieldsShape {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<NonZero<usize>>;
        let _: ::core::cmp::AssertParamIsEq<Size>;
        let _: ::core::cmp::AssertParamIsEq<u64>;
        let _: ::core::cmp::AssertParamIsEq<Vec<Size>>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for FieldsShape {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            FieldsShape::Union(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            FieldsShape::Array { stride: __self_0, count: __self_1 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            FieldsShape::Arbitrary { offsets: __self_0 } =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for FieldsShape {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    FieldsShape::Primitive =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "FieldsShape", 0u32, "Primitive"),
                    FieldsShape::Union(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "FieldsShape", 1u32, "Union", __field0),
                    FieldsShape::Array { ref stride, ref count } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "FieldsShape", 2u32, "Array", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "stride", stride)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "count", count)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    FieldsShape::Arbitrary { ref offsets } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "FieldsShape", 3u32, "Arbitrary", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "offsets", offsets)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
268pub enum FieldsShape {
269    /// Scalar primitives and `!`, which never have fields.
270    Primitive,
271
272    /// All fields start at no offset. The `usize` is the field count.
273    Union(NonZero<usize>),
274
275    /// Array/vector-like placement, with all fields of identical types.
276    Array { stride: Size, count: u64 },
277
278    /// Struct-like placement, with precomputed offsets.
279    ///
280    /// Fields are guaranteed to not overlap, but note that gaps
281    /// before, between and after all the fields are NOT always
282    /// padding, and as such their contents may not be discarded.
283    /// For example, enum variants leave a gap at the start,
284    /// where the discriminant field in the enum layout goes.
285    Arbitrary {
286        /// Offsets for the first byte of each field,
287        /// ordered to match the source definition order.
288        /// I.e.: It follows the same order as [super::ty::VariantDef::fields()].
289        /// This vector does not go in increasing order.
290        offsets: Vec<Size>,
291    },
292}
293
294impl FieldsShape {
295    pub fn fields_by_offset_order(&self) -> Vec<FieldIdx> {
296        match self {
297            FieldsShape::Primitive => ::alloc::vec::Vec::new()vec![],
298            FieldsShape::Union(_) | FieldsShape::Array { .. } => (0..self.count()).collect(),
299            FieldsShape::Arbitrary { offsets, .. } => {
300                let mut indices = (0..offsets.len()).collect::<Vec<_>>();
301                indices.sort_by_key(|idx| offsets[*idx]);
302                indices
303            }
304        }
305    }
306
307    pub fn count(&self) -> usize {
308        match self {
309            FieldsShape::Primitive => 0,
310            FieldsShape::Union(count) => count.get(),
311            FieldsShape::Array { count, .. } => *count as usize,
312            FieldsShape::Arbitrary { offsets, .. } => offsets.len(),
313        }
314    }
315}
316
317#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantsShape {
    #[inline]
    fn clone(&self) -> VariantsShape {
        match self {
            VariantsShape::Empty => VariantsShape::Empty,
            VariantsShape::Single { index: __self_0 } =>
                VariantsShape::Single {
                    index: ::core::clone::Clone::clone(__self_0),
                },
            VariantsShape::Multiple {
                tag: __self_0,
                tag_encoding: __self_1,
                tag_field: __self_2,
                variants: __self_3 } =>
                VariantsShape::Multiple {
                    tag: ::core::clone::Clone::clone(__self_0),
                    tag_encoding: ::core::clone::Clone::clone(__self_1),
                    tag_field: ::core::clone::Clone::clone(__self_2),
                    variants: ::core::clone::Clone::clone(__self_3),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for VariantsShape {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            VariantsShape::Empty =>
                ::core::fmt::Formatter::write_str(f, "Empty"),
            VariantsShape::Single { index: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Single", "index", &__self_0),
            VariantsShape::Multiple {
                tag: __self_0,
                tag_encoding: __self_1,
                tag_field: __self_2,
                variants: __self_3 } =>
                ::core::fmt::Formatter::debug_struct_field4_finish(f,
                    "Multiple", "tag", __self_0, "tag_encoding", __self_1,
                    "tag_field", __self_2, "variants", &__self_3),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for VariantsShape { }
#[automatically_derived]
impl ::core::cmp::PartialEq for VariantsShape {
    #[inline]
    fn eq(&self, other: &VariantsShape) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (VariantsShape::Single { index: __self_0 },
                    VariantsShape::Single { index: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                (VariantsShape::Multiple {
                    tag: __self_0,
                    tag_encoding: __self_1,
                    tag_field: __self_2,
                    variants: __self_3 }, VariantsShape::Multiple {
                    tag: __arg1_0,
                    tag_encoding: __arg1_1,
                    tag_field: __arg1_2,
                    variants: __arg1_3 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                            __self_2 == __arg1_2 && __self_3 == __arg1_3,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantsShape {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<VariantIdx>;
        let _: ::core::cmp::AssertParamIsEq<Scalar>;
        let _: ::core::cmp::AssertParamIsEq<TagEncoding>;
        let _: ::core::cmp::AssertParamIsEq<usize>;
        let _: ::core::cmp::AssertParamIsEq<Vec<VariantFields>>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for VariantsShape {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            VariantsShape::Single { index: __self_0 } =>
                ::core::hash::Hash::hash(__self_0, state),
            VariantsShape::Multiple {
                tag: __self_0,
                tag_encoding: __self_1,
                tag_field: __self_2,
                variants: __self_3 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state);
                ::core::hash::Hash::hash(__self_2, state);
                ::core::hash::Hash::hash(__self_3, state)
            }
            _ => {}
        }
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for VariantsShape {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    VariantsShape::Empty =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "VariantsShape", 0u32, "Empty"),
                    VariantsShape::Single { ref index } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "VariantsShape", 1u32, "Single", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "index", index)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    VariantsShape::Multiple {
                        ref tag, ref tag_encoding, ref tag_field, ref variants } =>
                        {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "VariantsShape", 2u32, "Multiple", 0 + 1 + 1 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "tag", tag)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "tag_encoding", tag_encoding)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "tag_field", tag_field)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "variants", variants)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
318pub enum VariantsShape {
319    /// A type with no valid variants. Must be uninhabited.
320    Empty,
321
322    /// Single enum variants, structs/tuples, unions, and all non-ADTs.
323    Single { index: VariantIdx },
324
325    /// Enum-likes with more than one inhabited variant: each variant comes with
326    /// a *discriminant* (usually the same as the variant index but the user can
327    /// assign explicit discriminant values). That discriminant is encoded
328    /// as a *tag* on the machine. The layout of each variant is
329    /// a struct, and they all have space reserved for the tag.
330    /// For enums, the tag is the sole field of the layout.
331    Multiple {
332        tag: Scalar,
333        tag_encoding: TagEncoding,
334        tag_field: usize,
335        variants: Vec<VariantFields>,
336    },
337}
338
339#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantFields {
    #[inline]
    fn clone(&self) -> VariantFields {
        VariantFields { offsets: ::core::clone::Clone::clone(&self.offsets) }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for VariantFields {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "VariantFields",
            "offsets", &&self.offsets)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for VariantFields { }
#[automatically_derived]
impl ::core::cmp::PartialEq for VariantFields {
    #[inline]
    fn eq(&self, other: &VariantFields) -> bool {
        self.offsets == other.offsets
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantFields {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Vec<Size>>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for VariantFields {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.offsets, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for VariantFields {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "VariantFields", false as usize + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "offsets", &self.offsets)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
340pub struct VariantFields {
341    /// Offsets for the first byte of each field,
342    /// ordered to match the source definition order.
343    /// I.e.: It follows the same order as [super::ty::VariantDef::fields()].
344    /// This vector does not go in increasing order.
345    pub offsets: Vec<Size>,
346}
347
348impl VariantFields {
349    pub fn fields_by_offset_order(&self) -> Vec<FieldIdx> {
350        let mut indices = (0..self.offsets.len()).collect::<Vec<_>>();
351        indices.sort_by_key(|idx| self.offsets[*idx]);
352        indices
353    }
354}
355
356#[derive(#[automatically_derived]
impl ::core::clone::Clone for TagEncoding {
    #[inline]
    fn clone(&self) -> TagEncoding {
        match self {
            TagEncoding::Direct => TagEncoding::Direct,
            TagEncoding::Niche {
                untagged_variant: __self_0,
                niche_variants: __self_1,
                niche_start: __self_2 } =>
                TagEncoding::Niche {
                    untagged_variant: ::core::clone::Clone::clone(__self_0),
                    niche_variants: ::core::clone::Clone::clone(__self_1),
                    niche_start: ::core::clone::Clone::clone(__self_2),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TagEncoding {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TagEncoding::Direct =>
                ::core::fmt::Formatter::write_str(f, "Direct"),
            TagEncoding::Niche {
                untagged_variant: __self_0,
                niche_variants: __self_1,
                niche_start: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "Niche",
                    "untagged_variant", __self_0, "niche_variants", __self_1,
                    "niche_start", &__self_2),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for TagEncoding { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TagEncoding {
    #[inline]
    fn eq(&self, other: &TagEncoding) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (TagEncoding::Niche {
                    untagged_variant: __self_0,
                    niche_variants: __self_1,
                    niche_start: __self_2 }, TagEncoding::Niche {
                    untagged_variant: __arg1_0,
                    niche_variants: __arg1_1,
                    niche_start: __arg1_2 }) =>
                    __self_2 == __arg1_2 && __self_0 == __arg1_0 &&
                        __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TagEncoding {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<VariantIdx>;
        let _: ::core::cmp::AssertParamIsEq<RangeInclusive<VariantIdx>>;
        let _: ::core::cmp::AssertParamIsEq<u128>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for TagEncoding {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            TagEncoding::Niche {
                untagged_variant: __self_0,
                niche_variants: __self_1,
                niche_start: __self_2 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state);
                ::core::hash::Hash::hash(__self_2, state)
            }
            _ => {}
        }
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for TagEncoding {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    TagEncoding::Direct =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "TagEncoding", 0u32, "Direct"),
                    TagEncoding::Niche {
                        ref untagged_variant, ref niche_variants, ref niche_start }
                        => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "TagEncoding", 1u32, "Niche", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "untagged_variant", untagged_variant)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "niche_variants", niche_variants)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "niche_start", niche_start)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
357pub enum TagEncoding {
358    /// The tag directly stores the discriminant, but possibly with a smaller layout
359    /// (so converting the tag to the discriminant can require sign extension).
360    Direct,
361
362    /// Niche (values invalid for a type) encoding the discriminant:
363    /// Discriminant and variant index coincide.
364    /// The variant `untagged_variant` contains a niche at an arbitrary
365    /// offset (field `tag_field` of the enum), which for a variant with
366    /// discriminant `d` is set to
367    /// `(d - niche_variants.start).wrapping_add(niche_start)`.
368    ///
369    /// For example, `Option<(usize, &T)>`  is represented such that
370    /// `None` has a null pointer for the second tuple field, and
371    /// `Some` is the identity function (with a non-null reference).
372    Niche {
373        untagged_variant: VariantIdx,
374        niche_variants: RangeInclusive<VariantIdx>,
375        niche_start: u128,
376    },
377}
378
379/// The number of scalable vectors in a [`ValueRepr::ScalableVector`].
380#[derive(#[automatically_derived]
impl ::core::clone::Clone for NumScalableVectors {
    #[inline]
    fn clone(&self) -> NumScalableVectors {
        NumScalableVectors(::core::clone::Clone::clone(&self.0))
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for NumScalableVectors {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f,
            "NumScalableVectors", &&self.0)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for NumScalableVectors { }
#[automatically_derived]
impl ::core::cmp::PartialEq for NumScalableVectors {
    #[inline]
    fn eq(&self, other: &NumScalableVectors) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NumScalableVectors {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u8>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for NumScalableVectors {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for NumScalableVectors {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "NumScalableVectors", &self.0)
            }
        }
    };Serialize)]
381pub struct NumScalableVectors(pub(crate) u8);
382
383/// A hint for how backends should represent values of this type.
384///
385/// Distinguishes between types representable as scalars, pairs of scalars,
386/// SIMD vectors, or aggregates.
387#[derive(#[automatically_derived]
impl ::core::clone::Clone for ValueRepr {
    #[inline]
    fn clone(&self) -> ValueRepr {
        match self {
            ValueRepr::Scalar(__self_0) =>
                ValueRepr::Scalar(::core::clone::Clone::clone(__self_0)),
            ValueRepr::ScalarPair {
                a: __self_0, b: __self_1, b_offset: __self_2 } =>
                ValueRepr::ScalarPair {
                    a: ::core::clone::Clone::clone(__self_0),
                    b: ::core::clone::Clone::clone(__self_1),
                    b_offset: ::core::clone::Clone::clone(__self_2),
                },
            ValueRepr::Vector { element: __self_0, count: __self_1 } =>
                ValueRepr::Vector {
                    element: ::core::clone::Clone::clone(__self_0),
                    count: ::core::clone::Clone::clone(__self_1),
                },
            ValueRepr::ScalableVector {
                element: __self_0,
                count: __self_1,
                number_of_vectors: __self_2 } =>
                ValueRepr::ScalableVector {
                    element: ::core::clone::Clone::clone(__self_0),
                    count: ::core::clone::Clone::clone(__self_1),
                    number_of_vectors: ::core::clone::Clone::clone(__self_2),
                },
            ValueRepr::Aggregate { sized: __self_0 } =>
                ValueRepr::Aggregate {
                    sized: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ValueRepr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ValueRepr::Scalar(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Scalar",
                    &__self_0),
            ValueRepr::ScalarPair {
                a: __self_0, b: __self_1, b_offset: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "ScalarPair", "a", __self_0, "b", __self_1, "b_offset",
                    &__self_2),
            ValueRepr::Vector { element: __self_0, count: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Vector", "element", __self_0, "count", &__self_1),
            ValueRepr::ScalableVector {
                element: __self_0,
                count: __self_1,
                number_of_vectors: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "ScalableVector", "element", __self_0, "count", __self_1,
                    "number_of_vectors", &__self_2),
            ValueRepr::Aggregate { sized: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Aggregate", "sized", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ValueRepr { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ValueRepr {
    #[inline]
    fn eq(&self, other: &ValueRepr) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ValueRepr::Scalar(__self_0), ValueRepr::Scalar(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ValueRepr::ScalarPair {
                    a: __self_0, b: __self_1, b_offset: __self_2 },
                    ValueRepr::ScalarPair {
                    a: __arg1_0, b: __arg1_1, b_offset: __arg1_2 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (ValueRepr::Vector { element: __self_0, count: __self_1 },
                    ValueRepr::Vector { element: __arg1_0, count: __arg1_1 }) =>
                    __self_1 == __arg1_1 && __self_0 == __arg1_0,
                (ValueRepr::ScalableVector {
                    element: __self_0,
                    count: __self_1,
                    number_of_vectors: __self_2 }, ValueRepr::ScalableVector {
                    element: __arg1_0,
                    count: __arg1_1,
                    number_of_vectors: __arg1_2 }) =>
                    __self_1 == __arg1_1 && __self_0 == __arg1_0 &&
                        __self_2 == __arg1_2,
                (ValueRepr::Aggregate { sized: __self_0 },
                    ValueRepr::Aggregate { sized: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ValueRepr {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Scalar>;
        let _: ::core::cmp::AssertParamIsEq<Size>;
        let _: ::core::cmp::AssertParamIsEq<u64>;
        let _: ::core::cmp::AssertParamIsEq<NumScalableVectors>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for ValueRepr {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            ValueRepr::Scalar(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            ValueRepr::ScalarPair {
                a: __self_0, b: __self_1, b_offset: __self_2 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state);
                ::core::hash::Hash::hash(__self_2, state)
            }
            ValueRepr::Vector { element: __self_0, count: __self_1 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            ValueRepr::ScalableVector {
                element: __self_0,
                count: __self_1,
                number_of_vectors: __self_2 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state);
                ::core::hash::Hash::hash(__self_2, state)
            }
            ValueRepr::Aggregate { sized: __self_0 } =>
                ::core::hash::Hash::hash(__self_0, state),
        }
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ValueRepr {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ValueRepr::Scalar(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ValueRepr", 0u32, "Scalar", __field0),
                    ValueRepr::ScalarPair { ref a, ref b, ref b_offset } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ValueRepr", 1u32, "ScalarPair", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "a", a)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "b", b)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "b_offset", b_offset)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    ValueRepr::Vector { ref element, ref count } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ValueRepr", 2u32, "Vector", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "element", element)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "count", count)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    ValueRepr::ScalableVector {
                        ref element, ref count, ref number_of_vectors } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ValueRepr", 3u32, "ScalableVector", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "element", element)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "count", count)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "number_of_vectors", number_of_vectors)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    ValueRepr::Aggregate { ref sized } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ValueRepr", 4u32, "Aggregate", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "sized", sized)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
388pub enum ValueRepr {
389    Scalar(Scalar),
390    ScalarPair {
391        a: Scalar,
392        b: Scalar,
393        b_offset: Size,
394    },
395    /// A fixed-length SIMD vector.
396    Vector {
397        element: Scalar,
398        count: u64,
399    },
400    /// A scalable SIMD vector (e.g., ARM SVE).
401    ScalableVector {
402        element: Scalar,
403        count: u64,
404        number_of_vectors: NumScalableVectors,
405    },
406    /// The type is not representable as a scalar or vector (e.g., aggregates, unsized types).
407    Aggregate {
408        /// If true, the size is exact, otherwise it's only a lower bound.
409        sized: bool,
410    },
411}
412
413impl ValueRepr {
414    /// Returns `true` if the layout corresponds to an unsized type.
415    pub fn is_unsized(&self) -> bool {
416        match *self {
417            ValueRepr::Scalar(_)
418            | ValueRepr::ScalarPair { .. }
419            | ValueRepr::Vector { .. }
420            // FIXME(rustc_scalable_vector): Scalable vectors are `Sized` while the
421            // `sized_hierarchy` feature is not yet fully implemented. After `sized_hierarchy` is
422            // fully implemented, scalable vectors will remain `Sized`, they just won't be
423            // `const Sized` - whether `is_unsized` continues to return `false` at that point will
424            // need to be revisited and will depend on what `is_unsized` is used for.
425            | ValueRepr::ScalableVector { .. } => false,
426            ValueRepr::Aggregate { sized } => !sized,
427        }
428    }
429}
430
431/// Information about one scalar component of a Rust type.
432#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Scalar { }
#[automatically_derived]
impl ::core::clone::Clone for Scalar {
    #[inline]
    fn clone(&self) -> Scalar {
        let _: ::core::clone::AssertParamIsClone<Primitive>;
        let _: ::core::clone::AssertParamIsClone<WrappingRange>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Scalar { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Scalar { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Scalar {
    #[inline]
    fn eq(&self, other: &Scalar) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Scalar::Initialized { value: __self_0, valid_range: __self_1
                    }, Scalar::Initialized {
                    value: __arg1_0, valid_range: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Scalar::Union { value: __self_0 }, Scalar::Union {
                    value: __arg1_0 }) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Scalar {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Primitive>;
        let _: ::core::cmp::AssertParamIsEq<WrappingRange>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Scalar {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            Scalar::Initialized { value: __self_0, valid_range: __self_1 } =>
                {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            Scalar::Union { value: __self_0 } =>
                ::core::hash::Hash::hash(__self_0, state),
        }
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for Scalar {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Scalar::Initialized { value: __self_0, valid_range: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Initialized", "value", __self_0, "valid_range", &__self_1),
            Scalar::Union { value: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Union",
                    "value", &__self_0),
        }
    }
}Debug, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for Scalar {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    Scalar::Initialized { ref value, ref valid_range } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Scalar", 0u32, "Initialized", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "value", value)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "valid_range", valid_range)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Scalar::Union { ref value } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Scalar", 1u32, "Union", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "value", value)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
433pub enum Scalar {
434    Initialized {
435        /// The primitive type used to represent this value.
436        value: Primitive,
437        /// The range that represents valid values.
438        /// The range must be valid for the `primitive` size.
439        valid_range: WrappingRange,
440    },
441    Union {
442        /// Unions never have niches, so there is no `valid_range`.
443        /// The `Primitive` type is kept to inform the backend representation
444        /// and to compute the size of the scalar.
445        value: Primitive,
446    },
447}
448
449impl Scalar {
450    pub fn has_niche(&self, target: &MachineInfo) -> bool {
451        match self {
452            Scalar::Initialized { value, valid_range } => {
453                !valid_range.is_full(value.size(target)).unwrap()
454            }
455            Scalar::Union { .. } => false,
456        }
457    }
458}
459
460/// A primitive scalar type: integer, float, or pointer.
461#[derive(#[automatically_derived]
impl ::core::marker::Copy for Primitive { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Primitive { }
#[automatically_derived]
impl ::core::clone::Clone for Primitive {
    #[inline]
    fn clone(&self) -> Primitive {
        let _: ::core::clone::AssertParamIsClone<IntegerLength>;
        let _: ::core::clone::AssertParamIsClone<bool>;
        let _: ::core::clone::AssertParamIsClone<FloatLength>;
        let _: ::core::clone::AssertParamIsClone<AddressSpace>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Primitive { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Primitive {
    #[inline]
    fn eq(&self, other: &Primitive) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Primitive::Int { length: __self_0, signed: __self_1 },
                    Primitive::Int { length: __arg1_0, signed: __arg1_1 }) =>
                    __self_1 == __arg1_1 && __self_0 == __arg1_0,
                (Primitive::Float { length: __self_0 }, Primitive::Float {
                    length: __arg1_0 }) => __self_0 == __arg1_0,
                (Primitive::Pointer(__self_0), Primitive::Pointer(__arg1_0))
                    => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Primitive {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<IntegerLength>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<FloatLength>;
        let _: ::core::cmp::AssertParamIsEq<AddressSpace>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Primitive {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            Primitive::Int { length: __self_0, signed: __self_1 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            Primitive::Float { length: __self_0 } =>
                ::core::hash::Hash::hash(__self_0, state),
            Primitive::Pointer(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
        }
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for Primitive {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Primitive::Int { length: __self_0, signed: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Int",
                    "length", __self_0, "signed", &__self_1),
            Primitive::Float { length: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Float",
                    "length", &__self_0),
            Primitive::Pointer(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Pointer", &__self_0),
        }
    }
}Debug, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for Primitive {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    Primitive::Int { ref length, ref signed } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Primitive", 0u32, "Int", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "length", length)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "signed", signed)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Primitive::Float { ref length } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Primitive", 1u32, "Float", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "length", length)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Primitive::Pointer(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "Primitive", 2u32, "Pointer", __field0),
                }
            }
        }
    };Serialize)]
462pub enum Primitive {
463    /// An integer type with a given length and signedness.
464    ///
465    /// Signedness matters because some calling conventions require small integers
466    /// to be sign-extended or zero-extended when passed, and using the wrong
467    /// extension produces incorrect values in the callee.
468    Int { length: IntegerLength, signed: bool },
469    /// A floating-point type with a given length.
470    Float { length: FloatLength },
471    /// A pointer in the given address space.
472    Pointer(AddressSpace),
473}
474
475impl Primitive {
476    pub fn size(self, target: &MachineInfo) -> Size {
477        match self {
478            Primitive::Int { length, .. } => Size::from_bits(length.bits()),
479            Primitive::Float { length } => Size::from_bits(length.bits()),
480            Primitive::Pointer(_) => target.pointer_width,
481        }
482    }
483}
484
485/// Enum representing the existing integer lengths.
486#[derive(#[automatically_derived]
impl ::core::marker::Copy for IntegerLength { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for IntegerLength { }
#[automatically_derived]
impl ::core::clone::Clone for IntegerLength {
    #[inline]
    fn clone(&self) -> IntegerLength { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for IntegerLength { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IntegerLength {
    #[inline]
    fn eq(&self, other: &IntegerLength) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for IntegerLength { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for IntegerLength {
    #[inline]
    fn partial_cmp(&self, other: &IntegerLength)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for IntegerLength {
    #[inline]
    fn cmp(&self, other: &IntegerLength) -> ::core::cmp::Ordering {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for IntegerLength {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for IntegerLength {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                IntegerLength::I8 => "I8",
                IntegerLength::I16 => "I16",
                IntegerLength::I32 => "I32",
                IntegerLength::I64 => "I64",
                IntegerLength::I128 => "I128",
            })
    }
}Debug, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for IntegerLength {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    IntegerLength::I8 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntegerLength", 0u32, "I8"),
                    IntegerLength::I16 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntegerLength", 1u32, "I16"),
                    IntegerLength::I32 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntegerLength", 2u32, "I32"),
                    IntegerLength::I64 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntegerLength", 3u32, "I64"),
                    IntegerLength::I128 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntegerLength", 4u32, "I128"),
                }
            }
        }
    };Serialize)]
487pub enum IntegerLength {
488    I8,
489    I16,
490    I32,
491    I64,
492    I128,
493}
494
495/// Enum representing the existing float lengths.
496#[derive(#[automatically_derived]
impl ::core::marker::Copy for FloatLength { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FloatLength { }
#[automatically_derived]
impl ::core::clone::Clone for FloatLength {
    #[inline]
    fn clone(&self) -> FloatLength { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FloatLength { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FloatLength {
    #[inline]
    fn eq(&self, other: &FloatLength) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for FloatLength { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for FloatLength {
    #[inline]
    fn partial_cmp(&self, other: &FloatLength)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for FloatLength {
    #[inline]
    fn cmp(&self, other: &FloatLength) -> ::core::cmp::Ordering {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for FloatLength {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for FloatLength {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                FloatLength::F16 => "F16",
                FloatLength::F32 => "F32",
                FloatLength::F64 => "F64",
                FloatLength::F128 => "F128",
            })
    }
}Debug, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for FloatLength {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    FloatLength::F16 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "FloatLength", 0u32, "F16"),
                    FloatLength::F32 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "FloatLength", 1u32, "F32"),
                    FloatLength::F64 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "FloatLength", 2u32, "F64"),
                    FloatLength::F128 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "FloatLength", 3u32, "F128"),
                }
            }
        }
    };Serialize)]
497pub enum FloatLength {
498    F16,
499    F32,
500    F64,
501    F128,
502}
503
504impl IntegerLength {
505    pub fn bits(self) -> usize {
506        match self {
507            IntegerLength::I8 => 8,
508            IntegerLength::I16 => 16,
509            IntegerLength::I32 => 32,
510            IntegerLength::I64 => 64,
511            IntegerLength::I128 => 128,
512        }
513    }
514}
515
516impl FloatLength {
517    pub fn bits(self) -> usize {
518        match self {
519            FloatLength::F16 => 16,
520            FloatLength::F32 => 32,
521            FloatLength::F64 => 64,
522            FloatLength::F128 => 128,
523        }
524    }
525}
526
527/// An identifier that specifies the address space that some operation
528/// should operate on. Special address spaces have an effect on code generation,
529/// depending on the target and the address spaces it implements.
530#[derive(#[automatically_derived]
impl ::core::marker::Copy for AddressSpace { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AddressSpace { }
#[automatically_derived]
impl ::core::clone::Clone for AddressSpace {
    #[inline]
    fn clone(&self) -> AddressSpace {
        let _: ::core::clone::AssertParamIsClone<u32>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AddressSpace {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "AddressSpace",
            &&self.0)
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AddressSpace { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AddressSpace {
    #[inline]
    fn eq(&self, other: &AddressSpace) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AddressSpace {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u32>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for AddressSpace {
    #[inline]
    fn partial_cmp(&self, other: &AddressSpace)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for AddressSpace {
    #[inline]
    fn cmp(&self, other: &AddressSpace) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&self.0, &other.0)
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for AddressSpace {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for AddressSpace {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "AddressSpace", &self.0)
            }
        }
    };Serialize)]
531pub struct AddressSpace(pub u32);
532
533impl AddressSpace {
534    /// The default address space, corresponding to data space.
535    pub const DATA: Self = AddressSpace(0);
536}
537
538/// Inclusive wrap-around range of valid values (bitwise representation), that is, if
539/// start > end, it represents `start..=MAX`, followed by `0..=end`.
540///
541/// That is, for an i8 primitive, a range of `254..=2` means following
542/// sequence:
543///
544///    254 (-2), 255 (-1), 0, 1, 2
545#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for WrappingRange { }
#[automatically_derived]
impl ::core::clone::Clone for WrappingRange {
    #[inline]
    fn clone(&self) -> WrappingRange {
        let _: ::core::clone::AssertParamIsClone<u128>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for WrappingRange { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for WrappingRange { }
#[automatically_derived]
impl ::core::cmp::PartialEq for WrappingRange {
    #[inline]
    fn eq(&self, other: &WrappingRange) -> bool {
        self.start == other.start && self.end == other.end
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for WrappingRange {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u128>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for WrappingRange {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.start, state);
        ::core::hash::Hash::hash(&self.end, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for WrappingRange {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "WrappingRange", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "start", &self.start)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "end", &self.end)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
546pub struct WrappingRange {
547    pub start: u128,
548    pub end: u128,
549}
550
551impl WrappingRange {
552    /// Returns `true` if `size` completely fills the range.
553    #[inline]
554    pub fn is_full(&self, size: Size) -> Result<bool, Error> {
555        let Some(max_value) = size.unsigned_int_max() else {
556            return Err(Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Expected size <= 128 bits, but found {0} instead",
                    size.bits()))
        }))error!("Expected size <= 128 bits, but found {} instead", size.bits()));
557        };
558        if self.start <= max_value && self.end <= max_value {
559            Ok(self.start == (self.end.wrapping_add(1) & max_value))
560        } else {
561            Err(Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Range `{1:?}` out of bounds for size `{0}` bits.",
                    size.bits(), self))
        }))error!("Range `{self:?}` out of bounds for size `{}` bits.", size.bits()))
562        }
563    }
564
565    /// Returns `true` if `v` is contained in the range.
566    #[inline(always)]
567    pub fn contains(&self, v: u128) -> bool {
568        if self.wraps_around() {
569            self.start <= v || v <= self.end
570        } else {
571            self.start <= v && v <= self.end
572        }
573    }
574
575    /// Returns `true` if the range wraps around.
576    /// I.e., the range represents the union of `self.start..=MAX` and `0..=self.end`.
577    /// Returns `false` if this is a non-wrapping range, i.e.: `self.start..=self.end`.
578    #[inline]
579    pub fn wraps_around(&self) -> bool {
580        self.start > self.end
581    }
582}
583
584impl Debug for WrappingRange {
585    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
586        if self.start > self.end {
587            fmt.write_fmt(format_args!("(..={0}) | ({1}..)", self.end, self.start))write!(fmt, "(..={}) | ({}..)", self.end, self.start)?;
588        } else {
589            fmt.write_fmt(format_args!("{0}..={1}", self.start, self.end))write!(fmt, "{}..={}", self.start, self.end)?;
590        }
591        Ok(())
592    }
593}
594
595/// General language calling conventions.
596#[derive(#[automatically_derived]
impl ::core::marker::Copy for CallConvention { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CallConvention { }
#[automatically_derived]
impl ::core::clone::Clone for CallConvention {
    #[inline]
    fn clone(&self) -> CallConvention { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for CallConvention {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                CallConvention::C => "C",
                CallConvention::Rust => "Rust",
                CallConvention::Cold => "Cold",
                CallConvention::PreserveMost => "PreserveMost",
                CallConvention::PreserveAll => "PreserveAll",
                CallConvention::PreserveNone => "PreserveNone",
                CallConvention::Tail => "Tail",
                CallConvention::Custom => "Custom",
                CallConvention::Swift => "Swift",
                CallConvention::ArmAapcs => "ArmAapcs",
                CallConvention::CCmseNonSecureCall => "CCmseNonSecureCall",
                CallConvention::CCmseNonSecureEntry => "CCmseNonSecureEntry",
                CallConvention::Msp430Intr => "Msp430Intr",
                CallConvention::PtxKernel => "PtxKernel",
                CallConvention::GpuKernel => "GpuKernel",
                CallConvention::X86Fastcall => "X86Fastcall",
                CallConvention::X86Intr => "X86Intr",
                CallConvention::X86Stdcall => "X86Stdcall",
                CallConvention::X86ThisCall => "X86ThisCall",
                CallConvention::X86VectorCall => "X86VectorCall",
                CallConvention::X86_64SysV => "X86_64SysV",
                CallConvention::X86_64Win64 => "X86_64Win64",
                CallConvention::AvrInterrupt => "AvrInterrupt",
                CallConvention::AvrNonBlockingInterrupt =>
                    "AvrNonBlockingInterrupt",
                CallConvention::RiscvInterrupt => "RiscvInterrupt",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CallConvention { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CallConvention {
    #[inline]
    fn eq(&self, other: &CallConvention) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CallConvention { }Eq, #[automatically_derived]
impl ::core::hash::Hash for CallConvention {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for CallConvention {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    CallConvention::C =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 0u32, "C"),
                    CallConvention::Rust =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 1u32, "Rust"),
                    CallConvention::Cold =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 2u32, "Cold"),
                    CallConvention::PreserveMost =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 3u32, "PreserveMost"),
                    CallConvention::PreserveAll =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 4u32, "PreserveAll"),
                    CallConvention::PreserveNone =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 5u32, "PreserveNone"),
                    CallConvention::Tail =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 6u32, "Tail"),
                    CallConvention::Custom =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 7u32, "Custom"),
                    CallConvention::Swift =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 8u32, "Swift"),
                    CallConvention::ArmAapcs =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 9u32, "ArmAapcs"),
                    CallConvention::CCmseNonSecureCall =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 10u32, "CCmseNonSecureCall"),
                    CallConvention::CCmseNonSecureEntry =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 11u32, "CCmseNonSecureEntry"),
                    CallConvention::Msp430Intr =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 12u32, "Msp430Intr"),
                    CallConvention::PtxKernel =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 13u32, "PtxKernel"),
                    CallConvention::GpuKernel =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 14u32, "GpuKernel"),
                    CallConvention::X86Fastcall =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 15u32, "X86Fastcall"),
                    CallConvention::X86Intr =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 16u32, "X86Intr"),
                    CallConvention::X86Stdcall =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 17u32, "X86Stdcall"),
                    CallConvention::X86ThisCall =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 18u32, "X86ThisCall"),
                    CallConvention::X86VectorCall =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 19u32, "X86VectorCall"),
                    CallConvention::X86_64SysV =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 20u32, "X86_64SysV"),
                    CallConvention::X86_64Win64 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 21u32, "X86_64Win64"),
                    CallConvention::AvrInterrupt =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 22u32, "AvrInterrupt"),
                    CallConvention::AvrNonBlockingInterrupt =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 23u32, "AvrNonBlockingInterrupt"),
                    CallConvention::RiscvInterrupt =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "CallConvention", 24u32, "RiscvInterrupt"),
                }
            }
        }
    };Serialize)]
597pub enum CallConvention {
598    C,
599    Rust,
600
601    Cold,
602    PreserveMost,
603    PreserveAll,
604    PreserveNone,
605    Tail,
606
607    Custom,
608
609    Swift,
610
611    // Target-specific calling conventions.
612    ArmAapcs,
613    CCmseNonSecureCall,
614    CCmseNonSecureEntry,
615
616    Msp430Intr,
617
618    PtxKernel,
619
620    GpuKernel,
621
622    X86Fastcall,
623    X86Intr,
624    X86Stdcall,
625    X86ThisCall,
626    X86VectorCall,
627
628    X86_64SysV,
629    X86_64Win64,
630
631    AvrInterrupt,
632    AvrNonBlockingInterrupt,
633
634    RiscvInterrupt,
635}
636
637#[non_exhaustive]
638#[derive(#[automatically_derived]
impl ::core::marker::Copy for ReprFlags { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ReprFlags { }
#[automatically_derived]
impl ::core::clone::Clone for ReprFlags {
    #[inline]
    fn clone(&self) -> ReprFlags {
        let _: ::core::clone::AssertParamIsClone<bool>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ReprFlags { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ReprFlags {
    #[inline]
    fn eq(&self, other: &ReprFlags) -> bool {
        self.is_simd == other.is_simd && self.is_c == other.is_c &&
                self.is_transparent == other.is_transparent &&
            self.is_linear == other.is_linear
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ReprFlags {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for ReprFlags {
    #[inline]
    fn partial_cmp(&self, other: &ReprFlags)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for ReprFlags {
    #[inline]
    fn cmp(&self, other: &ReprFlags) -> ::core::cmp::Ordering {
        match ::core::cmp::Ord::cmp(&self.is_simd, &other.is_simd) {
            ::core::cmp::Ordering::Equal =>
                match ::core::cmp::Ord::cmp(&self.is_c, &other.is_c) {
                    ::core::cmp::Ordering::Equal =>
                        match ::core::cmp::Ord::cmp(&self.is_transparent,
                                &other.is_transparent) {
                            ::core::cmp::Ordering::Equal =>
                                ::core::cmp::Ord::cmp(&self.is_linear, &other.is_linear),
                            cmp => cmp,
                        },
                    cmp => cmp,
                },
            cmp => cmp,
        }
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for ReprFlags {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.is_simd, state);
        ::core::hash::Hash::hash(&self.is_c, state);
        ::core::hash::Hash::hash(&self.is_transparent, state);
        ::core::hash::Hash::hash(&self.is_linear, state)
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for ReprFlags {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "ReprFlags",
            "is_simd", &self.is_simd, "is_c", &self.is_c, "is_transparent",
            &self.is_transparent, "is_linear", &&self.is_linear)
    }
}Debug, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ReprFlags {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "ReprFlags", false as usize + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_simd", &self.is_simd)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_c", &self.is_c)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_transparent", &self.is_transparent)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_linear", &self.is_linear)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
639pub struct ReprFlags {
640    pub is_simd: bool,
641    pub is_c: bool,
642    pub is_transparent: bool,
643    pub is_linear: bool,
644}
645
646#[derive(#[automatically_derived]
impl ::core::marker::Copy for IntegerType { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for IntegerType { }
#[automatically_derived]
impl ::core::clone::Clone for IntegerType {
    #[inline]
    fn clone(&self) -> IntegerType {
        let _: ::core::clone::AssertParamIsClone<bool>;
        let _: ::core::clone::AssertParamIsClone<IntegerLength>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for IntegerType { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IntegerType {
    #[inline]
    fn eq(&self, other: &IntegerType) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (IntegerType::Pointer { is_signed: __self_0 },
                    IntegerType::Pointer { is_signed: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                (IntegerType::Fixed { length: __self_0, is_signed: __self_1 },
                    IntegerType::Fixed { length: __arg1_0, is_signed: __arg1_1
                    }) => __self_1 == __arg1_1 && __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for IntegerType {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<IntegerLength>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for IntegerType {
    #[inline]
    fn partial_cmp(&self, other: &IntegerType)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for IntegerType {
    #[inline]
    fn cmp(&self, other: &IntegerType) -> ::core::cmp::Ordering {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
            ::core::cmp::Ordering::Equal =>
                match (self, other) {
                    (IntegerType::Pointer { is_signed: __self_0 },
                        IntegerType::Pointer { is_signed: __arg1_0 }) =>
                        ::core::cmp::Ord::cmp(__self_0, __arg1_0),
                    (IntegerType::Fixed { length: __self_0, is_signed: __self_1
                        }, IntegerType::Fixed {
                        length: __arg1_0, is_signed: __arg1_1 }) =>
                        match ::core::cmp::Ord::cmp(__self_0, __arg1_0) {
                            ::core::cmp::Ordering::Equal =>
                                ::core::cmp::Ord::cmp(__self_1, __arg1_1),
                            cmp => cmp,
                        },
                    _ => unsafe { ::core::intrinsics::unreachable() }
                },
            cmp => cmp,
        }
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for IntegerType {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            IntegerType::Pointer { is_signed: __self_0 } =>
                ::core::hash::Hash::hash(__self_0, state),
            IntegerType::Fixed { length: __self_0, is_signed: __self_1 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
        }
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for IntegerType {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            IntegerType::Pointer { is_signed: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Pointer", "is_signed", &__self_0),
            IntegerType::Fixed { length: __self_0, is_signed: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Fixed",
                    "length", __self_0, "is_signed", &__self_1),
        }
    }
}Debug, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for IntegerType {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    IntegerType::Pointer { ref is_signed } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "IntegerType", 0u32, "Pointer", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "is_signed", is_signed)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    IntegerType::Fixed { ref length, ref is_signed } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "IntegerType", 1u32, "Fixed", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "length", length)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "is_signed", is_signed)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
647pub enum IntegerType {
648    /// Pointer-sized integer type, i.e. `isize` and `usize`.
649    Pointer {
650        /// Signedness. e.g. `true` for `isize`
651        is_signed: bool,
652    },
653    /// Fixed-sized integer type, e.g. `i8`, `u32`, `i128`.
654    Fixed {
655        /// Length of this integer type. e.g. `IntegerLength::I8` for `u8`.
656        length: IntegerLength,
657        /// Signedness. e.g. `false` for `u8`
658        is_signed: bool,
659    },
660}
661
662/// Representation options provided by the user
663#[non_exhaustive]
664#[derive(#[automatically_derived]
impl ::core::marker::Copy for ReprOptions { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ReprOptions { }
#[automatically_derived]
impl ::core::clone::Clone for ReprOptions {
    #[inline]
    fn clone(&self) -> ReprOptions {
        let _: ::core::clone::AssertParamIsClone<Option<IntegerType>>;
        let _: ::core::clone::AssertParamIsClone<Option<Align>>;
        let _: ::core::clone::AssertParamIsClone<Option<Align>>;
        let _: ::core::clone::AssertParamIsClone<ReprFlags>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ReprOptions { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ReprOptions {
    #[inline]
    fn eq(&self, other: &ReprOptions) -> bool {
        self.int == other.int && self.align == other.align &&
                self.pack == other.pack && self.flags == other.flags
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ReprOptions {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Option<IntegerType>>;
        let _: ::core::cmp::AssertParamIsEq<Option<Align>>;
        let _: ::core::cmp::AssertParamIsEq<Option<Align>>;
        let _: ::core::cmp::AssertParamIsEq<ReprFlags>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for ReprOptions {
    #[inline]
    fn partial_cmp(&self, other: &ReprOptions)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for ReprOptions {
    #[inline]
    fn cmp(&self, other: &ReprOptions) -> ::core::cmp::Ordering {
        match ::core::cmp::Ord::cmp(&self.int, &other.int) {
            ::core::cmp::Ordering::Equal =>
                match ::core::cmp::Ord::cmp(&self.align, &other.align) {
                    ::core::cmp::Ordering::Equal =>
                        match ::core::cmp::Ord::cmp(&self.pack, &other.pack) {
                            ::core::cmp::Ordering::Equal =>
                                ::core::cmp::Ord::cmp(&self.flags, &other.flags),
                            cmp => cmp,
                        },
                    cmp => cmp,
                },
            cmp => cmp,
        }
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for ReprOptions {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.int, state);
        ::core::hash::Hash::hash(&self.align, state);
        ::core::hash::Hash::hash(&self.pack, state);
        ::core::hash::Hash::hash(&self.flags, state)
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for ReprOptions {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "ReprOptions",
            "int", &self.int, "align", &self.align, "pack", &self.pack,
            "flags", &&self.flags)
    }
}Debug, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
    {
        #[allow(unused_extern_crates, clippy :: useless_attribute)]
        extern crate serde as _serde;
        ;
        #[automatically_derived]
        impl _serde::Serialize for ReprOptions {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_struct(__serializer,
                            "ReprOptions", false as usize + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "int", &self.int)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "align", &self.align)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "pack", &self.pack)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "flags", &self.flags)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
665pub struct ReprOptions {
666    pub int: Option<IntegerType>,
667    pub align: Option<Align>,
668    pub pack: Option<Align>,
669    pub flags: ReprFlags,
670}