Skip to main content

rustc_public/
ty.rs

1use std::fmt::{self, Debug, Display, Formatter};
2use std::ops::Range;
3
4use serde::Serialize;
5
6use super::abi::ReprOptions;
7use super::mir::{Body, Mutability, Safety};
8use super::{DefId, Error, Symbol, with};
9use crate::abi::{FnAbi, Layout};
10use crate::crate_def::{CrateDef, CrateDefType};
11use crate::mir::alloc::{AllocId, read_target_int, read_target_uint};
12use crate::mir::mono::{Instance, StaticDef};
13use crate::target::MachineInfo;
14use crate::{AssocItems, Filename, IndexedVal, Opaque, ThreadLocalIndex};
15
16#[derive(#[automatically_derived]
impl ::core::marker::Copy for Ty { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Ty {
    #[inline]
    fn clone(&self) -> Ty {
        let _: ::core::clone::AssertParamIsClone<usize>;
        let _: ::core::clone::AssertParamIsClone<ThreadLocalIndex>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::Eq for Ty {
    #[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::cmp::PartialEq for Ty {
    #[inline]
    fn eq(&self, other: &Ty) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for Ty {
    #[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)]
17pub struct Ty(usize, ThreadLocalIndex);
18
19impl Debug for Ty {
20    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
21        f.debug_struct("Ty").field("id", &self.0).field("kind", &self.kind()).finish()
22    }
23}
24
25/// Constructors for `Ty`.
26impl Ty {
27    /// Create a new type from a given kind.
28    pub fn from_rigid_kind(kind: RigidTy) -> Ty {
29        with(|cx| cx.new_rigid_ty(kind))
30    }
31
32    /// Create a new array type.
33    pub fn try_new_array(elem_ty: Ty, size: u64) -> Result<Ty, Error> {
34        Ok(Ty::from_rigid_kind(RigidTy::Array(elem_ty, TyConst::try_from_target_usize(size)?)))
35    }
36
37    /// Create a new array type from Const length.
38    pub fn new_array_with_const_len(elem_ty: Ty, len: TyConst) -> Ty {
39        Ty::from_rigid_kind(RigidTy::Array(elem_ty, len))
40    }
41
42    /// Create a new pointer type.
43    pub fn new_ptr(pointee_ty: Ty, mutability: Mutability) -> Ty {
44        Ty::from_rigid_kind(RigidTy::RawPtr(pointee_ty, mutability))
45    }
46
47    /// Create a new reference type.
48    pub fn new_ref(reg: Region, pointee_ty: Ty, mutability: Mutability) -> Ty {
49        Ty::from_rigid_kind(RigidTy::Ref(reg, pointee_ty, mutability))
50    }
51
52    /// Create a new pointer type.
53    pub fn new_tuple(tys: &[Ty]) -> Ty {
54        Ty::from_rigid_kind(RigidTy::Tuple(Vec::from(tys)))
55    }
56
57    /// Create a new closure type.
58    pub fn new_closure(def: ClosureDef, args: GenericArgs) -> Ty {
59        Ty::from_rigid_kind(RigidTy::Closure(def, args))
60    }
61
62    /// Create a new coroutine type.
63    pub fn new_coroutine(def: CoroutineDef, args: GenericArgs) -> Ty {
64        Ty::from_rigid_kind(RigidTy::Coroutine(def, args))
65    }
66
67    /// Create a new closure type.
68    pub fn new_coroutine_closure(def: CoroutineClosureDef, args: GenericArgs) -> Ty {
69        Ty::from_rigid_kind(RigidTy::CoroutineClosure(def, args))
70    }
71
72    /// Create a new box type that represents `Box<T>`, for the given inner type `T`.
73    pub fn new_box(inner_ty: Ty) -> Ty {
74        with(|cx| cx.new_box_ty(inner_ty))
75    }
76
77    /// Create a type representing `usize`.
78    pub fn usize_ty() -> Ty {
79        Ty::from_rigid_kind(RigidTy::Uint(UintTy::Usize))
80    }
81
82    /// Create a type representing `bool`.
83    pub fn bool_ty() -> Ty {
84        Ty::from_rigid_kind(RigidTy::Bool)
85    }
86
87    /// Create a type representing a signed integer.
88    pub fn signed_ty(inner: IntTy) -> Ty {
89        Ty::from_rigid_kind(RigidTy::Int(inner))
90    }
91
92    /// Create a type representing an unsigned integer.
93    pub fn unsigned_ty(inner: UintTy) -> Ty {
94        Ty::from_rigid_kind(RigidTy::Uint(inner))
95    }
96
97    /// Get a type layout.
98    pub fn layout(self) -> Result<Layout, Error> {
99        with(|cx| cx.ty_layout(self))
100    }
101}
102
103impl Ty {
104    pub fn kind(&self) -> TyKind {
105        with(|context| context.ty_kind(*self))
106    }
107}
108
109/// Represents a pattern in the type system
110#[derive(#[automatically_derived]
impl ::core::clone::Clone for Pattern {
    #[inline]
    fn clone(&self) -> Pattern {
        match self {
            Pattern::Range {
                start: __self_0, end: __self_1, include_end: __self_2 } =>
                Pattern::Range {
                    start: ::core::clone::Clone::clone(__self_0),
                    end: ::core::clone::Clone::clone(__self_1),
                    include_end: ::core::clone::Clone::clone(__self_2),
                },
            Pattern::NotNull => Pattern::NotNull,
            Pattern::Or(__self_0) =>
                Pattern::Or(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Pattern {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Pattern::Range {
                start: __self_0, end: __self_1, include_end: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "Range",
                    "start", __self_0, "end", __self_1, "include_end",
                    &__self_2),
            Pattern::NotNull =>
                ::core::fmt::Formatter::write_str(f, "NotNull"),
            Pattern::Or(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Or",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Pattern {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TyConst>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<Vec<Pattern>>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for Pattern {
    #[inline]
    fn eq(&self, other: &Pattern) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Pattern::Range {
                    start: __self_0, end: __self_1, include_end: __self_2 },
                    Pattern::Range {
                    start: __arg1_0, end: __arg1_1, include_end: __arg1_2 }) =>
                    __self_2 == __arg1_2 && __self_0 == __arg1_0 &&
                        __self_1 == __arg1_1,
                (Pattern::Or(__self_0), Pattern::Or(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[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 Pattern {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    Pattern::Range { ref start, ref end, ref include_end } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Pattern", 0u32, "Range", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "start", start)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "end", end)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "include_end", include_end)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Pattern::NotNull =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Pattern", 1u32, "NotNull"),
                    Pattern::Or(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "Pattern", 2u32, "Or", __field0),
                }
            }
        }
    };Serialize)]
111pub enum Pattern {
112    Range { start: TyConst, end: TyConst, include_end: bool },
113    NotNull,
114    Or(Vec<Pattern>),
115}
116
117/// Represents a constant in the type system
118#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyConst {
    #[inline]
    fn clone(&self) -> TyConst {
        TyConst {
            kind: ::core::clone::Clone::clone(&self.kind),
            id: ::core::clone::Clone::clone(&self.id),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TyConst {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "TyConst",
            "kind", &self.kind, "id", &&self.id)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for TyConst {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TyConstKind>;
        let _: ::core::cmp::AssertParamIsEq<TyConstId>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for TyConst {
    #[inline]
    fn eq(&self, other: &TyConst) -> bool {
        self.kind == other.kind && self.id == other.id
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for TyConst {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.kind, state);
        ::core::hash::Hash::hash(&self.id, 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 TyConst {
            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,
                            "TyConst", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "id", &self.id)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
119pub struct TyConst {
120    pub(crate) kind: TyConstKind,
121    pub id: TyConstId,
122}
123
124impl TyConst {
125    pub fn new(kind: TyConstKind, id: TyConstId) -> TyConst {
126        Self { kind, id }
127    }
128
129    /// Retrieve the constant kind.
130    pub fn kind(&self) -> &TyConstKind {
131        &self.kind
132    }
133
134    /// Creates an interned usize constant.
135    pub fn try_from_target_usize(val: u64) -> Result<Self, Error> {
136        with(|cx| cx.try_new_ty_const_uint(val.into(), UintTy::Usize))
137    }
138
139    /// Try to evaluate to a target `usize`.
140    pub fn eval_target_usize(&self) -> Result<u64, Error> {
141        with(|cx| cx.eval_target_usize_ty(self))
142    }
143}
144
145#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyConstKind {
    #[inline]
    fn clone(&self) -> TyConstKind {
        match self {
            TyConstKind::Param(__self_0) =>
                TyConstKind::Param(::core::clone::Clone::clone(__self_0)),
            TyConstKind::Bound(__self_0, __self_1) =>
                TyConstKind::Bound(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyConstKind::Unevaluated(__self_0, __self_1) =>
                TyConstKind::Unevaluated(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyConstKind::Value(__self_0, __self_1) =>
                TyConstKind::Value(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyConstKind::ZSTValue(__self_0) =>
                TyConstKind::ZSTValue(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TyConstKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TyConstKind::Param(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Param",
                    &__self_0),
            TyConstKind::Bound(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Bound",
                    __self_0, &__self_1),
            TyConstKind::Unevaluated(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Unevaluated", __self_0, &__self_1),
            TyConstKind::Value(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Value",
                    __self_0, &__self_1),
            TyConstKind::ZSTValue(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ZSTValue", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for TyConstKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ParamConst>;
        let _: ::core::cmp::AssertParamIsEq<DebruijnIndex>;
        let _: ::core::cmp::AssertParamIsEq<BoundVar>;
        let _: ::core::cmp::AssertParamIsEq<ConstDef>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgs>;
        let _: ::core::cmp::AssertParamIsEq<Ty>;
        let _: ::core::cmp::AssertParamIsEq<Allocation>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for TyConstKind {
    #[inline]
    fn eq(&self, other: &TyConstKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (TyConstKind::Param(__self_0), TyConstKind::Param(__arg1_0))
                    => __self_0 == __arg1_0,
                (TyConstKind::Bound(__self_0, __self_1),
                    TyConstKind::Bound(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (TyConstKind::Unevaluated(__self_0, __self_1),
                    TyConstKind::Unevaluated(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (TyConstKind::Value(__self_0, __self_1),
                    TyConstKind::Value(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (TyConstKind::ZSTValue(__self_0),
                    TyConstKind::ZSTValue(__arg1_0)) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for TyConstKind {
    #[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 {
            TyConstKind::Param(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            TyConstKind::Bound(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            TyConstKind::Unevaluated(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            TyConstKind::Value(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            TyConstKind::ZSTValue(__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 TyConstKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    TyConstKind::Param(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "TyConstKind", 0u32, "Param", __field0),
                    TyConstKind::Bound(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "TyConstKind", 1u32, "Bound", 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)
                    }
                    TyConstKind::Unevaluated(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "TyConstKind", 2u32, "Unevaluated", 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)
                    }
                    TyConstKind::Value(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "TyConstKind", 3u32, "Value", 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)
                    }
                    TyConstKind::ZSTValue(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "TyConstKind", 4u32, "ZSTValue", __field0),
                }
            }
        }
    };Serialize)]
146pub enum TyConstKind {
147    Param(ParamConst),
148    Bound(DebruijnIndex, BoundVar),
149    Unevaluated(ConstDef, GenericArgs),
150
151    // FIXME: These should be a valtree
152    Value(Ty, Allocation),
153    ZSTValue(Ty),
154}
155
156#[derive(#[automatically_derived]
impl ::core::marker::Copy for TyConstId { }Copy, #[automatically_derived]
impl ::core::clone::Clone for TyConstId {
    #[inline]
    fn clone(&self) -> TyConstId {
        let _: ::core::clone::AssertParamIsClone<usize>;
        let _: ::core::clone::AssertParamIsClone<ThreadLocalIndex>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TyConstId {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field2_finish(f, "TyConstId",
            &self.0, &&self.1)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for TyConstId {
    #[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::cmp::PartialEq for TyConstId {
    #[inline]
    fn eq(&self, other: &TyConstId) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for TyConstId {
    #[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)]
157pub struct TyConstId(usize, ThreadLocalIndex);
158
159/// Represents a constant in MIR
160#[derive(#[automatically_derived]
impl ::core::clone::Clone for MirConst {
    #[inline]
    fn clone(&self) -> MirConst {
        MirConst {
            kind: ::core::clone::Clone::clone(&self.kind),
            ty: ::core::clone::Clone::clone(&self.ty),
            id: ::core::clone::Clone::clone(&self.id),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for MirConst {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "MirConst",
            "kind", &self.kind, "ty", &self.ty, "id", &&self.id)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for MirConst {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ConstantKind>;
        let _: ::core::cmp::AssertParamIsEq<Ty>;
        let _: ::core::cmp::AssertParamIsEq<MirConstId>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for MirConst {
    #[inline]
    fn eq(&self, other: &MirConst) -> bool {
        self.kind == other.kind && self.ty == other.ty && self.id == other.id
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for MirConst {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.kind, state);
        ::core::hash::Hash::hash(&self.ty, state);
        ::core::hash::Hash::hash(&self.id, 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 MirConst {
            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,
                            "MirConst", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ty", &self.ty)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "id", &self.id)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
161pub struct MirConst {
162    /// The constant kind.
163    pub(crate) kind: ConstantKind,
164    /// The constant type.
165    pub(crate) ty: Ty,
166    /// Used for internal tracking of the internal constant.
167    pub id: MirConstId,
168}
169
170impl MirConst {
171    /// Build a constant. Note that this should only be used by the compiler.
172    pub fn new(kind: ConstantKind, ty: Ty, id: MirConstId) -> MirConst {
173        MirConst { kind, ty, id }
174    }
175
176    /// Retrieve the constant kind.
177    pub fn kind(&self) -> &ConstantKind {
178        &self.kind
179    }
180
181    /// Get the constant type.
182    pub fn ty(&self) -> Ty {
183        self.ty
184    }
185
186    /// Try to evaluate to a target `usize`.
187    pub fn eval_target_usize(&self) -> Result<u64, Error> {
188        with(|cx| cx.eval_target_usize(self))
189    }
190
191    /// Create a constant that represents a new zero-sized constant of type T.
192    /// Fails if the type is not a ZST or if it doesn't have a known size.
193    pub fn try_new_zero_sized(ty: Ty) -> Result<MirConst, Error> {
194        with(|cx| cx.try_new_const_zst(ty))
195    }
196
197    /// Build a new constant that represents the given string.
198    ///
199    /// Note that there is no guarantee today about duplication of the same constant.
200    /// I.e.: Calling this function multiple times with the same argument may or may not return
201    /// the same allocation.
202    pub fn from_str(value: &str) -> MirConst {
203        with(|cx| cx.new_const_str(value))
204    }
205
206    /// Build a new constant that represents the given boolean value.
207    pub fn from_bool(value: bool) -> MirConst {
208        with(|cx| cx.new_const_bool(value))
209    }
210
211    /// Build a new constant that represents the given unsigned integer.
212    pub fn try_from_uint(value: u128, uint_ty: UintTy) -> Result<MirConst, Error> {
213        with(|cx| cx.try_new_const_uint(value, uint_ty))
214    }
215}
216
217#[derive(#[automatically_derived]
impl ::core::clone::Clone for MirConstId {
    #[inline]
    fn clone(&self) -> MirConstId {
        let _: ::core::clone::AssertParamIsClone<usize>;
        let _: ::core::clone::AssertParamIsClone<ThreadLocalIndex>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MirConstId { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for MirConstId {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field2_finish(f, "MirConstId",
            &self.0, &&self.1)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for MirConstId {
    #[inline]
    fn eq(&self, other: &MirConstId) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MirConstId {
    #[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 MirConstId {
    #[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)]
218pub struct MirConstId(usize, ThreadLocalIndex);
219
220type Ident = Opaque;
221
222#[derive(#[automatically_derived]
impl ::core::clone::Clone for Region {
    #[inline]
    fn clone(&self) -> Region {
        Region { kind: ::core::clone::Clone::clone(&self.kind) }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Region {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "Region",
            "kind", &&self.kind)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Region {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<RegionKind>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for Region {
    #[inline]
    fn eq(&self, other: &Region) -> bool { self.kind == other.kind }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for Region {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.kind, 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 Region {
            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, "Region",
                            false as usize + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
223pub struct Region {
224    pub kind: RegionKind,
225}
226
227#[derive(#[automatically_derived]
impl ::core::clone::Clone for RegionKind {
    #[inline]
    fn clone(&self) -> RegionKind {
        match self {
            RegionKind::ReEarlyParam(__self_0) =>
                RegionKind::ReEarlyParam(::core::clone::Clone::clone(__self_0)),
            RegionKind::ReBound(__self_0, __self_1) =>
                RegionKind::ReBound(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RegionKind::ReStatic => RegionKind::ReStatic,
            RegionKind::RePlaceholder(__self_0) =>
                RegionKind::RePlaceholder(::core::clone::Clone::clone(__self_0)),
            RegionKind::ReErased => RegionKind::ReErased,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for RegionKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            RegionKind::ReEarlyParam(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ReEarlyParam", &__self_0),
            RegionKind::ReBound(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ReBound", __self_0, &__self_1),
            RegionKind::ReStatic =>
                ::core::fmt::Formatter::write_str(f, "ReStatic"),
            RegionKind::RePlaceholder(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "RePlaceholder", &__self_0),
            RegionKind::ReErased =>
                ::core::fmt::Formatter::write_str(f, "ReErased"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for RegionKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<EarlyParamRegion>;
        let _: ::core::cmp::AssertParamIsEq<DebruijnIndex>;
        let _: ::core::cmp::AssertParamIsEq<BoundRegion>;
        let _: ::core::cmp::AssertParamIsEq<Placeholder<BoundRegion>>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for RegionKind {
    #[inline]
    fn eq(&self, other: &RegionKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (RegionKind::ReEarlyParam(__self_0),
                    RegionKind::ReEarlyParam(__arg1_0)) => __self_0 == __arg1_0,
                (RegionKind::ReBound(__self_0, __self_1),
                    RegionKind::ReBound(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RegionKind::RePlaceholder(__self_0),
                    RegionKind::RePlaceholder(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for RegionKind {
    #[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 {
            RegionKind::ReEarlyParam(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            RegionKind::ReBound(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            RegionKind::RePlaceholder(__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 RegionKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    RegionKind::ReEarlyParam(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "RegionKind", 0u32, "ReEarlyParam", __field0),
                    RegionKind::ReBound(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RegionKind", 1u32, "ReBound", 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)
                    }
                    RegionKind::ReStatic =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "RegionKind", 2u32, "ReStatic"),
                    RegionKind::RePlaceholder(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "RegionKind", 3u32, "RePlaceholder", __field0),
                    RegionKind::ReErased =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "RegionKind", 4u32, "ReErased"),
                }
            }
        }
    };Serialize)]
228pub enum RegionKind {
229    ReEarlyParam(EarlyParamRegion),
230    ReBound(DebruijnIndex, BoundRegion),
231    ReStatic,
232    RePlaceholder(Placeholder<BoundRegion>),
233    ReErased,
234}
235
236pub(crate) type DebruijnIndex = u32;
237
238#[derive(#[automatically_derived]
impl ::core::clone::Clone for EarlyParamRegion {
    #[inline]
    fn clone(&self) -> EarlyParamRegion {
        EarlyParamRegion {
            index: ::core::clone::Clone::clone(&self.index),
            name: ::core::clone::Clone::clone(&self.name),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for EarlyParamRegion {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "EarlyParamRegion", "index", &self.index, "name", &&self.name)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for EarlyParamRegion {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u32>;
        let _: ::core::cmp::AssertParamIsEq<Symbol>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for EarlyParamRegion {
    #[inline]
    fn eq(&self, other: &EarlyParamRegion) -> bool {
        self.index == other.index && self.name == other.name
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for EarlyParamRegion {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.index, state);
        ::core::hash::Hash::hash(&self.name, 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 EarlyParamRegion {
            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,
                            "EarlyParamRegion", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "index", &self.index)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
239pub struct EarlyParamRegion {
240    pub index: u32,
241    pub name: Symbol,
242}
243
244pub(crate) type BoundVar = u32;
245
246#[derive(#[automatically_derived]
impl ::core::clone::Clone for BoundRegion {
    #[inline]
    fn clone(&self) -> BoundRegion {
        BoundRegion {
            var: ::core::clone::Clone::clone(&self.var),
            kind: ::core::clone::Clone::clone(&self.kind),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BoundRegion {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "BoundRegion",
            "var", &self.var, "kind", &&self.kind)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for BoundRegion {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<BoundVar>;
        let _: ::core::cmp::AssertParamIsEq<BoundRegionKind>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for BoundRegion {
    #[inline]
    fn eq(&self, other: &BoundRegion) -> bool {
        self.var == other.var && self.kind == other.kind
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for BoundRegion {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.var, state);
        ::core::hash::Hash::hash(&self.kind, 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 BoundRegion {
            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,
                            "BoundRegion", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "var", &self.var)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
247pub struct BoundRegion {
248    pub var: BoundVar,
249    pub kind: BoundRegionKind,
250}
251
252pub(crate) type UniverseIndex = u32;
253
254#[derive(#[automatically_derived]
impl<T: ::core::clone::Clone> ::core::clone::Clone for Placeholder<T> {
    #[inline]
    fn clone(&self) -> Placeholder<T> {
        Placeholder {
            universe: ::core::clone::Clone::clone(&self.universe),
            bound: ::core::clone::Clone::clone(&self.bound),
        }
    }
}Clone, #[automatically_derived]
impl<T: ::core::fmt::Debug> ::core::fmt::Debug for Placeholder<T> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Placeholder",
            "universe", &self.universe, "bound", &&self.bound)
    }
}Debug, #[automatically_derived]
impl<T: ::core::cmp::Eq> ::core::cmp::Eq for Placeholder<T> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<UniverseIndex>;
        let _: ::core::cmp::AssertParamIsEq<T>;
    }
}Eq, #[automatically_derived]
impl<T: ::core::cmp::PartialEq> ::core::cmp::PartialEq for Placeholder<T> {
    #[inline]
    fn eq(&self, other: &Placeholder<T>) -> bool {
        self.universe == other.universe && self.bound == other.bound
    }
}PartialEq, #[automatically_derived]
impl<T: ::core::hash::Hash> ::core::hash::Hash for Placeholder<T> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.universe, state);
        ::core::hash::Hash::hash(&self.bound, 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<T> _serde::Serialize for Placeholder<T> where
            T: _serde::Serialize {
            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,
                            "Placeholder", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "universe", &self.universe)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "bound", &self.bound)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
255pub struct Placeholder<T> {
256    pub universe: UniverseIndex,
257    pub bound: T,
258}
259
260#[derive(#[automatically_derived]
impl ::core::clone::Clone for Span {
    #[inline]
    fn clone(&self) -> Span {
        let _: ::core::clone::AssertParamIsClone<usize>;
        let _: ::core::clone::AssertParamIsClone<ThreadLocalIndex>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Span { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for Span {
    #[inline]
    fn eq(&self, other: &Span) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Span {
    #[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 Span {
    #[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)]
261pub struct Span(usize, ThreadLocalIndex);
262
263impl Debug for Span {
264    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
265        f.debug_struct("Span")
266            .field("id", &self.0)
267            .field("repr", &with(|cx| cx.span_to_string(*self)))
268            .finish()
269    }
270}
271
272impl Span {
273    /// Return filename for diagnostic purposes
274    pub fn get_filename(&self) -> Filename {
275        with(|c| c.get_filename(self))
276    }
277
278    /// Return lines that correspond to this `Span`
279    pub fn get_lines(&self) -> LineInfo {
280        with(|c| c.get_lines(self))
281    }
282
283    /// Return the span location to be printed in diagnostic messages.
284    ///
285    /// This may leak local file paths and should not be used to build artifacts that may be
286    /// distributed.
287    pub fn diagnostic(&self) -> String {
288        with(|c| c.span_to_string(*self))
289    }
290}
291
292#[derive(#[automatically_derived]
impl ::core::clone::Clone for LineInfo {
    #[inline]
    fn clone(&self) -> LineInfo {
        let _: ::core::clone::AssertParamIsClone<usize>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LineInfo { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for LineInfo {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "LineInfo",
            "start_line", &self.start_line, "start_col", &self.start_col,
            "end_line", &self.end_line, "end_col", &&self.end_col)
    }
}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 LineInfo {
            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,
                            "LineInfo", false as usize + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "start_line", &self.start_line)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "start_col", &self.start_col)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "end_line", &self.end_line)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "end_col", &self.end_col)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
293/// Information you get from `Span` in a struct form.
294/// Line and col start from 1.
295pub struct LineInfo {
296    pub start_line: usize,
297    pub start_col: usize,
298    pub end_line: usize,
299    pub end_col: usize,
300}
301
302impl LineInfo {
303    pub fn from(lines: (usize, usize, usize, usize)) -> Self {
304        LineInfo { start_line: lines.0, start_col: lines.1, end_line: lines.2, end_col: lines.3 }
305    }
306}
307
308#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyKind {
    #[inline]
    fn clone(&self) -> TyKind {
        match self {
            TyKind::RigidTy(__self_0) =>
                TyKind::RigidTy(::core::clone::Clone::clone(__self_0)),
            TyKind::Alias(__self_0, __self_1) =>
                TyKind::Alias(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::Param(__self_0) =>
                TyKind::Param(::core::clone::Clone::clone(__self_0)),
            TyKind::Bound(__self_0, __self_1) =>
                TyKind::Bound(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TyKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TyKind::RigidTy(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "RigidTy", &__self_0),
            TyKind::Alias(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Alias",
                    __self_0, &__self_1),
            TyKind::Param(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Param",
                    &__self_0),
            TyKind::Bound(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Bound",
                    __self_0, &__self_1),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for TyKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<RigidTy>;
        let _: ::core::cmp::AssertParamIsEq<AliasKind>;
        let _: ::core::cmp::AssertParamIsEq<AliasTy>;
        let _: ::core::cmp::AssertParamIsEq<ParamTy>;
        let _: ::core::cmp::AssertParamIsEq<usize>;
        let _: ::core::cmp::AssertParamIsEq<BoundTy>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for TyKind {
    #[inline]
    fn eq(&self, other: &TyKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (TyKind::RigidTy(__self_0), TyKind::RigidTy(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (TyKind::Alias(__self_0, __self_1),
                    TyKind::Alias(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (TyKind::Param(__self_0), TyKind::Param(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (TyKind::Bound(__self_0, __self_1),
                    TyKind::Bound(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[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 TyKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    TyKind::RigidTy(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "TyKind", 0u32, "RigidTy", __field0),
                    TyKind::Alias(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "TyKind", 1u32, "Alias", 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)
                    }
                    TyKind::Param(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "TyKind", 2u32, "Param", __field0),
                    TyKind::Bound(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "TyKind", 3u32, "Bound", 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)
                    }
                }
            }
        }
    };Serialize)]
309pub enum TyKind {
310    RigidTy(RigidTy),
311    Alias(AliasKind, AliasTy),
312    Param(ParamTy),
313    Bound(usize, BoundTy),
314}
315
316impl TyKind {
317    pub fn rigid(&self) -> Option<&RigidTy> {
318        if let TyKind::RigidTy(inner) = self { Some(inner) } else { None }
319    }
320
321    #[inline]
322    pub fn is_unit(&self) -> bool {
323        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Tuple(data)) if data.is_empty() => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Tuple(data)) if data.is_empty())
324    }
325
326    #[inline]
327    pub fn is_bool(&self) -> bool {
328        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Bool) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Bool))
329    }
330
331    #[inline]
332    pub fn is_char(&self) -> bool {
333        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Char) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Char))
334    }
335
336    #[inline]
337    pub fn is_trait(&self) -> bool {
338        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Dynamic(_, _)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Dynamic(_, _)))
339    }
340
341    #[inline]
342    pub fn is_enum(&self) -> bool {
343        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Adt(def, _)) if def.kind() == AdtKind::Enum =>
        true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Adt(def, _)) if def.kind() == AdtKind::Enum)
344    }
345
346    #[inline]
347    pub fn is_struct(&self) -> bool {
348        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Adt(def, _)) if def.kind() == AdtKind::Struct =>
        true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Adt(def, _)) if def.kind() == AdtKind::Struct)
349    }
350
351    #[inline]
352    pub fn is_union(&self) -> bool {
353        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Adt(def, _)) if def.kind() == AdtKind::Union =>
        true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Adt(def, _)) if def.kind() == AdtKind::Union)
354    }
355
356    #[inline]
357    pub fn is_adt(&self) -> bool {
358        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Adt(..)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Adt(..)))
359    }
360
361    #[inline]
362    pub fn is_ref(&self) -> bool {
363        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Ref(..)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Ref(..)))
364    }
365
366    #[inline]
367    pub fn is_fn(&self) -> bool {
368        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::FnDef(..)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::FnDef(..)))
369    }
370
371    #[inline]
372    pub fn is_fn_ptr(&self) -> bool {
373        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::FnPtr(..)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::FnPtr(..)))
374    }
375
376    #[inline]
377    pub fn is_primitive(&self) -> bool {
378        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Bool | RigidTy::Char | RigidTy::Int(_) |
        RigidTy::Uint(_) | RigidTy::Float(_)) => true,
    _ => false,
}matches!(
379            self,
380            TyKind::RigidTy(
381                RigidTy::Bool
382                    | RigidTy::Char
383                    | RigidTy::Int(_)
384                    | RigidTy::Uint(_)
385                    | RigidTy::Float(_)
386            )
387        )
388    }
389
390    #[inline]
391    pub fn is_float(&self) -> bool {
392        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Float(_)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Float(_)))
393    }
394
395    #[inline]
396    pub fn is_integral(&self) -> bool {
397        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Int(_) | RigidTy::Uint(_)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Int(_) | RigidTy::Uint(_)))
398    }
399
400    #[inline]
401    pub fn is_numeric(&self) -> bool {
402        self.is_integral() || self.is_float()
403    }
404
405    #[inline]
406    pub fn is_signed(&self) -> bool {
407        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Int(_)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Int(_)))
408    }
409
410    #[inline]
411    pub fn is_str(&self) -> bool {
412        *self == TyKind::RigidTy(RigidTy::Str)
413    }
414
415    #[inline]
416    pub fn is_cstr(&self) -> bool {
417        let TyKind::RigidTy(RigidTy::Adt(def, _)) = self else {
418            return false;
419        };
420        with(|cx| cx.adt_is_cstr(*def))
421    }
422
423    #[inline]
424    pub fn is_slice(&self) -> bool {
425        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Slice(_)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Slice(_)))
426    }
427
428    #[inline]
429    pub fn is_array(&self) -> bool {
430        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Array(..)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Array(..)))
431    }
432
433    #[inline]
434    pub fn is_mutable_ptr(&self) -> bool {
435        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::RawPtr(_, Mutability::Mut)) |
        TyKind::RigidTy(RigidTy::Ref(_, _, Mutability::Mut)) => true,
    _ => false,
}matches!(
436            self,
437            TyKind::RigidTy(RigidTy::RawPtr(_, Mutability::Mut))
438                | TyKind::RigidTy(RigidTy::Ref(_, _, Mutability::Mut))
439        )
440    }
441
442    #[inline]
443    pub fn is_raw_ptr(&self) -> bool {
444        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::RawPtr(..)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::RawPtr(..)))
445    }
446
447    /// Tests if this is any kind of primitive pointer type (reference, raw pointer, fn pointer).
448    #[inline]
449    pub fn is_any_ptr(&self) -> bool {
450        self.is_ref() || self.is_raw_ptr() || self.is_fn_ptr()
451    }
452
453    #[inline]
454    pub fn is_coroutine(&self) -> bool {
455        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Coroutine(..)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Coroutine(..)))
456    }
457
458    #[inline]
459    pub fn is_closure(&self) -> bool {
460        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Closure(..)) => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Closure(..)))
461    }
462
463    #[inline]
464    pub fn is_box(&self) -> bool {
465        match self {
466            TyKind::RigidTy(RigidTy::Adt(def, _)) => def.is_box(),
467            _ => false,
468        }
469    }
470
471    #[inline]
472    pub fn is_simd(&self) -> bool {
473        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::RigidTy(RigidTy::Adt(def, _)) if def.is_simd() => true,
    _ => false,
}matches!(self, TyKind::RigidTy(RigidTy::Adt(def, _)) if def.is_simd())
474    }
475
476    pub fn trait_principal(&self) -> Option<Binder<ExistentialTraitRef>> {
477        if let TyKind::RigidTy(RigidTy::Dynamic(predicates, _)) = self {
478            if let Some(Binder { value: ExistentialPredicate::Trait(trait_ref), bound_vars }) =
479                predicates.first()
480            {
481                Some(Binder { value: trait_ref.clone(), bound_vars: bound_vars.clone() })
482            } else {
483                None
484            }
485        } else {
486            None
487        }
488    }
489
490    /// Returns the type of `ty[i]` for builtin types.
491    pub fn builtin_index(&self) -> Option<Ty> {
492        match self.rigid()? {
493            RigidTy::Array(ty, _) | RigidTy::Slice(ty) => Some(*ty),
494            _ => None,
495        }
496    }
497
498    /// Returns the type and mutability of `*ty` for builtin types.
499    ///
500    /// The parameter `explicit` indicates if this is an *explicit* dereference.
501    /// Some types -- notably raw ptrs -- can only be dereferenced explicitly.
502    pub fn builtin_deref(&self, explicit: bool) -> Option<TypeAndMut> {
503        match self.rigid()? {
504            RigidTy::Adt(def, args) if def.is_box() => {
505                Some(TypeAndMut { ty: *args.0.first()?.ty()?, mutability: Mutability::Not })
506            }
507            RigidTy::Ref(_, ty, mutability) => {
508                Some(TypeAndMut { ty: *ty, mutability: *mutability })
509            }
510            RigidTy::RawPtr(ty, mutability) if explicit => {
511                Some(TypeAndMut { ty: *ty, mutability: *mutability })
512            }
513            _ => None,
514        }
515    }
516
517    /// Get the function signature for function like types (Fn, FnPtr, and Closure)
518    pub fn fn_sig(&self) -> Option<PolyFnSig> {
519        match self {
520            TyKind::RigidTy(RigidTy::FnDef(def, args)) => Some(with(|cx| cx.fn_sig(*def, args))),
521            TyKind::RigidTy(RigidTy::FnPtr(sig)) => Some(sig.clone()),
522            TyKind::RigidTy(RigidTy::Closure(_def, args)) => Some(with(|cx| cx.closure_sig(args))),
523            _ => None,
524        }
525    }
526
527    /// Get the discriminant type for this type.
528    pub fn discriminant_ty(&self) -> Option<Ty> {
529        self.rigid().map(|ty| with(|cx| cx.rigid_ty_discriminant_ty(ty)))
530    }
531
532    /// Deconstruct a function type if this is one.
533    pub fn fn_def(&self) -> Option<(FnDef, &GenericArgs)> {
534        if let TyKind::RigidTy(RigidTy::FnDef(def, args)) = self {
535            Some((*def, args))
536        } else {
537            None
538        }
539    }
540}
541
542pub struct TypeAndMut {
543    pub ty: Ty,
544    pub mutability: Mutability,
545}
546
547#[derive(#[automatically_derived]
impl ::core::clone::Clone for RigidTy {
    #[inline]
    fn clone(&self) -> RigidTy {
        match self {
            RigidTy::Bool => RigidTy::Bool,
            RigidTy::Char => RigidTy::Char,
            RigidTy::Int(__self_0) =>
                RigidTy::Int(::core::clone::Clone::clone(__self_0)),
            RigidTy::Uint(__self_0) =>
                RigidTy::Uint(::core::clone::Clone::clone(__self_0)),
            RigidTy::Float(__self_0) =>
                RigidTy::Float(::core::clone::Clone::clone(__self_0)),
            RigidTy::Adt(__self_0, __self_1) =>
                RigidTy::Adt(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RigidTy::Foreign(__self_0) =>
                RigidTy::Foreign(::core::clone::Clone::clone(__self_0)),
            RigidTy::Str => RigidTy::Str,
            RigidTy::Array(__self_0, __self_1) =>
                RigidTy::Array(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RigidTy::Pat(__self_0, __self_1) =>
                RigidTy::Pat(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RigidTy::Slice(__self_0) =>
                RigidTy::Slice(::core::clone::Clone::clone(__self_0)),
            RigidTy::RawPtr(__self_0, __self_1) =>
                RigidTy::RawPtr(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RigidTy::Ref(__self_0, __self_1, __self_2) =>
                RigidTy::Ref(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            RigidTy::FnDef(__self_0, __self_1) =>
                RigidTy::FnDef(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RigidTy::FnPtr(__self_0) =>
                RigidTy::FnPtr(::core::clone::Clone::clone(__self_0)),
            RigidTy::Closure(__self_0, __self_1) =>
                RigidTy::Closure(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RigidTy::Coroutine(__self_0, __self_1) =>
                RigidTy::Coroutine(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RigidTy::CoroutineClosure(__self_0, __self_1) =>
                RigidTy::CoroutineClosure(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RigidTy::Dynamic(__self_0, __self_1) =>
                RigidTy::Dynamic(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            RigidTy::Never => RigidTy::Never,
            RigidTy::Tuple(__self_0) =>
                RigidTy::Tuple(::core::clone::Clone::clone(__self_0)),
            RigidTy::CoroutineWitness(__self_0, __self_1) =>
                RigidTy::CoroutineWitness(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for RigidTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            RigidTy::Bool => ::core::fmt::Formatter::write_str(f, "Bool"),
            RigidTy::Char => ::core::fmt::Formatter::write_str(f, "Char"),
            RigidTy::Int(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Int",
                    &__self_0),
            RigidTy::Uint(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Uint",
                    &__self_0),
            RigidTy::Float(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Float",
                    &__self_0),
            RigidTy::Adt(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Adt",
                    __self_0, &__self_1),
            RigidTy::Foreign(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Foreign", &__self_0),
            RigidTy::Str => ::core::fmt::Formatter::write_str(f, "Str"),
            RigidTy::Array(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Array",
                    __self_0, &__self_1),
            RigidTy::Pat(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Pat",
                    __self_0, &__self_1),
            RigidTy::Slice(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Slice",
                    &__self_0),
            RigidTy::RawPtr(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "RawPtr",
                    __self_0, &__self_1),
            RigidTy::Ref(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ref",
                    __self_0, __self_1, &__self_2),
            RigidTy::FnDef(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "FnDef",
                    __self_0, &__self_1),
            RigidTy::FnPtr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "FnPtr",
                    &__self_0),
            RigidTy::Closure(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Closure", __self_0, &__self_1),
            RigidTy::Coroutine(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Coroutine", __self_0, &__self_1),
            RigidTy::CoroutineClosure(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "CoroutineClosure", __self_0, &__self_1),
            RigidTy::Dynamic(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Dynamic", __self_0, &__self_1),
            RigidTy::Never => ::core::fmt::Formatter::write_str(f, "Never"),
            RigidTy::Tuple(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tuple",
                    &__self_0),
            RigidTy::CoroutineWitness(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "CoroutineWitness", __self_0, &__self_1),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for RigidTy {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<IntTy>;
        let _: ::core::cmp::AssertParamIsEq<UintTy>;
        let _: ::core::cmp::AssertParamIsEq<FloatTy>;
        let _: ::core::cmp::AssertParamIsEq<AdtDef>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgs>;
        let _: ::core::cmp::AssertParamIsEq<ForeignDef>;
        let _: ::core::cmp::AssertParamIsEq<Ty>;
        let _: ::core::cmp::AssertParamIsEq<TyConst>;
        let _: ::core::cmp::AssertParamIsEq<Pattern>;
        let _: ::core::cmp::AssertParamIsEq<Mutability>;
        let _: ::core::cmp::AssertParamIsEq<Region>;
        let _: ::core::cmp::AssertParamIsEq<FnDef>;
        let _: ::core::cmp::AssertParamIsEq<PolyFnSig>;
        let _: ::core::cmp::AssertParamIsEq<ClosureDef>;
        let _: ::core::cmp::AssertParamIsEq<CoroutineDef>;
        let _: ::core::cmp::AssertParamIsEq<CoroutineClosureDef>;
        let _:
                ::core::cmp::AssertParamIsEq<Vec<Binder<ExistentialPredicate>>>;
        let _: ::core::cmp::AssertParamIsEq<Vec<Ty>>;
        let _: ::core::cmp::AssertParamIsEq<CoroutineWitnessDef>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for RigidTy {
    #[inline]
    fn eq(&self, other: &RigidTy) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (RigidTy::Int(__self_0), RigidTy::Int(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (RigidTy::Uint(__self_0), RigidTy::Uint(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (RigidTy::Float(__self_0), RigidTy::Float(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (RigidTy::Adt(__self_0, __self_1),
                    RigidTy::Adt(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RigidTy::Foreign(__self_0), RigidTy::Foreign(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (RigidTy::Array(__self_0, __self_1),
                    RigidTy::Array(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RigidTy::Pat(__self_0, __self_1),
                    RigidTy::Pat(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RigidTy::Slice(__self_0), RigidTy::Slice(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (RigidTy::RawPtr(__self_0, __self_1),
                    RigidTy::RawPtr(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RigidTy::Ref(__self_0, __self_1, __self_2),
                    RigidTy::Ref(__arg1_0, __arg1_1, __arg1_2)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (RigidTy::FnDef(__self_0, __self_1),
                    RigidTy::FnDef(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RigidTy::FnPtr(__self_0), RigidTy::FnPtr(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (RigidTy::Closure(__self_0, __self_1),
                    RigidTy::Closure(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RigidTy::Coroutine(__self_0, __self_1),
                    RigidTy::Coroutine(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RigidTy::CoroutineClosure(__self_0, __self_1),
                    RigidTy::CoroutineClosure(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RigidTy::Dynamic(__self_0, __self_1),
                    RigidTy::Dynamic(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (RigidTy::Tuple(__self_0), RigidTy::Tuple(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (RigidTy::CoroutineWitness(__self_0, __self_1),
                    RigidTy::CoroutineWitness(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq, #[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 RigidTy {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    RigidTy::Bool =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "RigidTy", 0u32, "Bool"),
                    RigidTy::Char =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "RigidTy", 1u32, "Char"),
                    RigidTy::Int(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "RigidTy", 2u32, "Int", __field0),
                    RigidTy::Uint(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "RigidTy", 3u32, "Uint", __field0),
                    RigidTy::Float(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "RigidTy", 4u32, "Float", __field0),
                    RigidTy::Adt(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 5u32, "Adt", 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)
                    }
                    RigidTy::Foreign(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "RigidTy", 6u32, "Foreign", __field0),
                    RigidTy::Str =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "RigidTy", 7u32, "Str"),
                    RigidTy::Array(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 8u32, "Array", 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)
                    }
                    RigidTy::Pat(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 9u32, "Pat", 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)
                    }
                    RigidTy::Slice(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "RigidTy", 10u32, "Slice", __field0),
                    RigidTy::RawPtr(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 11u32, "RawPtr", 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)
                    }
                    RigidTy::Ref(ref __field0, ref __field1, ref __field2) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 12u32, "Ref", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeTupleVariant::serialize_field(&mut __serde_state,
                                __field0)?;
                        _serde::ser::SerializeTupleVariant::serialize_field(&mut __serde_state,
                                __field1)?;
                        _serde::ser::SerializeTupleVariant::serialize_field(&mut __serde_state,
                                __field2)?;
                        _serde::ser::SerializeTupleVariant::end(__serde_state)
                    }
                    RigidTy::FnDef(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 13u32, "FnDef", 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)
                    }
                    RigidTy::FnPtr(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "RigidTy", 14u32, "FnPtr", __field0),
                    RigidTy::Closure(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 15u32, "Closure", 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)
                    }
                    RigidTy::Coroutine(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 16u32, "Coroutine", 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)
                    }
                    RigidTy::CoroutineClosure(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 17u32, "CoroutineClosure", 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)
                    }
                    RigidTy::Dynamic(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 18u32, "Dynamic", 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)
                    }
                    RigidTy::Never =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "RigidTy", 19u32, "Never"),
                    RigidTy::Tuple(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "RigidTy", 20u32, "Tuple", __field0),
                    RigidTy::CoroutineWitness(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "RigidTy", 21u32, "CoroutineWitness", 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)
                    }
                }
            }
        }
    };Serialize)]
548pub enum RigidTy {
549    Bool,
550    Char,
551    Int(IntTy),
552    Uint(UintTy),
553    Float(FloatTy),
554    Adt(AdtDef, GenericArgs),
555    Foreign(ForeignDef),
556    Str,
557    Array(Ty, TyConst),
558    Pat(Ty, Pattern),
559    Slice(Ty),
560    RawPtr(Ty, Mutability),
561    Ref(Region, Ty, Mutability),
562    FnDef(FnDef, GenericArgs),
563    FnPtr(PolyFnSig),
564    Closure(ClosureDef, GenericArgs),
565    Coroutine(CoroutineDef, GenericArgs),
566    CoroutineClosure(CoroutineClosureDef, GenericArgs),
567    Dynamic(Vec<Binder<ExistentialPredicate>>, Region),
568    Never,
569    Tuple(Vec<Ty>),
570    CoroutineWitness(CoroutineWitnessDef, GenericArgs),
571}
572
573impl RigidTy {
574    /// Get the discriminant type for this type.
575    pub fn discriminant_ty(&self) -> Ty {
576        with(|cx| cx.rigid_ty_discriminant_ty(self))
577    }
578}
579
580impl From<RigidTy> for TyKind {
581    fn from(value: RigidTy) -> Self {
582        TyKind::RigidTy(value)
583    }
584}
585
586#[derive(#[automatically_derived]
impl ::core::clone::Clone for IntTy {
    #[inline]
    fn clone(&self) -> IntTy { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for IntTy { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for IntTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                IntTy::Isize => "Isize",
                IntTy::I8 => "I8",
                IntTy::I16 => "I16",
                IntTy::I32 => "I32",
                IntTy::I64 => "I64",
                IntTy::I128 => "I128",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for IntTy {
    #[inline]
    fn eq(&self, other: &IntTy) -> 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 IntTy {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[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 IntTy {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    IntTy::Isize =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntTy", 0u32, "Isize"),
                    IntTy::I8 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntTy", 1u32, "I8"),
                    IntTy::I16 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntTy", 2u32, "I16"),
                    IntTy::I32 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntTy", 3u32, "I32"),
                    IntTy::I64 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntTy", 4u32, "I64"),
                    IntTy::I128 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "IntTy", 5u32, "I128"),
                }
            }
        }
    };Serialize)]
587pub enum IntTy {
588    Isize,
589    I8,
590    I16,
591    I32,
592    I64,
593    I128,
594}
595
596impl IntTy {
597    pub fn num_bytes(self) -> usize {
598        match self {
599            IntTy::Isize => MachineInfo::target_pointer_width().bytes(),
600            IntTy::I8 => 1,
601            IntTy::I16 => 2,
602            IntTy::I32 => 4,
603            IntTy::I64 => 8,
604            IntTy::I128 => 16,
605        }
606    }
607}
608
609#[derive(#[automatically_derived]
impl ::core::clone::Clone for UintTy {
    #[inline]
    fn clone(&self) -> UintTy { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for UintTy { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for UintTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                UintTy::Usize => "Usize",
                UintTy::U8 => "U8",
                UintTy::U16 => "U16",
                UintTy::U32 => "U32",
                UintTy::U64 => "U64",
                UintTy::U128 => "U128",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for UintTy {
    #[inline]
    fn eq(&self, other: &UintTy) -> 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 UintTy {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[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 UintTy {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    UintTy::Usize =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "UintTy", 0u32, "Usize"),
                    UintTy::U8 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "UintTy", 1u32, "U8"),
                    UintTy::U16 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "UintTy", 2u32, "U16"),
                    UintTy::U32 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "UintTy", 3u32, "U32"),
                    UintTy::U64 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "UintTy", 4u32, "U64"),
                    UintTy::U128 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "UintTy", 5u32, "U128"),
                }
            }
        }
    };Serialize)]
610pub enum UintTy {
611    Usize,
612    U8,
613    U16,
614    U32,
615    U64,
616    U128,
617}
618
619impl UintTy {
620    pub fn num_bytes(self) -> usize {
621        match self {
622            UintTy::Usize => MachineInfo::target_pointer_width().bytes(),
623            UintTy::U8 => 1,
624            UintTy::U16 => 2,
625            UintTy::U32 => 4,
626            UintTy::U64 => 8,
627            UintTy::U128 => 16,
628        }
629    }
630}
631
632#[derive(#[automatically_derived]
impl ::core::clone::Clone for FloatTy {
    #[inline]
    fn clone(&self) -> FloatTy { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for FloatTy { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for FloatTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                FloatTy::F16 => "F16",
                FloatTy::F32 => "F32",
                FloatTy::F64 => "F64",
                FloatTy::F128 => "F128",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for FloatTy {
    #[inline]
    fn eq(&self, other: &FloatTy) -> 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 FloatTy {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[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 FloatTy {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    FloatTy::F16 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "FloatTy", 0u32, "F16"),
                    FloatTy::F32 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "FloatTy", 1u32, "F32"),
                    FloatTy::F64 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "FloatTy", 2u32, "F64"),
                    FloatTy::F128 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "FloatTy", 3u32, "F128"),
                }
            }
        }
    };Serialize)]
633pub enum FloatTy {
634    F16,
635    F32,
636    F64,
637    F128,
638}
639
640#[derive(#[automatically_derived]
impl ::core::clone::Clone for Movability {
    #[inline]
    fn clone(&self) -> Movability { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Movability { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Movability {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                Movability::Static => "Static",
                Movability::Movable => "Movable",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for Movability {
    #[inline]
    fn eq(&self, other: &Movability) -> 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 Movability {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[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 Movability {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    Movability::Static =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Movability", 0u32, "Static"),
                    Movability::Movable =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Movability", 1u32, "Movable"),
                }
            }
        }
    };Serialize)]
641pub enum Movability {
642    Static,
643    Movable,
644}
645
646#[automatically_derived]
impl ::core::clone::Clone for ForeignModuleDef {
    #[inline]
    fn clone(&self) -> ForeignModuleDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for ForeignModuleDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for ForeignModuleDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ForeignModuleDef {
    #[inline]
    fn eq(&self, other: &ForeignModuleDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for ForeignModuleDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for ForeignModuleDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f,
            "ForeignModuleDef", &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for ForeignModuleDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 ForeignModuleDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "ForeignModuleDef", &self.0)
            }
        }
    };
impl CrateDef for ForeignModuleDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
647    #[derive(Serialize)]
648    pub ForeignModuleDef;
649}
650
651impl ForeignModuleDef {
652    pub fn module(&self) -> ForeignModule {
653        with(|cx| cx.foreign_module(*self))
654    }
655}
656
657pub struct ForeignModule {
658    pub def_id: ForeignModuleDef,
659    pub abi: Abi,
660}
661
662impl ForeignModule {
663    pub fn items(&self) -> Vec<ForeignDef> {
664        with(|cx| cx.foreign_items(self.def_id))
665    }
666}
667
668#[automatically_derived]
impl ::core::clone::Clone for ForeignDef {
    #[inline]
    fn clone(&self) -> ForeignDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for ForeignDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for ForeignDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ForeignDef {
    #[inline]
    fn eq(&self, other: &ForeignDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for ForeignDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for ForeignDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "ForeignDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for ForeignDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 ForeignDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "ForeignDef", &self.0)
            }
        }
    };
impl CrateDef for ForeignDef {
    fn def_id(&self) -> DefId { self.0 }
}
impl CrateDefType for ForeignDef {}crate_def_with_ty! {
669    /// Hold information about a ForeignItem in a crate.
670    #[derive(Serialize)]
671    pub ForeignDef;
672}
673
674impl ForeignDef {
675    pub fn kind(&self) -> ForeignItemKind {
676        with(|cx| cx.foreign_item_kind(*self))
677    }
678}
679
680#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForeignItemKind {
    #[inline]
    fn clone(&self) -> ForeignItemKind {
        let _: ::core::clone::AssertParamIsClone<FnDef>;
        let _: ::core::clone::AssertParamIsClone<StaticDef>;
        let _: ::core::clone::AssertParamIsClone<Ty>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ForeignItemKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for ForeignItemKind {
    #[inline]
    fn eq(&self, other: &ForeignItemKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ForeignItemKind::Fn(__self_0), ForeignItemKind::Fn(__arg1_0))
                    => __self_0 == __arg1_0,
                (ForeignItemKind::Static(__self_0),
                    ForeignItemKind::Static(__arg1_0)) => __self_0 == __arg1_0,
                (ForeignItemKind::Type(__self_0),
                    ForeignItemKind::Type(__arg1_0)) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ForeignItemKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<FnDef>;
        let _: ::core::cmp::AssertParamIsEq<StaticDef>;
        let _: ::core::cmp::AssertParamIsEq<Ty>;
    }
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for ForeignItemKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ForeignItemKind::Fn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
                    &__self_0),
            ForeignItemKind::Static(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Static",
                    &__self_0),
            ForeignItemKind::Type(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for ForeignItemKind {
    #[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 {
            ForeignItemKind::Fn(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            ForeignItemKind::Static(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            ForeignItemKind::Type(__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 ForeignItemKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ForeignItemKind::Fn(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ForeignItemKind", 0u32, "Fn", __field0),
                    ForeignItemKind::Static(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ForeignItemKind", 1u32, "Static", __field0),
                    ForeignItemKind::Type(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ForeignItemKind", 2u32, "Type", __field0),
                }
            }
        }
    };Serialize)]
681pub enum ForeignItemKind {
682    Fn(FnDef),
683    Static(StaticDef),
684    Type(Ty),
685}
686
687#[automatically_derived]
impl ::core::clone::Clone for FnDef {
    #[inline]
    fn clone(&self) -> FnDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for FnDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for FnDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FnDef {
    #[inline]
    fn eq(&self, other: &FnDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for FnDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for FnDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "FnDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for FnDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 FnDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "FnDef", &self.0)
            }
        }
    };
impl CrateDef for FnDef {
    fn def_id(&self) -> DefId { self.0 }
}
impl CrateDefType for FnDef {}crate_def_with_ty! {
688    /// Hold information about a function definition in a crate.
689    #[derive(Serialize)]
690    pub FnDef;
691}
692
693impl FnDef {
694    // Get the function body if available.
695    pub fn body(&self) -> Option<Body> {
696        with(|ctx| ctx.has_body(self.0).then(|| ctx.mir_body(self.0)))
697    }
698
699    // Check if the function body is available.
700    pub fn has_body(&self) -> bool {
701        with(|ctx| ctx.has_body(self.0))
702    }
703
704    /// Get the information of the intrinsic if this function is a definition of one.
705    pub fn as_intrinsic(&self) -> Option<IntrinsicDef> {
706        with(|cx| cx.intrinsic(self.def_id()))
707    }
708
709    /// Check if the function is an intrinsic.
710    #[inline]
711    pub fn is_intrinsic(&self) -> bool {
712        self.as_intrinsic().is_some()
713    }
714
715    /// Get the constness of this function definition.
716    pub fn constness(&self) -> Constness {
717        with(|cx| cx.constness(*self))
718    }
719
720    /// Get the asyncness of this function definition.
721    pub fn asyncness(&self) -> Asyncness {
722        with(|cx| cx.asyncness(*self))
723    }
724
725    /// Get the function signature for this function definition.
726    pub fn fn_sig(&self) -> PolyFnSig {
727        let kind = self.ty().kind();
728        kind.fn_sig().unwrap()
729    }
730}
731
732#[automatically_derived]
impl ::core::clone::Clone for IntrinsicDef {
    #[inline]
    fn clone(&self) -> IntrinsicDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for IntrinsicDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for IntrinsicDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IntrinsicDef {
    #[inline]
    fn eq(&self, other: &IntrinsicDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for IntrinsicDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for IntrinsicDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "IntrinsicDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for IntrinsicDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 IntrinsicDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "IntrinsicDef", &self.0)
            }
        }
    };
impl CrateDef for IntrinsicDef {
    fn def_id(&self) -> DefId { self.0 }
}
impl CrateDefType for IntrinsicDef {}crate_def_with_ty! {
733    #[derive(Serialize)]
734    pub IntrinsicDef;
735}
736
737impl IntrinsicDef {
738    /// Returns the plain name of the intrinsic.
739    /// e.g., `transmute` for `core::intrinsics::transmute`.
740    pub fn fn_name(&self) -> Symbol {
741        with(|cx| cx.intrinsic_name(*self))
742    }
743
744    /// Returns whether the intrinsic has no meaningful body and all backends
745    /// need to shim all calls to it.
746    pub fn must_be_overridden(&self) -> bool {
747        with(|cx| !cx.has_body(self.0))
748    }
749}
750
751impl From<IntrinsicDef> for FnDef {
752    fn from(def: IntrinsicDef) -> Self {
753        FnDef(def.0)
754    }
755}
756
757#[automatically_derived]
impl ::core::clone::Clone for ClosureDef {
    #[inline]
    fn clone(&self) -> ClosureDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for ClosureDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for ClosureDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ClosureDef {
    #[inline]
    fn eq(&self, other: &ClosureDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for ClosureDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for ClosureDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "ClosureDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for ClosureDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 ClosureDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "ClosureDef", &self.0)
            }
        }
    };
impl CrateDef for ClosureDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
758    #[derive(Serialize)]
759    pub ClosureDef;
760}
761
762impl ClosureDef {
763    /// Retrieves the body of the closure definition. Returns None if the body
764    /// isn't available.
765    pub fn body(&self) -> Option<Body> {
766        with(|ctx| ctx.has_body(self.0).then(|| ctx.mir_body(self.0)))
767    }
768}
769
770#[automatically_derived]
impl ::core::clone::Clone for CoroutineDef {
    #[inline]
    fn clone(&self) -> CoroutineDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for CoroutineDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoroutineDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoroutineDef {
    #[inline]
    fn eq(&self, other: &CoroutineDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for CoroutineDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for CoroutineDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "CoroutineDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for CoroutineDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 CoroutineDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "CoroutineDef", &self.0)
            }
        }
    };
impl CrateDef for CoroutineDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
771    #[derive(Serialize)]
772    pub CoroutineDef;
773}
774
775impl CoroutineDef {
776    /// Retrieves the body of the coroutine definition. Returns None if the body
777    /// isn't available.
778    pub fn body(&self) -> Option<Body> {
779        with(|cx| cx.has_body(self.0).then(|| cx.mir_body(self.0)))
780    }
781
782    pub fn discriminant_for_variant(&self, args: &GenericArgs, idx: VariantIdx) -> Discr {
783        with(|cx| cx.coroutine_discr_for_variant(*self, args, idx))
784    }
785}
786
787#[automatically_derived]
impl ::core::clone::Clone for CoroutineClosureDef {
    #[inline]
    fn clone(&self) -> CoroutineClosureDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for CoroutineClosureDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoroutineClosureDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoroutineClosureDef {
    #[inline]
    fn eq(&self, other: &CoroutineClosureDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for CoroutineClosureDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for CoroutineClosureDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f,
            "CoroutineClosureDef", &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for CoroutineClosureDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 CoroutineClosureDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "CoroutineClosureDef", &self.0)
            }
        }
    };
impl CrateDef for CoroutineClosureDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
788    #[derive(Serialize)]
789    pub CoroutineClosureDef;
790}
791
792#[automatically_derived]
impl ::core::clone::Clone for ParamDef {
    #[inline]
    fn clone(&self) -> ParamDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for ParamDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for ParamDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ParamDef {
    #[inline]
    fn eq(&self, other: &ParamDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for ParamDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for ParamDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "ParamDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for ParamDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 ParamDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "ParamDef", &self.0)
            }
        }
    };
impl CrateDef for ParamDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
793    #[derive(Serialize)]
794    pub ParamDef;
795}
796
797#[automatically_derived]
impl ::core::clone::Clone for BrNamedDef {
    #[inline]
    fn clone(&self) -> BrNamedDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for BrNamedDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for BrNamedDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BrNamedDef {
    #[inline]
    fn eq(&self, other: &BrNamedDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for BrNamedDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for BrNamedDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "BrNamedDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for BrNamedDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 BrNamedDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "BrNamedDef", &self.0)
            }
        }
    };
impl CrateDef for BrNamedDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
798    #[derive(Serialize)]
799    pub BrNamedDef;
800}
801
802#[automatically_derived]
impl ::core::clone::Clone for AdtDef {
    #[inline]
    fn clone(&self) -> AdtDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for AdtDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for AdtDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AdtDef {
    #[inline]
    fn eq(&self, other: &AdtDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for AdtDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for AdtDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "AdtDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for AdtDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 AdtDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "AdtDef", &self.0)
            }
        }
    };
impl CrateDef for AdtDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
803    #[derive(Serialize)]
804    pub AdtDef;
805}
806
807#[derive(#[automatically_derived]
impl ::core::clone::Clone for AdtKind {
    #[inline]
    fn clone(&self) -> AdtKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AdtKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for AdtKind {
    #[inline]
    fn eq(&self, other: &AdtKind) -> 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 AdtKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for AdtKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AdtKind::Enum => "Enum",
                AdtKind::Union => "Union",
                AdtKind::Struct => "Struct",
            })
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for AdtKind {
    #[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 AdtKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    AdtKind::Enum =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AdtKind", 0u32, "Enum"),
                    AdtKind::Union =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AdtKind", 1u32, "Union"),
                    AdtKind::Struct =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AdtKind", 2u32, "Struct"),
                }
            }
        }
    };Serialize)]
808pub enum AdtKind {
809    Enum,
810    Union,
811    Struct,
812}
813
814impl AdtDef {
815    pub fn kind(&self) -> AdtKind {
816        with(|cx| cx.adt_kind(*self))
817    }
818
819    /// Retrieve the type of this Adt.
820    pub fn ty(&self) -> Ty {
821        with(|cx| cx.def_ty(self.0))
822    }
823
824    /// Retrieve the type of this Adt by instantiating and normalizing it with the given arguments.
825    ///
826    /// This will assume the type can be instantiated with these arguments.
827    pub fn ty_with_args(&self, args: &GenericArgs) -> Ty {
828        with(|cx| cx.def_ty_with_args(self.0, args))
829    }
830
831    pub fn is_box(&self) -> bool {
832        with(|cx| cx.adt_is_box(*self))
833    }
834
835    pub fn is_simd(&self) -> bool {
836        with(|cx| cx.adt_is_simd(*self))
837    }
838
839    /// The number of variants in this ADT.
840    pub fn num_variants(&self) -> usize {
841        with(|cx| cx.adt_variants_len(*self))
842    }
843
844    /// Retrieve the variants in this ADT.
845    pub fn variants(&self) -> Vec<VariantDef> {
846        self.variants_iter().collect()
847    }
848
849    /// Iterate over the variants in this ADT.
850    pub fn variants_iter(&self) -> impl Iterator<Item = VariantDef> {
851        (0..self.num_variants())
852            .map(|idx| VariantDef { idx: VariantIdx::to_val(idx), adt_def: *self })
853    }
854
855    pub fn variant(&self, idx: VariantIdx) -> Option<VariantDef> {
856        (idx.to_index() < self.num_variants()).then_some(VariantDef { idx, adt_def: *self })
857    }
858
859    pub fn repr(&self) -> ReprOptions {
860        with(|cx| cx.adt_repr(*self))
861    }
862
863    pub fn discriminant_for_variant(&self, idx: VariantIdx) -> Discr {
864        with(|cx| cx.adt_discr_for_variant(*self, idx))
865    }
866}
867
868pub struct Discr {
869    pub val: u128,
870    pub ty: Ty,
871}
872
873/// Definition of a variant, which can be either a struct / union field or an enum variant.
874#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantDef {
    #[inline]
    fn clone(&self) -> VariantDef {
        let _: ::core::clone::AssertParamIsClone<VariantIdx>;
        let _: ::core::clone::AssertParamIsClone<AdtDef>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for VariantDef { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for VariantDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "VariantDef",
            "idx", &self.idx, "adt_def", &&self.adt_def)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for VariantDef {
    #[inline]
    fn eq(&self, other: &VariantDef) -> bool {
        self.idx == other.idx && self.adt_def == other.adt_def
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<VariantIdx>;
        let _: ::core::cmp::AssertParamIsEq<AdtDef>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for VariantDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.idx, state);
        ::core::hash::Hash::hash(&self.adt_def, 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 VariantDef {
            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,
                            "VariantDef", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "idx", &self.idx)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "adt_def", &self.adt_def)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
875pub struct VariantDef {
876    /// The variant index.
877    pub(crate) idx: VariantIdx,
878    /// The data type where this variant comes from.
879    /// For now, we use this to retrieve information about the variant itself so we don't need to
880    /// cache more information.
881    pub(crate) adt_def: AdtDef,
882}
883
884impl VariantDef {
885    /// The name of the variant, struct or union.
886    ///
887    /// This will not include the name of the enum or qualified path.
888    pub fn name(&self) -> Symbol {
889        with(|cx| cx.variant_name(*self))
890    }
891
892    /// Retrieve all the fields in this variant.
893    // We expect user to cache this and use it directly since today it is expensive to generate all
894    // fields name.
895    pub fn fields(&self) -> Vec<FieldDef> {
896        with(|cx| cx.variant_fields(*self))
897    }
898}
899
900pub struct FieldDef {
    pub(crate) def: DefId,
    #[doc = r" The field name."]
    pub name: Symbol,
}
#[automatically_derived]
impl ::core::clone::Clone for FieldDef {
    #[inline]
    fn clone(&self) -> FieldDef {
        FieldDef {
            def: ::core::clone::Clone::clone(&self.def),
            name: ::core::clone::Clone::clone(&self.name),
        }
    }
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for FieldDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FieldDef {
    #[inline]
    fn eq(&self, other: &FieldDef) -> bool {
        self.def == other.def && self.name == other.name
    }
}
#[automatically_derived]
impl ::core::cmp::Eq for FieldDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
        let _: ::core::cmp::AssertParamIsEq<Symbol>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for FieldDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "FieldDef",
            "def", &self.def, "name", &&self.name)
    }
}
#[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 FieldDef {
            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,
                            "FieldDef", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def", &self.def)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };
impl CrateDef for FieldDef {
    fn def_id(&self) -> DefId { self.def }
}
impl CrateDefType for FieldDef {}crate_def_with_ty! {
901    #[derive(Serialize)]
902    pub FieldDef {
903        /// The field name.
904        pub name: Symbol,
905    }
906}
907
908impl Display for AdtKind {
909    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
910        f.write_str(match self {
911            AdtKind::Enum => "enum",
912            AdtKind::Union => "union",
913            AdtKind::Struct => "struct",
914        })
915    }
916}
917
918impl AdtKind {
919    pub fn is_enum(&self) -> bool {
920        #[allow(non_exhaustive_omitted_patterns)] match self {
    AdtKind::Enum => true,
    _ => false,
}matches!(self, AdtKind::Enum)
921    }
922
923    pub fn is_struct(&self) -> bool {
924        #[allow(non_exhaustive_omitted_patterns)] match self {
    AdtKind::Struct => true,
    _ => false,
}matches!(self, AdtKind::Struct)
925    }
926
927    pub fn is_union(&self) -> bool {
928        #[allow(non_exhaustive_omitted_patterns)] match self {
    AdtKind::Union => true,
    _ => false,
}matches!(self, AdtKind::Union)
929    }
930}
931
932#[automatically_derived]
impl ::core::clone::Clone for AliasDef {
    #[inline]
    fn clone(&self) -> AliasDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for AliasDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for AliasDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AliasDef {
    #[inline]
    fn eq(&self, other: &AliasDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for AliasDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for AliasDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "AliasDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for AliasDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 AliasDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "AliasDef", &self.0)
            }
        }
    };
impl CrateDef for AliasDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
933    #[derive(Serialize)]
934    pub AliasDef;
935}
936
937#[automatically_derived]
impl ::core::clone::Clone for TraitDef {
    #[inline]
    fn clone(&self) -> TraitDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for TraitDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for TraitDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TraitDef {
    #[inline]
    fn eq(&self, other: &TraitDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for TraitDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for TraitDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "TraitDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for TraitDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 TraitDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "TraitDef", &self.0)
            }
        }
    };
impl CrateDef for TraitDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
938    /// A trait's definition.
939    #[derive(Serialize)]
940    pub TraitDef;
941}
942
943impl TraitDef {
944    pub fn declaration(trait_def: &TraitDef) -> TraitDecl {
945        with(|cx| cx.trait_decl(trait_def))
946    }
947
948    pub fn associated_items(&self) -> AssocItems {
949        with(|cx| cx.associated_items(self.def_id()))
950    }
951}
952
953#[automatically_derived]
impl ::core::clone::Clone for GenericDef {
    #[inline]
    fn clone(&self) -> GenericDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for GenericDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for GenericDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for GenericDef {
    #[inline]
    fn eq(&self, other: &GenericDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for GenericDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for GenericDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "GenericDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for GenericDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 GenericDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "GenericDef", &self.0)
            }
        }
    };
impl CrateDef for GenericDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
954    #[derive(Serialize)]
955    pub GenericDef;
956}
957
958#[automatically_derived]
impl ::core::clone::Clone for ConstDef {
    #[inline]
    fn clone(&self) -> ConstDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for ConstDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for ConstDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ConstDef {
    #[inline]
    fn eq(&self, other: &ConstDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for ConstDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for ConstDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "ConstDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for ConstDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 ConstDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "ConstDef", &self.0)
            }
        }
    };
impl CrateDef for ConstDef {
    fn def_id(&self) -> DefId { self.0 }
}
impl CrateDefType for ConstDef {}crate_def_with_ty! {
959    #[derive(Serialize)]
960    pub ConstDef;
961}
962
963#[automatically_derived]
impl ::core::clone::Clone for ImplDef {
    #[inline]
    fn clone(&self) -> ImplDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for ImplDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for ImplDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ImplDef {
    #[inline]
    fn eq(&self, other: &ImplDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for ImplDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for ImplDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "ImplDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for ImplDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 ImplDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "ImplDef", &self.0)
            }
        }
    };
impl CrateDef for ImplDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
964    /// A trait impl definition.
965    #[derive(Serialize)]
966    pub ImplDef;
967}
968
969impl ImplDef {
970    /// Retrieve information about this implementation.
971    pub fn trait_impl(&self) -> ImplTrait {
972        with(|cx| cx.trait_impl(self))
973    }
974
975    pub fn associated_items(&self) -> AssocItems {
976        with(|cx| cx.associated_items(self.def_id()))
977    }
978}
979
980#[automatically_derived]
impl ::core::clone::Clone for RegionDef {
    #[inline]
    fn clone(&self) -> RegionDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for RegionDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for RegionDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RegionDef {
    #[inline]
    fn eq(&self, other: &RegionDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for RegionDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for RegionDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "RegionDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for RegionDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 RegionDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "RegionDef", &self.0)
            }
        }
    };
impl CrateDef for RegionDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
981    #[derive(Serialize)]
982    pub RegionDef;
983}
984
985#[automatically_derived]
impl ::core::clone::Clone for CoroutineWitnessDef {
    #[inline]
    fn clone(&self) -> CoroutineWitnessDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for CoroutineWitnessDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoroutineWitnessDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoroutineWitnessDef {
    #[inline]
    fn eq(&self, other: &CoroutineWitnessDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for CoroutineWitnessDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for CoroutineWitnessDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f,
            "CoroutineWitnessDef", &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for CoroutineWitnessDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 CoroutineWitnessDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "CoroutineWitnessDef", &self.0)
            }
        }
    };
impl CrateDef for CoroutineWitnessDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
986    #[derive(Serialize)]
987    pub CoroutineWitnessDef;
988}
989
990/// A list of generic arguments.
991#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericArgs {
    #[inline]
    fn clone(&self) -> GenericArgs {
        GenericArgs(::core::clone::Clone::clone(&self.0))
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for GenericArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "GenericArgs",
            &&self.0)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for GenericArgs {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Vec<GenericArgKind>>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for GenericArgs {
    #[inline]
    fn eq(&self, other: &GenericArgs) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for GenericArgs {
    #[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 GenericArgs {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "GenericArgs", &self.0)
            }
        }
    };Serialize)]
992pub struct GenericArgs(pub Vec<GenericArgKind>);
993
994impl std::ops::Index<ParamTy> for GenericArgs {
995    type Output = Ty;
996
997    fn index(&self, index: ParamTy) -> &Self::Output {
998        self.0[index.index as usize].expect_ty()
999    }
1000}
1001
1002impl std::ops::Index<ParamConst> for GenericArgs {
1003    type Output = TyConst;
1004
1005    fn index(&self, index: ParamConst) -> &Self::Output {
1006        self.0[index.index as usize].expect_const()
1007    }
1008}
1009
1010#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericArgKind {
    #[inline]
    fn clone(&self) -> GenericArgKind {
        match self {
            GenericArgKind::Lifetime(__self_0) =>
                GenericArgKind::Lifetime(::core::clone::Clone::clone(__self_0)),
            GenericArgKind::Type(__self_0) =>
                GenericArgKind::Type(::core::clone::Clone::clone(__self_0)),
            GenericArgKind::Const(__self_0) =>
                GenericArgKind::Const(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for GenericArgKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericArgKind::Lifetime(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Lifetime", &__self_0),
            GenericArgKind::Type(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
                    &__self_0),
            GenericArgKind::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for GenericArgKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Region>;
        let _: ::core::cmp::AssertParamIsEq<Ty>;
        let _: ::core::cmp::AssertParamIsEq<TyConst>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for GenericArgKind {
    #[inline]
    fn eq(&self, other: &GenericArgKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (GenericArgKind::Lifetime(__self_0),
                    GenericArgKind::Lifetime(__arg1_0)) => __self_0 == __arg1_0,
                (GenericArgKind::Type(__self_0),
                    GenericArgKind::Type(__arg1_0)) => __self_0 == __arg1_0,
                (GenericArgKind::Const(__self_0),
                    GenericArgKind::Const(__arg1_0)) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for GenericArgKind {
    #[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 {
            GenericArgKind::Lifetime(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            GenericArgKind::Type(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            GenericArgKind::Const(__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 GenericArgKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    GenericArgKind::Lifetime(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "GenericArgKind", 0u32, "Lifetime", __field0),
                    GenericArgKind::Type(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "GenericArgKind", 1u32, "Type", __field0),
                    GenericArgKind::Const(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "GenericArgKind", 2u32, "Const", __field0),
                }
            }
        }
    };Serialize)]
1011pub enum GenericArgKind {
1012    Lifetime(Region),
1013    Type(Ty),
1014    Const(TyConst),
1015}
1016
1017impl GenericArgKind {
1018    /// Panic if this generic argument is not a type, otherwise
1019    /// return the type.
1020    #[track_caller]
1021    pub fn expect_ty(&self) -> &Ty {
1022        match self {
1023            GenericArgKind::Type(ty) => ty,
1024            _ => { ::core::panicking::panic_fmt(format_args!("{0:?}", self)); }panic!("{self:?}"),
1025        }
1026    }
1027
1028    /// Panic if this generic argument is not a const, otherwise
1029    /// return the const.
1030    #[track_caller]
1031    pub fn expect_const(&self) -> &TyConst {
1032        match self {
1033            GenericArgKind::Const(c) => c,
1034            _ => { ::core::panicking::panic_fmt(format_args!("{0:?}", self)); }panic!("{self:?}"),
1035        }
1036    }
1037
1038    /// Return the generic argument type if applicable, otherwise return `None`.
1039    pub fn ty(&self) -> Option<&Ty> {
1040        match self {
1041            GenericArgKind::Type(ty) => Some(ty),
1042            _ => None,
1043        }
1044    }
1045}
1046
1047#[derive(#[automatically_derived]
impl ::core::clone::Clone for TermKind {
    #[inline]
    fn clone(&self) -> TermKind {
        match self {
            TermKind::Type(__self_0) =>
                TermKind::Type(::core::clone::Clone::clone(__self_0)),
            TermKind::Const(__self_0) =>
                TermKind::Const(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TermKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TermKind::Type(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
                    &__self_0),
            TermKind::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for TermKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ty>;
        let _: ::core::cmp::AssertParamIsEq<TyConst>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for TermKind {
    #[inline]
    fn eq(&self, other: &TermKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (TermKind::Type(__self_0), TermKind::Type(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (TermKind::Const(__self_0), TermKind::Const(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[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 TermKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    TermKind::Type(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "TermKind", 0u32, "Type", __field0),
                    TermKind::Const(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "TermKind", 1u32, "Const", __field0),
                }
            }
        }
    };Serialize)]
1048pub enum TermKind {
1049    Type(Ty),
1050    Const(TyConst),
1051}
1052
1053#[derive(#[automatically_derived]
impl ::core::clone::Clone for AliasKind {
    #[inline]
    fn clone(&self) -> AliasKind {
        match self {
            AliasKind::Projection => AliasKind::Projection,
            AliasKind::Inherent => AliasKind::Inherent,
            AliasKind::Opaque => AliasKind::Opaque,
            AliasKind::Free => AliasKind::Free,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AliasKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AliasKind::Projection => "Projection",
                AliasKind::Inherent => "Inherent",
                AliasKind::Opaque => "Opaque",
                AliasKind::Free => "Free",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for AliasKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for AliasKind {
    #[inline]
    fn eq(&self, other: &AliasKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[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 AliasKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    AliasKind::Projection =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AliasKind", 0u32, "Projection"),
                    AliasKind::Inherent =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AliasKind", 1u32, "Inherent"),
                    AliasKind::Opaque =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AliasKind", 2u32, "Opaque"),
                    AliasKind::Free =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AliasKind", 3u32, "Free"),
                }
            }
        }
    };Serialize)]
1054pub enum AliasKind {
1055    Projection,
1056    Inherent,
1057    Opaque,
1058    Free,
1059}
1060
1061#[derive(#[automatically_derived]
impl ::core::clone::Clone for AliasTy {
    #[inline]
    fn clone(&self) -> AliasTy {
        AliasTy {
            def_id: ::core::clone::Clone::clone(&self.def_id),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AliasTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "AliasTy",
            "def_id", &self.def_id, "args", &&self.args)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for AliasTy {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<AliasDef>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgs>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for AliasTy {
    #[inline]
    fn eq(&self, other: &AliasTy) -> bool {
        self.def_id == other.def_id && self.args == other.args
    }
}PartialEq, #[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 AliasTy {
            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,
                            "AliasTy", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def_id", &self.def_id)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "args", &self.args)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1062pub struct AliasTy {
1063    pub def_id: AliasDef,
1064    pub args: GenericArgs,
1065}
1066
1067#[derive(#[automatically_derived]
impl ::core::clone::Clone for AliasTerm {
    #[inline]
    fn clone(&self) -> AliasTerm {
        AliasTerm {
            def_id: ::core::clone::Clone::clone(&self.def_id),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AliasTerm {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "AliasTerm",
            "def_id", &self.def_id, "args", &&self.args)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for AliasTerm {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<AliasDef>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgs>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for AliasTerm {
    #[inline]
    fn eq(&self, other: &AliasTerm) -> bool {
        self.def_id == other.def_id && self.args == other.args
    }
}PartialEq, #[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 AliasTerm {
            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,
                            "AliasTerm", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def_id", &self.def_id)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "args", &self.args)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1068pub struct AliasTerm {
1069    pub def_id: AliasDef,
1070    pub args: GenericArgs,
1071}
1072
1073pub type PolyFnSig = Binder<FnSig>;
1074
1075impl PolyFnSig {
1076    /// Compute a `FnAbi` suitable for indirect calls, i.e. to `fn` pointers.
1077    ///
1078    /// NB: this doesn't handle virtual calls - those should use `Instance::fn_abi`
1079    /// instead, where the instance is an `InstanceKind::Virtual`.
1080    pub fn fn_ptr_abi(self) -> Result<FnAbi, Error> {
1081        with(|cx| cx.fn_ptr_abi(self))
1082    }
1083}
1084
1085#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnSig {
    #[inline]
    fn clone(&self) -> FnSig {
        FnSig {
            inputs_and_output: ::core::clone::Clone::clone(&self.inputs_and_output),
            c_variadic: ::core::clone::Clone::clone(&self.c_variadic),
            safety: ::core::clone::Clone::clone(&self.safety),
            abi: ::core::clone::Clone::clone(&self.abi),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FnSig {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "FnSig",
            "inputs_and_output", &self.inputs_and_output, "c_variadic",
            &self.c_variadic, "safety", &self.safety, "abi", &&self.abi)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for FnSig {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Vec<Ty>>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<Safety>;
        let _: ::core::cmp::AssertParamIsEq<Abi>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for FnSig {
    #[inline]
    fn eq(&self, other: &FnSig) -> bool {
        self.c_variadic == other.c_variadic &&
                    self.inputs_and_output == other.inputs_and_output &&
                self.safety == other.safety && self.abi == other.abi
    }
}PartialEq, #[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 FnSig {
            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, "FnSig",
                            false as usize + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "inputs_and_output", &self.inputs_and_output)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "c_variadic", &self.c_variadic)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "safety", &self.safety)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "abi", &self.abi)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1086pub struct FnSig {
1087    pub inputs_and_output: Vec<Ty>,
1088    pub c_variadic: bool,
1089    pub safety: Safety,
1090    pub abi: Abi,
1091}
1092
1093impl FnSig {
1094    pub fn output(&self) -> Ty {
1095        self.inputs_and_output[self.inputs_and_output.len() - 1]
1096    }
1097
1098    pub fn inputs(&self) -> &[Ty] {
1099        &self.inputs_and_output[..self.inputs_and_output.len() - 1]
1100    }
1101}
1102
1103#[derive(#[automatically_derived]
impl ::core::marker::Copy for Constness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Constness {
    #[inline]
    fn clone(&self) -> Constness {
        let _: ::core::clone::AssertParamIsClone<bool>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Constness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Constness::Const { always: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
                    "always", &__self_0),
            Constness::NotConst =>
                ::core::fmt::Formatter::write_str(f, "NotConst"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Constness {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for Constness {
    #[inline]
    fn eq(&self, other: &Constness) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Constness::Const { always: __self_0 }, Constness::Const {
                    always: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[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 Constness {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    Constness::Const { ref always } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Constness", 0u32, "Const", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "always", always)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Constness::NotConst =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Constness", 1u32, "NotConst"),
                }
            }
        }
    };Serialize)]
1104pub enum Constness {
1105    Const { always: bool },
1106    NotConst,
1107}
1108
1109impl Constness {
1110    pub fn is_const(self) -> bool {
1111        #[allow(non_exhaustive_omitted_patterns)] match self {
    Constness::Const { always: false } => true,
    _ => false,
}matches!(self, Constness::Const { always: false })
1112    }
1113}
1114
1115#[derive(#[automatically_derived]
impl ::core::marker::Copy for Asyncness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Asyncness {
    #[inline]
    fn clone(&self) -> Asyncness { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Asyncness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                Asyncness::Async => "Async",
                Asyncness::NotAsync => "NotAsync",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Asyncness {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for Asyncness {
    #[inline]
    fn eq(&self, other: &Asyncness) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[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 Asyncness {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    Asyncness::Async =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Asyncness", 0u32, "Async"),
                    Asyncness::NotAsync =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Asyncness", 1u32, "NotAsync"),
                }
            }
        }
    };Serialize)]
1116pub enum Asyncness {
1117    Async,
1118    NotAsync,
1119}
1120
1121impl Asyncness {
1122    pub fn is_async(self) -> bool {
1123        #[allow(non_exhaustive_omitted_patterns)] match self {
    Asyncness::Async => true,
    _ => false,
}matches!(self, Asyncness::Async)
1124    }
1125}
1126
1127#[derive(#[automatically_derived]
impl ::core::clone::Clone for Abi {
    #[inline]
    fn clone(&self) -> Abi {
        match self {
            Abi::Rust => Abi::Rust,
            Abi::C { unwind: __self_0 } =>
                Abi::C { unwind: ::core::clone::Clone::clone(__self_0) },
            Abi::Cdecl { unwind: __self_0 } =>
                Abi::Cdecl { unwind: ::core::clone::Clone::clone(__self_0) },
            Abi::Stdcall { unwind: __self_0 } =>
                Abi::Stdcall {
                    unwind: ::core::clone::Clone::clone(__self_0),
                },
            Abi::Fastcall { unwind: __self_0 } =>
                Abi::Fastcall {
                    unwind: ::core::clone::Clone::clone(__self_0),
                },
            Abi::Vectorcall { unwind: __self_0 } =>
                Abi::Vectorcall {
                    unwind: ::core::clone::Clone::clone(__self_0),
                },
            Abi::Thiscall { unwind: __self_0 } =>
                Abi::Thiscall {
                    unwind: ::core::clone::Clone::clone(__self_0),
                },
            Abi::Aapcs { unwind: __self_0 } =>
                Abi::Aapcs { unwind: ::core::clone::Clone::clone(__self_0) },
            Abi::Win64 { unwind: __self_0 } =>
                Abi::Win64 { unwind: ::core::clone::Clone::clone(__self_0) },
            Abi::SysV64 { unwind: __self_0 } =>
                Abi::SysV64 { unwind: ::core::clone::Clone::clone(__self_0) },
            Abi::PtxKernel => Abi::PtxKernel,
            Abi::Msp430Interrupt => Abi::Msp430Interrupt,
            Abi::X86Interrupt => Abi::X86Interrupt,
            Abi::GpuKernel => Abi::GpuKernel,
            Abi::EfiApi => Abi::EfiApi,
            Abi::AvrInterrupt => Abi::AvrInterrupt,
            Abi::AvrNonBlockingInterrupt => Abi::AvrNonBlockingInterrupt,
            Abi::CCmseNonSecureCall => Abi::CCmseNonSecureCall,
            Abi::CCmseNonSecureEntry => Abi::CCmseNonSecureEntry,
            Abi::System { unwind: __self_0 } =>
                Abi::System { unwind: ::core::clone::Clone::clone(__self_0) },
            Abi::RustCall => Abi::RustCall,
            Abi::Unadjusted => Abi::Unadjusted,
            Abi::RustCold => Abi::RustCold,
            Abi::RiscvInterruptM => Abi::RiscvInterruptM,
            Abi::RiscvInterruptS => Abi::RiscvInterruptS,
            Abi::RustPreserveNone => Abi::RustPreserveNone,
            Abi::RustTail => Abi::RustTail,
            Abi::RustInvalid => Abi::RustInvalid,
            Abi::Custom => Abi::Custom,
            Abi::Swift => Abi::Swift,
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Abi {
    #[inline]
    fn eq(&self, other: &Abi) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Abi::C { unwind: __self_0 }, Abi::C { unwind: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                (Abi::Cdecl { unwind: __self_0 }, Abi::Cdecl {
                    unwind: __arg1_0 }) => __self_0 == __arg1_0,
                (Abi::Stdcall { unwind: __self_0 }, Abi::Stdcall {
                    unwind: __arg1_0 }) => __self_0 == __arg1_0,
                (Abi::Fastcall { unwind: __self_0 }, Abi::Fastcall {
                    unwind: __arg1_0 }) => __self_0 == __arg1_0,
                (Abi::Vectorcall { unwind: __self_0 }, Abi::Vectorcall {
                    unwind: __arg1_0 }) => __self_0 == __arg1_0,
                (Abi::Thiscall { unwind: __self_0 }, Abi::Thiscall {
                    unwind: __arg1_0 }) => __self_0 == __arg1_0,
                (Abi::Aapcs { unwind: __self_0 }, Abi::Aapcs {
                    unwind: __arg1_0 }) => __self_0 == __arg1_0,
                (Abi::Win64 { unwind: __self_0 }, Abi::Win64 {
                    unwind: __arg1_0 }) => __self_0 == __arg1_0,
                (Abi::SysV64 { unwind: __self_0 }, Abi::SysV64 {
                    unwind: __arg1_0 }) => __self_0 == __arg1_0,
                (Abi::System { unwind: __self_0 }, Abi::System {
                    unwind: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Abi {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for Abi {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Abi::Rust => ::core::fmt::Formatter::write_str(f, "Rust"),
            Abi::C { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "C",
                    "unwind", &__self_0),
            Abi::Cdecl { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Cdecl",
                    "unwind", &__self_0),
            Abi::Stdcall { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Stdcall", "unwind", &__self_0),
            Abi::Fastcall { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Fastcall", "unwind", &__self_0),
            Abi::Vectorcall { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Vectorcall", "unwind", &__self_0),
            Abi::Thiscall { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Thiscall", "unwind", &__self_0),
            Abi::Aapcs { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Aapcs",
                    "unwind", &__self_0),
            Abi::Win64 { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Win64",
                    "unwind", &__self_0),
            Abi::SysV64 { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "SysV64", "unwind", &__self_0),
            Abi::PtxKernel =>
                ::core::fmt::Formatter::write_str(f, "PtxKernel"),
            Abi::Msp430Interrupt =>
                ::core::fmt::Formatter::write_str(f, "Msp430Interrupt"),
            Abi::X86Interrupt =>
                ::core::fmt::Formatter::write_str(f, "X86Interrupt"),
            Abi::GpuKernel =>
                ::core::fmt::Formatter::write_str(f, "GpuKernel"),
            Abi::EfiApi => ::core::fmt::Formatter::write_str(f, "EfiApi"),
            Abi::AvrInterrupt =>
                ::core::fmt::Formatter::write_str(f, "AvrInterrupt"),
            Abi::AvrNonBlockingInterrupt =>
                ::core::fmt::Formatter::write_str(f,
                    "AvrNonBlockingInterrupt"),
            Abi::CCmseNonSecureCall =>
                ::core::fmt::Formatter::write_str(f, "CCmseNonSecureCall"),
            Abi::CCmseNonSecureEntry =>
                ::core::fmt::Formatter::write_str(f, "CCmseNonSecureEntry"),
            Abi::System { unwind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "System", "unwind", &__self_0),
            Abi::RustCall => ::core::fmt::Formatter::write_str(f, "RustCall"),
            Abi::Unadjusted =>
                ::core::fmt::Formatter::write_str(f, "Unadjusted"),
            Abi::RustCold => ::core::fmt::Formatter::write_str(f, "RustCold"),
            Abi::RiscvInterruptM =>
                ::core::fmt::Formatter::write_str(f, "RiscvInterruptM"),
            Abi::RiscvInterruptS =>
                ::core::fmt::Formatter::write_str(f, "RiscvInterruptS"),
            Abi::RustPreserveNone =>
                ::core::fmt::Formatter::write_str(f, "RustPreserveNone"),
            Abi::RustTail => ::core::fmt::Formatter::write_str(f, "RustTail"),
            Abi::RustInvalid =>
                ::core::fmt::Formatter::write_str(f, "RustInvalid"),
            Abi::Custom => ::core::fmt::Formatter::write_str(f, "Custom"),
            Abi::Swift => ::core::fmt::Formatter::write_str(f, "Swift"),
        }
    }
}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 Abi {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    Abi::Rust =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 0u32, "Rust"),
                    Abi::C { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 1u32, "C", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::Cdecl { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 2u32, "Cdecl", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::Stdcall { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 3u32, "Stdcall", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::Fastcall { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 4u32, "Fastcall", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::Vectorcall { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 5u32, "Vectorcall", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::Thiscall { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 6u32, "Thiscall", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::Aapcs { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 7u32, "Aapcs", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::Win64 { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 8u32, "Win64", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::SysV64 { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 9u32, "SysV64", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::PtxKernel =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 10u32, "PtxKernel"),
                    Abi::Msp430Interrupt =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 11u32, "Msp430Interrupt"),
                    Abi::X86Interrupt =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 12u32, "X86Interrupt"),
                    Abi::GpuKernel =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 13u32, "GpuKernel"),
                    Abi::EfiApi =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 14u32, "EfiApi"),
                    Abi::AvrInterrupt =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 15u32, "AvrInterrupt"),
                    Abi::AvrNonBlockingInterrupt =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 16u32, "AvrNonBlockingInterrupt"),
                    Abi::CCmseNonSecureCall =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 17u32, "CCmseNonSecureCall"),
                    Abi::CCmseNonSecureEntry =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 18u32, "CCmseNonSecureEntry"),
                    Abi::System { ref unwind } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "Abi", 19u32, "System", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "unwind", unwind)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    Abi::RustCall =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 20u32, "RustCall"),
                    Abi::Unadjusted =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 21u32, "Unadjusted"),
                    Abi::RustCold =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 22u32, "RustCold"),
                    Abi::RiscvInterruptM =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 23u32, "RiscvInterruptM"),
                    Abi::RiscvInterruptS =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 24u32, "RiscvInterruptS"),
                    Abi::RustPreserveNone =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 25u32, "RustPreserveNone"),
                    Abi::RustTail =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 26u32, "RustTail"),
                    Abi::RustInvalid =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 27u32, "RustInvalid"),
                    Abi::Custom =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 28u32, "Custom"),
                    Abi::Swift =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 29u32, "Swift"),
                }
            }
        }
    };Serialize)]
1128pub enum Abi {
1129    Rust,
1130    C { unwind: bool },
1131    Cdecl { unwind: bool },
1132    Stdcall { unwind: bool },
1133    Fastcall { unwind: bool },
1134    Vectorcall { unwind: bool },
1135    Thiscall { unwind: bool },
1136    Aapcs { unwind: bool },
1137    Win64 { unwind: bool },
1138    SysV64 { unwind: bool },
1139    PtxKernel,
1140    Msp430Interrupt,
1141    X86Interrupt,
1142    GpuKernel,
1143    EfiApi,
1144    AvrInterrupt,
1145    AvrNonBlockingInterrupt,
1146    CCmseNonSecureCall,
1147    CCmseNonSecureEntry,
1148    System { unwind: bool },
1149    RustCall,
1150    Unadjusted,
1151    RustCold,
1152    RiscvInterruptM,
1153    RiscvInterruptS,
1154    RustPreserveNone,
1155    RustTail,
1156    RustInvalid,
1157    Custom,
1158    Swift,
1159}
1160
1161/// A binder represents a possibly generic type and its bound vars.
1162#[derive(#[automatically_derived]
impl<T: ::core::clone::Clone> ::core::clone::Clone for Binder<T> {
    #[inline]
    fn clone(&self) -> Binder<T> {
        Binder {
            value: ::core::clone::Clone::clone(&self.value),
            bound_vars: ::core::clone::Clone::clone(&self.bound_vars),
        }
    }
}Clone, #[automatically_derived]
impl<T: ::core::fmt::Debug> ::core::fmt::Debug for Binder<T> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Binder",
            "value", &self.value, "bound_vars", &&self.bound_vars)
    }
}Debug, #[automatically_derived]
impl<T: ::core::cmp::Eq> ::core::cmp::Eq for Binder<T> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<T>;
        let _: ::core::cmp::AssertParamIsEq<Vec<BoundVariableKind>>;
    }
}Eq, #[automatically_derived]
impl<T: ::core::cmp::PartialEq> ::core::cmp::PartialEq for Binder<T> {
    #[inline]
    fn eq(&self, other: &Binder<T>) -> bool {
        self.value == other.value && self.bound_vars == other.bound_vars
    }
}PartialEq, #[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<T> _serde::Serialize for Binder<T> where T: _serde::Serialize {
            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, "Binder",
                            false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "value", &self.value)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "bound_vars", &self.bound_vars)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1163pub struct Binder<T> {
1164    pub value: T,
1165    pub bound_vars: Vec<BoundVariableKind>,
1166}
1167
1168impl<T> Binder<T> {
1169    /// Create a new binder with the given bound vars.
1170    pub fn bind_with_vars(value: T, bound_vars: Vec<BoundVariableKind>) -> Self {
1171        Binder { value, bound_vars }
1172    }
1173
1174    /// Create a new binder with no bounded variable.
1175    pub fn dummy(value: T) -> Self {
1176        Binder { value, bound_vars: ::alloc::vec::Vec::new()vec![] }
1177    }
1178
1179    pub fn skip_binder(self) -> T {
1180        self.value
1181    }
1182
1183    pub fn map_bound_ref<F, U>(&self, f: F) -> Binder<U>
1184    where
1185        F: FnOnce(&T) -> U,
1186    {
1187        let Binder { value, bound_vars } = self;
1188        let new_value = f(value);
1189        Binder { value: new_value, bound_vars: bound_vars.clone() }
1190    }
1191
1192    pub fn map_bound<F, U>(self, f: F) -> Binder<U>
1193    where
1194        F: FnOnce(T) -> U,
1195    {
1196        let Binder { value, bound_vars } = self;
1197        let new_value = f(value);
1198        Binder { value: new_value, bound_vars }
1199    }
1200}
1201
1202#[derive(#[automatically_derived]
impl<T: ::core::clone::Clone> ::core::clone::Clone for EarlyBinder<T> {
    #[inline]
    fn clone(&self) -> EarlyBinder<T> {
        EarlyBinder { value: ::core::clone::Clone::clone(&self.value) }
    }
}Clone, #[automatically_derived]
impl<T: ::core::fmt::Debug> ::core::fmt::Debug for EarlyBinder<T> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "EarlyBinder",
            "value", &&self.value)
    }
}Debug, #[automatically_derived]
impl<T: ::core::cmp::Eq> ::core::cmp::Eq for EarlyBinder<T> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) { let _: ::core::cmp::AssertParamIsEq<T>; }
}Eq, #[automatically_derived]
impl<T: ::core::cmp::PartialEq> ::core::cmp::PartialEq for EarlyBinder<T> {
    #[inline]
    fn eq(&self, other: &EarlyBinder<T>) -> bool { self.value == other.value }
}PartialEq, #[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<T> _serde::Serialize for EarlyBinder<T> where
            T: _serde::Serialize {
            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,
                            "EarlyBinder", false as usize + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "value", &self.value)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1203pub struct EarlyBinder<T> {
1204    pub value: T,
1205}
1206
1207#[derive(#[automatically_derived]
impl ::core::clone::Clone for BoundVariableKind {
    #[inline]
    fn clone(&self) -> BoundVariableKind {
        match self {
            BoundVariableKind::Ty(__self_0) =>
                BoundVariableKind::Ty(::core::clone::Clone::clone(__self_0)),
            BoundVariableKind::Region(__self_0) =>
                BoundVariableKind::Region(::core::clone::Clone::clone(__self_0)),
            BoundVariableKind::Const => BoundVariableKind::Const,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BoundVariableKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BoundVariableKind::Ty(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
                    &__self_0),
            BoundVariableKind::Region(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Region",
                    &__self_0),
            BoundVariableKind::Const =>
                ::core::fmt::Formatter::write_str(f, "Const"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for BoundVariableKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<BoundTyKind>;
        let _: ::core::cmp::AssertParamIsEq<BoundRegionKind>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for BoundVariableKind {
    #[inline]
    fn eq(&self, other: &BoundVariableKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BoundVariableKind::Ty(__self_0),
                    BoundVariableKind::Ty(__arg1_0)) => __self_0 == __arg1_0,
                (BoundVariableKind::Region(__self_0),
                    BoundVariableKind::Region(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[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 BoundVariableKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    BoundVariableKind::Ty(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "BoundVariableKind", 0u32, "Ty", __field0),
                    BoundVariableKind::Region(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "BoundVariableKind", 1u32, "Region", __field0),
                    BoundVariableKind::Const =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "BoundVariableKind", 2u32, "Const"),
                }
            }
        }
    };Serialize)]
1208pub enum BoundVariableKind {
1209    Ty(BoundTyKind),
1210    Region(BoundRegionKind),
1211    Const,
1212}
1213
1214#[derive(#[automatically_derived]
impl ::core::clone::Clone for BoundTyKind {
    #[inline]
    fn clone(&self) -> BoundTyKind {
        match self {
            BoundTyKind::Anon => BoundTyKind::Anon,
            BoundTyKind::Param(__self_0, __self_1) =>
                BoundTyKind::Param(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for BoundTyKind {
    #[inline]
    fn eq(&self, other: &BoundTyKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BoundTyKind::Param(__self_0, __self_1),
                    BoundTyKind::Param(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BoundTyKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ParamDef>;
        let _: ::core::cmp::AssertParamIsEq<String>;
    }
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for BoundTyKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BoundTyKind::Anon => ::core::fmt::Formatter::write_str(f, "Anon"),
            BoundTyKind::Param(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Param",
                    __self_0, &__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 BoundTyKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    BoundTyKind::Anon =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "BoundTyKind", 0u32, "Anon"),
                    BoundTyKind::Param(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "BoundTyKind", 1u32, "Param", 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)
                    }
                }
            }
        }
    };Serialize)]
1215pub enum BoundTyKind {
1216    Anon,
1217    Param(ParamDef, String),
1218}
1219
1220#[derive(#[automatically_derived]
impl ::core::clone::Clone for BoundRegionKind {
    #[inline]
    fn clone(&self) -> BoundRegionKind {
        match self {
            BoundRegionKind::BrAnon => BoundRegionKind::BrAnon,
            BoundRegionKind::BrNamed(__self_0, __self_1) =>
                BoundRegionKind::BrNamed(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            BoundRegionKind::BrEnv => BoundRegionKind::BrEnv,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BoundRegionKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BoundRegionKind::BrAnon =>
                ::core::fmt::Formatter::write_str(f, "BrAnon"),
            BoundRegionKind::BrNamed(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "BrNamed", __self_0, &__self_1),
            BoundRegionKind::BrEnv =>
                ::core::fmt::Formatter::write_str(f, "BrEnv"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for BoundRegionKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<BrNamedDef>;
        let _: ::core::cmp::AssertParamIsEq<String>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for BoundRegionKind {
    #[inline]
    fn eq(&self, other: &BoundRegionKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BoundRegionKind::BrNamed(__self_0, __self_1),
                    BoundRegionKind::BrNamed(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for BoundRegionKind {
    #[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 {
            BoundRegionKind::BrNamed(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, 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 BoundRegionKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    BoundRegionKind::BrAnon =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "BoundRegionKind", 0u32, "BrAnon"),
                    BoundRegionKind::BrNamed(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "BoundRegionKind", 1u32, "BrNamed", 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)
                    }
                    BoundRegionKind::BrEnv =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "BoundRegionKind", 2u32, "BrEnv"),
                }
            }
        }
    };Serialize)]
1221pub enum BoundRegionKind {
1222    BrAnon,
1223    BrNamed(BrNamedDef, String),
1224    BrEnv,
1225}
1226
1227#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExistentialPredicate {
    #[inline]
    fn clone(&self) -> ExistentialPredicate {
        match self {
            ExistentialPredicate::Trait(__self_0) =>
                ExistentialPredicate::Trait(::core::clone::Clone::clone(__self_0)),
            ExistentialPredicate::Projection(__self_0) =>
                ExistentialPredicate::Projection(::core::clone::Clone::clone(__self_0)),
            ExistentialPredicate::AutoTrait(__self_0) =>
                ExistentialPredicate::AutoTrait(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ExistentialPredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ExistentialPredicate::Trait(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Trait",
                    &__self_0),
            ExistentialPredicate::Projection(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Projection", &__self_0),
            ExistentialPredicate::AutoTrait(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "AutoTrait", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ExistentialPredicate {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ExistentialTraitRef>;
        let _: ::core::cmp::AssertParamIsEq<ExistentialProjection>;
        let _: ::core::cmp::AssertParamIsEq<TraitDef>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ExistentialPredicate {
    #[inline]
    fn eq(&self, other: &ExistentialPredicate) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ExistentialPredicate::Trait(__self_0),
                    ExistentialPredicate::Trait(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ExistentialPredicate::Projection(__self_0),
                    ExistentialPredicate::Projection(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ExistentialPredicate::AutoTrait(__self_0),
                    ExistentialPredicate::AutoTrait(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[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 ExistentialPredicate {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ExistentialPredicate::Trait(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ExistentialPredicate", 0u32, "Trait", __field0),
                    ExistentialPredicate::Projection(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ExistentialPredicate", 1u32, "Projection", __field0),
                    ExistentialPredicate::AutoTrait(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ExistentialPredicate", 2u32, "AutoTrait", __field0),
                }
            }
        }
    };Serialize)]
1228pub enum ExistentialPredicate {
1229    Trait(ExistentialTraitRef),
1230    Projection(ExistentialProjection),
1231    AutoTrait(TraitDef),
1232}
1233
1234/// An existential reference to a trait where `Self` is not included.
1235///
1236/// The `generic_args` will include any other known argument.
1237#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExistentialTraitRef {
    #[inline]
    fn clone(&self) -> ExistentialTraitRef {
        ExistentialTraitRef {
            def_id: ::core::clone::Clone::clone(&self.def_id),
            generic_args: ::core::clone::Clone::clone(&self.generic_args),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ExistentialTraitRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "ExistentialTraitRef", "def_id", &self.def_id, "generic_args",
            &&self.generic_args)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ExistentialTraitRef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TraitDef>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgs>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ExistentialTraitRef {
    #[inline]
    fn eq(&self, other: &ExistentialTraitRef) -> bool {
        self.def_id == other.def_id && self.generic_args == other.generic_args
    }
}PartialEq, #[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 ExistentialTraitRef {
            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,
                            "ExistentialTraitRef", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def_id", &self.def_id)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "generic_args", &self.generic_args)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1238pub struct ExistentialTraitRef {
1239    pub def_id: TraitDef,
1240    pub generic_args: GenericArgs,
1241}
1242
1243impl Binder<ExistentialTraitRef> {
1244    pub fn with_self_ty(&self, self_ty: Ty) -> Binder<TraitRef> {
1245        self.map_bound_ref(|trait_ref| trait_ref.with_self_ty(self_ty))
1246    }
1247}
1248
1249impl ExistentialTraitRef {
1250    pub fn with_self_ty(&self, self_ty: Ty) -> TraitRef {
1251        TraitRef::new(self.def_id, self_ty, &self.generic_args)
1252    }
1253}
1254
1255#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExistentialProjection {
    #[inline]
    fn clone(&self) -> ExistentialProjection {
        ExistentialProjection {
            def_id: ::core::clone::Clone::clone(&self.def_id),
            generic_args: ::core::clone::Clone::clone(&self.generic_args),
            term: ::core::clone::Clone::clone(&self.term),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ExistentialProjection {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "ExistentialProjection", "def_id", &self.def_id, "generic_args",
            &self.generic_args, "term", &&self.term)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ExistentialProjection {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TraitDef>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgs>;
        let _: ::core::cmp::AssertParamIsEq<TermKind>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ExistentialProjection {
    #[inline]
    fn eq(&self, other: &ExistentialProjection) -> bool {
        self.def_id == other.def_id && self.generic_args == other.generic_args
            && self.term == other.term
    }
}PartialEq, #[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 ExistentialProjection {
            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,
                            "ExistentialProjection", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def_id", &self.def_id)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "generic_args", &self.generic_args)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "term", &self.term)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1256pub struct ExistentialProjection {
1257    pub def_id: TraitDef,
1258    pub generic_args: GenericArgs,
1259    pub term: TermKind,
1260}
1261
1262#[derive(#[automatically_derived]
impl ::core::clone::Clone for ParamTy {
    #[inline]
    fn clone(&self) -> ParamTy {
        ParamTy {
            index: ::core::clone::Clone::clone(&self.index),
            name: ::core::clone::Clone::clone(&self.name),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ParamTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "ParamTy",
            "index", &self.index, "name", &&self.name)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ParamTy {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u32>;
        let _: ::core::cmp::AssertParamIsEq<String>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ParamTy {
    #[inline]
    fn eq(&self, other: &ParamTy) -> bool {
        self.index == other.index && self.name == other.name
    }
}PartialEq, #[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 ParamTy {
            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,
                            "ParamTy", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "index", &self.index)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1263pub struct ParamTy {
1264    pub index: u32,
1265    pub name: String,
1266}
1267
1268#[derive(#[automatically_derived]
impl ::core::clone::Clone for BoundTy {
    #[inline]
    fn clone(&self) -> BoundTy {
        BoundTy {
            var: ::core::clone::Clone::clone(&self.var),
            kind: ::core::clone::Clone::clone(&self.kind),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BoundTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "BoundTy",
            "var", &self.var, "kind", &&self.kind)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for BoundTy {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<usize>;
        let _: ::core::cmp::AssertParamIsEq<BoundTyKind>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for BoundTy {
    #[inline]
    fn eq(&self, other: &BoundTy) -> bool {
        self.var == other.var && self.kind == other.kind
    }
}PartialEq, #[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 BoundTy {
            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,
                            "BoundTy", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "var", &self.var)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1269pub struct BoundTy {
1270    pub var: usize,
1271    pub kind: BoundTyKind,
1272}
1273
1274pub type Bytes = Vec<Option<u8>>;
1275
1276/// Size in bytes.
1277pub type Size = usize;
1278
1279#[derive(#[automatically_derived]
impl ::core::clone::Clone for Prov {
    #[inline]
    fn clone(&self) -> Prov {
        let _: ::core::clone::AssertParamIsClone<AllocId>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Prov { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for Prov {
    #[inline]
    fn eq(&self, other: &Prov) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Prov {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<AllocId>;
    }
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for Prov {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Prov", &&self.0)
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for Prov {
    #[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 Prov {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "Prov", &self.0)
            }
        }
    };Serialize)]
1280pub struct Prov(pub AllocId);
1281
1282pub type Align = u64;
1283pub type Promoted = u32;
1284pub type InitMaskMaterialized = Vec<u64>;
1285
1286/// Stores the provenance information of pointers stored in memory.
1287#[derive(#[automatically_derived]
impl ::core::clone::Clone for ProvenanceMap {
    #[inline]
    fn clone(&self) -> ProvenanceMap {
        ProvenanceMap { ptrs: ::core::clone::Clone::clone(&self.ptrs) }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ProvenanceMap {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "ProvenanceMap",
            "ptrs", &&self.ptrs)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ProvenanceMap {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Vec<(Size, Prov)>>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ProvenanceMap {
    #[inline]
    fn eq(&self, other: &ProvenanceMap) -> bool { self.ptrs == other.ptrs }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for ProvenanceMap {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.ptrs, 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 ProvenanceMap {
            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,
                            "ProvenanceMap", false as usize + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "ptrs", &self.ptrs)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1288pub struct ProvenanceMap {
1289    /// Provenance in this map applies from the given offset for an entire pointer-size worth of
1290    /// bytes. Two entries in this map are always at least a pointer size apart.
1291    pub ptrs: Vec<(Size, Prov)>,
1292}
1293
1294#[derive(#[automatically_derived]
impl ::core::clone::Clone for Allocation {
    #[inline]
    fn clone(&self) -> Allocation {
        Allocation {
            bytes: ::core::clone::Clone::clone(&self.bytes),
            provenance: ::core::clone::Clone::clone(&self.provenance),
            align: ::core::clone::Clone::clone(&self.align),
            mutability: ::core::clone::Clone::clone(&self.mutability),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Allocation {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "Allocation",
            "bytes", &self.bytes, "provenance", &self.provenance, "align",
            &self.align, "mutability", &&self.mutability)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Allocation {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Bytes>;
        let _: ::core::cmp::AssertParamIsEq<ProvenanceMap>;
        let _: ::core::cmp::AssertParamIsEq<Align>;
        let _: ::core::cmp::AssertParamIsEq<Mutability>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for Allocation {
    #[inline]
    fn eq(&self, other: &Allocation) -> bool {
        self.bytes == other.bytes && self.provenance == other.provenance &&
                self.align == other.align &&
            self.mutability == other.mutability
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for Allocation {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.bytes, state);
        ::core::hash::Hash::hash(&self.provenance, state);
        ::core::hash::Hash::hash(&self.align, state);
        ::core::hash::Hash::hash(&self.mutability, 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 Allocation {
            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,
                            "Allocation", false as usize + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "bytes", &self.bytes)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "provenance", &self.provenance)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "align", &self.align)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "mutability", &self.mutability)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1295pub struct Allocation {
1296    pub bytes: Bytes,
1297    pub provenance: ProvenanceMap,
1298    pub align: Align,
1299    pub mutability: Mutability,
1300}
1301
1302impl Allocation {
1303    /// Get a vector of bytes for an Allocation that has been fully initialized
1304    pub fn raw_bytes(&self) -> Result<Vec<u8>, Error> {
1305        self.bytes
1306            .iter()
1307            .copied()
1308            .collect::<Option<Vec<_>>>()
1309            .ok_or_else(|| Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Found uninitialized bytes: `{0:?}`",
                    self.bytes))
        }))error!("Found uninitialized bytes: `{:?}`", self.bytes))
1310    }
1311
1312    /// Read a uint value from the specified range.
1313    pub fn read_partial_uint(&self, range: Range<usize>) -> Result<u128, Error> {
1314        if range.end - range.start > 16 {
1315            return Err(Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Allocation is bigger than largest integer"))
        }))error!("Allocation is bigger than largest integer"));
1316        }
1317        if range.end > self.bytes.len() {
1318            return Err(Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Range is out of bounds. Allocation length is `{0}`, but requested range `{1:?}`",
                    self.bytes.len(), range))
        }))error!(
1319                "Range is out of bounds. Allocation length is `{}`, but requested range `{:?}`",
1320                self.bytes.len(),
1321                range
1322            ));
1323        }
1324        let raw = self.bytes[range]
1325            .iter()
1326            .copied()
1327            .collect::<Option<Vec<_>>>()
1328            .ok_or_else(|| Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Found uninitialized bytes: `{0:?}`",
                    self.bytes))
        }))error!("Found uninitialized bytes: `{:?}`", self.bytes))?;
1329        read_target_uint(&raw)
1330    }
1331
1332    /// Read this allocation and try to convert it to an unassigned integer.
1333    pub fn read_uint(&self) -> Result<u128, Error> {
1334        if self.bytes.len() > 16 {
1335            return Err(Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Allocation is bigger than largest integer"))
        }))error!("Allocation is bigger than largest integer"));
1336        }
1337        let raw = self.raw_bytes()?;
1338        read_target_uint(&raw)
1339    }
1340
1341    /// Read this allocation and try to convert it to a signed integer.
1342    pub fn read_int(&self) -> Result<i128, Error> {
1343        if self.bytes.len() > 16 {
1344            return Err(Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Allocation is bigger than largest integer"))
        }))error!("Allocation is bigger than largest integer"));
1345        }
1346        let raw = self.raw_bytes()?;
1347        read_target_int(&raw)
1348    }
1349
1350    /// Read this allocation and try to convert it to a boolean.
1351    pub fn read_bool(&self) -> Result<bool, Error> {
1352        match self.read_int()? {
1353            0 => Ok(false),
1354            1 => Ok(true),
1355            val => Err(Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Unexpected value for bool: `{0}`",
                    val))
        }))error!("Unexpected value for bool: `{val}`")),
1356        }
1357    }
1358
1359    /// Read this allocation as a pointer and return whether it represents a `null` pointer.
1360    pub fn is_null(&self) -> Result<bool, Error> {
1361        let len = self.bytes.len();
1362        let ptr_len = MachineInfo::target_pointer_width().bytes();
1363        if len != ptr_len {
1364            return Err(Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Expected width of pointer (`{0}`), but found: `{1}`",
                    ptr_len, len))
        }))error!("Expected width of pointer (`{ptr_len}`), but found: `{len}`"));
1365        }
1366        Ok(self.read_uint()? == 0 && self.provenance.ptrs.is_empty())
1367    }
1368}
1369
1370#[derive(#[automatically_derived]
impl ::core::clone::Clone for ConstantKind {
    #[inline]
    fn clone(&self) -> ConstantKind {
        match self {
            ConstantKind::Ty(__self_0) =>
                ConstantKind::Ty(::core::clone::Clone::clone(__self_0)),
            ConstantKind::Allocated(__self_0) =>
                ConstantKind::Allocated(::core::clone::Clone::clone(__self_0)),
            ConstantKind::Unevaluated(__self_0) =>
                ConstantKind::Unevaluated(::core::clone::Clone::clone(__self_0)),
            ConstantKind::Param(__self_0) =>
                ConstantKind::Param(::core::clone::Clone::clone(__self_0)),
            ConstantKind::ZeroSized => ConstantKind::ZeroSized,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ConstantKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ConstantKind::Ty(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
                    &__self_0),
            ConstantKind::Allocated(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Allocated", &__self_0),
            ConstantKind::Unevaluated(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Unevaluated", &__self_0),
            ConstantKind::Param(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Param",
                    &__self_0),
            ConstantKind::ZeroSized =>
                ::core::fmt::Formatter::write_str(f, "ZeroSized"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ConstantKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TyConst>;
        let _: ::core::cmp::AssertParamIsEq<Allocation>;
        let _: ::core::cmp::AssertParamIsEq<UnevaluatedConst>;
        let _: ::core::cmp::AssertParamIsEq<ParamConst>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ConstantKind {
    #[inline]
    fn eq(&self, other: &ConstantKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ConstantKind::Ty(__self_0), ConstantKind::Ty(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ConstantKind::Allocated(__self_0),
                    ConstantKind::Allocated(__arg1_0)) => __self_0 == __arg1_0,
                (ConstantKind::Unevaluated(__self_0),
                    ConstantKind::Unevaluated(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ConstantKind::Param(__self_0), ConstantKind::Param(__arg1_0))
                    => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for ConstantKind {
    #[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 {
            ConstantKind::Ty(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            ConstantKind::Allocated(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            ConstantKind::Unevaluated(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            ConstantKind::Param(__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 ConstantKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ConstantKind::Ty(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ConstantKind", 0u32, "Ty", __field0),
                    ConstantKind::Allocated(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ConstantKind", 1u32, "Allocated", __field0),
                    ConstantKind::Unevaluated(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ConstantKind", 2u32, "Unevaluated", __field0),
                    ConstantKind::Param(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ConstantKind", 3u32, "Param", __field0),
                    ConstantKind::ZeroSized =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ConstantKind", 4u32, "ZeroSized"),
                }
            }
        }
    };Serialize)]
1371pub enum ConstantKind {
1372    Ty(TyConst),
1373    Allocated(Allocation),
1374    Unevaluated(UnevaluatedConst),
1375    Param(ParamConst),
1376    /// Store ZST constants.
1377    /// We have to special handle these constants since its type might be generic.
1378    ZeroSized,
1379}
1380
1381#[derive(#[automatically_derived]
impl ::core::clone::Clone for ParamConst {
    #[inline]
    fn clone(&self) -> ParamConst {
        ParamConst {
            index: ::core::clone::Clone::clone(&self.index),
            name: ::core::clone::Clone::clone(&self.name),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ParamConst {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "ParamConst",
            "index", &self.index, "name", &&self.name)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ParamConst {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u32>;
        let _: ::core::cmp::AssertParamIsEq<String>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ParamConst {
    #[inline]
    fn eq(&self, other: &ParamConst) -> bool {
        self.index == other.index && self.name == other.name
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for ParamConst {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.index, state);
        ::core::hash::Hash::hash(&self.name, 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 ParamConst {
            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,
                            "ParamConst", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "index", &self.index)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1382pub struct ParamConst {
1383    pub index: u32,
1384    pub name: String,
1385}
1386
1387#[derive(#[automatically_derived]
impl ::core::clone::Clone for UnevaluatedConst {
    #[inline]
    fn clone(&self) -> UnevaluatedConst {
        UnevaluatedConst {
            def: ::core::clone::Clone::clone(&self.def),
            args: ::core::clone::Clone::clone(&self.args),
            promoted: ::core::clone::Clone::clone(&self.promoted),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for UnevaluatedConst {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "UnevaluatedConst", "def", &self.def, "args", &self.args,
            "promoted", &&self.promoted)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for UnevaluatedConst {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ConstDef>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgs>;
        let _: ::core::cmp::AssertParamIsEq<Option<Promoted>>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for UnevaluatedConst {
    #[inline]
    fn eq(&self, other: &UnevaluatedConst) -> bool {
        self.def == other.def && self.args == other.args &&
            self.promoted == other.promoted
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for UnevaluatedConst {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.def, state);
        ::core::hash::Hash::hash(&self.args, state);
        ::core::hash::Hash::hash(&self.promoted, 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 UnevaluatedConst {
            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,
                            "UnevaluatedConst", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def", &self.def)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "args", &self.args)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "promoted", &self.promoted)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1388pub struct UnevaluatedConst {
1389    pub def: ConstDef,
1390    pub args: GenericArgs,
1391    pub promoted: Option<Promoted>,
1392}
1393
1394#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitSpecializationKind {
    #[inline]
    fn clone(&self) -> TraitSpecializationKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for TraitSpecializationKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for TraitSpecializationKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                TraitSpecializationKind::None => "None",
                TraitSpecializationKind::Marker => "Marker",
                TraitSpecializationKind::AlwaysApplicable =>
                    "AlwaysApplicable",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for TraitSpecializationKind {
    #[inline]
    fn eq(&self, other: &TraitSpecializationKind) -> 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 TraitSpecializationKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[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 TraitSpecializationKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    TraitSpecializationKind::None =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "TraitSpecializationKind", 0u32, "None"),
                    TraitSpecializationKind::Marker =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "TraitSpecializationKind", 1u32, "Marker"),
                    TraitSpecializationKind::AlwaysApplicable =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "TraitSpecializationKind", 2u32, "AlwaysApplicable"),
                }
            }
        }
    };Serialize)]
1395pub enum TraitSpecializationKind {
1396    None,
1397    Marker,
1398    AlwaysApplicable,
1399}
1400
1401#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitDecl {
    #[inline]
    fn clone(&self) -> TraitDecl {
        TraitDecl {
            def_id: ::core::clone::Clone::clone(&self.def_id),
            safety: ::core::clone::Clone::clone(&self.safety),
            paren_sugar: ::core::clone::Clone::clone(&self.paren_sugar),
            has_auto_impl: ::core::clone::Clone::clone(&self.has_auto_impl),
            is_marker: ::core::clone::Clone::clone(&self.is_marker),
            is_coinductive: ::core::clone::Clone::clone(&self.is_coinductive),
            skip_array_during_method_dispatch: ::core::clone::Clone::clone(&self.skip_array_during_method_dispatch),
            skip_boxed_slice_during_method_dispatch: ::core::clone::Clone::clone(&self.skip_boxed_slice_during_method_dispatch),
            specialization_kind: ::core::clone::Clone::clone(&self.specialization_kind),
            must_implement_one_of: ::core::clone::Clone::clone(&self.must_implement_one_of),
            force_dyn_incompatible: ::core::clone::Clone::clone(&self.force_dyn_incompatible),
            deny_explicit_impl: ::core::clone::Clone::clone(&self.deny_explicit_impl),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TraitDecl {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["def_id", "safety", "paren_sugar", "has_auto_impl", "is_marker",
                        "is_coinductive", "skip_array_during_method_dispatch",
                        "skip_boxed_slice_during_method_dispatch",
                        "specialization_kind", "must_implement_one_of",
                        "force_dyn_incompatible", "deny_explicit_impl"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.def_id, &self.safety, &self.paren_sugar,
                        &self.has_auto_impl, &self.is_marker, &self.is_coinductive,
                        &self.skip_array_during_method_dispatch,
                        &self.skip_boxed_slice_during_method_dispatch,
                        &self.specialization_kind, &self.must_implement_one_of,
                        &self.force_dyn_incompatible, &&self.deny_explicit_impl];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "TraitDecl",
            names, values)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for TraitDecl {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TraitDef>;
        let _: ::core::cmp::AssertParamIsEq<Safety>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<TraitSpecializationKind>;
        let _: ::core::cmp::AssertParamIsEq<Option<Vec<Ident>>>;
        let _: ::core::cmp::AssertParamIsEq<Option<Span>>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for TraitDecl {
    #[inline]
    fn eq(&self, other: &TraitDecl) -> bool {
        self.paren_sugar == other.paren_sugar &&
                                                    self.has_auto_impl == other.has_auto_impl &&
                                                self.is_marker == other.is_marker &&
                                            self.is_coinductive == other.is_coinductive &&
                                        self.skip_array_during_method_dispatch ==
                                            other.skip_array_during_method_dispatch &&
                                    self.skip_boxed_slice_during_method_dispatch ==
                                        other.skip_boxed_slice_during_method_dispatch &&
                                self.deny_explicit_impl == other.deny_explicit_impl &&
                            self.def_id == other.def_id && self.safety == other.safety
                    && self.specialization_kind == other.specialization_kind &&
                self.must_implement_one_of == other.must_implement_one_of &&
            self.force_dyn_incompatible == other.force_dyn_incompatible
    }
}PartialEq, #[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 TraitDecl {
            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,
                            "TraitDecl",
                            false as usize + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +
                                1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def_id", &self.def_id)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "safety", &self.safety)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "paren_sugar", &self.paren_sugar)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "has_auto_impl", &self.has_auto_impl)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_marker", &self.is_marker)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "is_coinductive", &self.is_coinductive)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "skip_array_during_method_dispatch",
                        &self.skip_array_during_method_dispatch)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "skip_boxed_slice_during_method_dispatch",
                        &self.skip_boxed_slice_during_method_dispatch)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "specialization_kind", &self.specialization_kind)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "must_implement_one_of", &self.must_implement_one_of)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "force_dyn_incompatible", &self.force_dyn_incompatible)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "deny_explicit_impl", &self.deny_explicit_impl)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1402pub struct TraitDecl {
1403    pub def_id: TraitDef,
1404    pub safety: Safety,
1405    pub paren_sugar: bool,
1406    pub has_auto_impl: bool,
1407    pub is_marker: bool,
1408    pub is_coinductive: bool,
1409    pub skip_array_during_method_dispatch: bool,
1410    pub skip_boxed_slice_during_method_dispatch: bool,
1411    pub specialization_kind: TraitSpecializationKind,
1412    pub must_implement_one_of: Option<Vec<Ident>>,
1413    pub force_dyn_incompatible: Option<Span>,
1414    pub deny_explicit_impl: bool,
1415}
1416
1417impl TraitDecl {
1418    pub fn generics_of(&self) -> Generics {
1419        with(|cx| cx.generics_of(self.def_id.0))
1420    }
1421
1422    pub fn predicates_of(&self) -> GenericPredicates {
1423        with(|cx| cx.predicates_of(self.def_id.0))
1424    }
1425
1426    pub fn explicit_predicates_of(&self) -> GenericPredicates {
1427        with(|cx| cx.explicit_predicates_of(self.def_id.0))
1428    }
1429}
1430
1431pub type ImplTrait = EarlyBinder<TraitRef>;
1432
1433/// A complete reference to a trait, i.e., one where `Self` is known.
1434#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitRef {
    #[inline]
    fn clone(&self) -> TraitRef {
        TraitRef {
            def_id: ::core::clone::Clone::clone(&self.def_id),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TraitRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "TraitRef",
            "def_id", &self.def_id, "args", &&self.args)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for TraitRef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TraitDef>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgs>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for TraitRef {
    #[inline]
    fn eq(&self, other: &TraitRef) -> bool {
        self.def_id == other.def_id && self.args == other.args
    }
}PartialEq, #[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 TraitRef {
            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,
                            "TraitRef", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def_id", &self.def_id)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "args", &self.args)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1435pub struct TraitRef {
1436    pub def_id: TraitDef,
1437    /// The generic arguments for this definition.
1438    /// The first element must always be type, and it represents `Self`.
1439    args: GenericArgs,
1440}
1441
1442impl TraitRef {
1443    pub fn new(def_id: TraitDef, self_ty: Ty, gen_args: &GenericArgs) -> TraitRef {
1444        let mut args = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
        [GenericArgKind::Type(self_ty)]))vec![GenericArgKind::Type(self_ty)];
1445        args.extend_from_slice(&gen_args.0);
1446        TraitRef { def_id, args: GenericArgs(args) }
1447    }
1448
1449    pub fn try_new(def_id: TraitDef, args: GenericArgs) -> Result<TraitRef, ()> {
1450        match &args.0[..] {
1451            [GenericArgKind::Type(_), ..] => Ok(TraitRef { def_id, args }),
1452            _ => Err(()),
1453        }
1454    }
1455
1456    pub fn args(&self) -> &GenericArgs {
1457        &self.args
1458    }
1459
1460    pub fn self_ty(&self) -> Ty {
1461        let GenericArgKind::Type(self_ty) = self.args.0[0] else {
1462            {
    ::core::panicking::panic_fmt(format_args!("Self must be a type, but found: {0:?}",
            self.args.0[0]));
}panic!("Self must be a type, but found: {:?}", self.args.0[0])
1463        };
1464        self_ty
1465    }
1466
1467    /// Retrieve all vtable entries.
1468    pub fn vtable_entries(&self) -> Vec<VtblEntry> {
1469        with(|cx| cx.vtable_entries(self))
1470    }
1471
1472    /// Returns the vtable entry at the given index.
1473    ///
1474    /// Returns `None` if the index is out of bounds.
1475    pub fn vtable_entry(&self, idx: usize) -> Option<VtblEntry> {
1476        with(|cx| cx.vtable_entry(self, idx))
1477    }
1478}
1479
1480#[derive(#[automatically_derived]
impl ::core::clone::Clone for Generics {
    #[inline]
    fn clone(&self) -> Generics {
        Generics {
            parent: ::core::clone::Clone::clone(&self.parent),
            parent_count: ::core::clone::Clone::clone(&self.parent_count),
            params: ::core::clone::Clone::clone(&self.params),
            param_def_id_to_index: ::core::clone::Clone::clone(&self.param_def_id_to_index),
            has_self: ::core::clone::Clone::clone(&self.has_self),
            has_late_bound_regions: ::core::clone::Clone::clone(&self.has_late_bound_regions),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Generics {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["parent", "parent_count", "params", "param_def_id_to_index",
                        "has_self", "has_late_bound_regions"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.parent, &self.parent_count, &self.params,
                        &self.param_def_id_to_index, &self.has_self,
                        &&self.has_late_bound_regions];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Generics",
            names, values)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Generics {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Option<GenericDef>>;
        let _: ::core::cmp::AssertParamIsEq<usize>;
        let _: ::core::cmp::AssertParamIsEq<Vec<GenericParamDef>>;
        let _: ::core::cmp::AssertParamIsEq<Vec<(GenericDef, u32)>>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<Option<Span>>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for Generics {
    #[inline]
    fn eq(&self, other: &Generics) -> bool {
        self.has_self == other.has_self && self.parent == other.parent &&
                        self.parent_count == other.parent_count &&
                    self.params == other.params &&
                self.param_def_id_to_index == other.param_def_id_to_index &&
            self.has_late_bound_regions == other.has_late_bound_regions
    }
}PartialEq, #[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 Generics {
            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,
                            "Generics", false as usize + 1 + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "parent", &self.parent)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "parent_count", &self.parent_count)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "params", &self.params)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "param_def_id_to_index", &self.param_def_id_to_index)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "has_self", &self.has_self)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "has_late_bound_regions", &self.has_late_bound_regions)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1481pub struct Generics {
1482    pub parent: Option<GenericDef>,
1483    pub parent_count: usize,
1484    pub params: Vec<GenericParamDef>,
1485    pub param_def_id_to_index: Vec<(GenericDef, u32)>,
1486    pub has_self: bool,
1487    pub has_late_bound_regions: Option<Span>,
1488}
1489
1490#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericParamDefKind {
    #[inline]
    fn clone(&self) -> GenericParamDefKind {
        match self {
            GenericParamDefKind::Lifetime => GenericParamDefKind::Lifetime,
            GenericParamDefKind::Type {
                has_default: __self_0, synthetic: __self_1 } =>
                GenericParamDefKind::Type {
                    has_default: ::core::clone::Clone::clone(__self_0),
                    synthetic: ::core::clone::Clone::clone(__self_1),
                },
            GenericParamDefKind::Const { has_default: __self_0 } =>
                GenericParamDefKind::Const {
                    has_default: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for GenericParamDefKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericParamDefKind::Lifetime =>
                ::core::fmt::Formatter::write_str(f, "Lifetime"),
            GenericParamDefKind::Type {
                has_default: __self_0, synthetic: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Type",
                    "has_default", __self_0, "synthetic", &__self_1),
            GenericParamDefKind::Const { has_default: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
                    "has_default", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for GenericParamDefKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for GenericParamDefKind {
    #[inline]
    fn eq(&self, other: &GenericParamDefKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (GenericParamDefKind::Type {
                    has_default: __self_0, synthetic: __self_1 },
                    GenericParamDefKind::Type {
                    has_default: __arg1_0, synthetic: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (GenericParamDefKind::Const { has_default: __self_0 },
                    GenericParamDefKind::Const { has_default: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[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 GenericParamDefKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    GenericParamDefKind::Lifetime =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "GenericParamDefKind", 0u32, "Lifetime"),
                    GenericParamDefKind::Type { ref has_default, ref synthetic }
                        => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "GenericParamDefKind", 1u32, "Type", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "has_default", has_default)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "synthetic", synthetic)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    GenericParamDefKind::Const { ref has_default } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "GenericParamDefKind", 2u32, "Const", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "has_default", has_default)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
1491pub enum GenericParamDefKind {
1492    Lifetime,
1493    Type { has_default: bool, synthetic: bool },
1494    Const { has_default: bool },
1495}
1496
1497#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericParamDef {
    #[inline]
    fn clone(&self) -> GenericParamDef {
        GenericParamDef {
            name: ::core::clone::Clone::clone(&self.name),
            def_id: ::core::clone::Clone::clone(&self.def_id),
            index: ::core::clone::Clone::clone(&self.index),
            pure_wrt_drop: ::core::clone::Clone::clone(&self.pure_wrt_drop),
            kind: ::core::clone::Clone::clone(&self.kind),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for GenericParamDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f,
            "GenericParamDef", "name", &self.name, "def_id", &self.def_id,
            "index", &self.index, "pure_wrt_drop", &self.pure_wrt_drop,
            "kind", &&self.kind)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for GenericParamDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<super::Symbol>;
        let _: ::core::cmp::AssertParamIsEq<GenericDef>;
        let _: ::core::cmp::AssertParamIsEq<u32>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<GenericParamDefKind>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for GenericParamDef {
    #[inline]
    fn eq(&self, other: &GenericParamDef) -> bool {
        self.index == other.index && self.pure_wrt_drop == other.pure_wrt_drop
                    && self.name == other.name && self.def_id == other.def_id &&
            self.kind == other.kind
    }
}PartialEq, #[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 GenericParamDef {
            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,
                            "GenericParamDef", false as usize + 1 + 1 + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "name", &self.name)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def_id", &self.def_id)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "index", &self.index)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "pure_wrt_drop", &self.pure_wrt_drop)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1498pub struct GenericParamDef {
1499    pub name: super::Symbol,
1500    pub def_id: GenericDef,
1501    pub index: u32,
1502    pub pure_wrt_drop: bool,
1503    pub kind: GenericParamDefKind,
1504}
1505
1506pub struct GenericPredicates {
1507    pub parent: Option<TraitDef>,
1508    pub predicates: Vec<(PredicateKind, Span)>,
1509}
1510
1511#[derive(#[automatically_derived]
impl ::core::clone::Clone for PredicateKind {
    #[inline]
    fn clone(&self) -> PredicateKind {
        match self {
            PredicateKind::Clause(__self_0) =>
                PredicateKind::Clause(::core::clone::Clone::clone(__self_0)),
            PredicateKind::DynCompatible(__self_0) =>
                PredicateKind::DynCompatible(::core::clone::Clone::clone(__self_0)),
            PredicateKind::SubType(__self_0) =>
                PredicateKind::SubType(::core::clone::Clone::clone(__self_0)),
            PredicateKind::Coerce(__self_0) =>
                PredicateKind::Coerce(::core::clone::Clone::clone(__self_0)),
            PredicateKind::ConstEquate(__self_0, __self_1) =>
                PredicateKind::ConstEquate(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            PredicateKind::Ambiguous => PredicateKind::Ambiguous,
            PredicateKind::AliasRelate(__self_0, __self_1, __self_2) =>
                PredicateKind::AliasRelate(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for PredicateKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            PredicateKind::Clause(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Clause",
                    &__self_0),
            PredicateKind::DynCompatible(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DynCompatible", &__self_0),
            PredicateKind::SubType(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "SubType", &__self_0),
            PredicateKind::Coerce(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Coerce",
                    &__self_0),
            PredicateKind::ConstEquate(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ConstEquate", __self_0, &__self_1),
            PredicateKind::Ambiguous =>
                ::core::fmt::Formatter::write_str(f, "Ambiguous"),
            PredicateKind::AliasRelate(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "AliasRelate", __self_0, __self_1, &__self_2),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for PredicateKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ClauseKind>;
        let _: ::core::cmp::AssertParamIsEq<TraitDef>;
        let _: ::core::cmp::AssertParamIsEq<SubtypePredicate>;
        let _: ::core::cmp::AssertParamIsEq<CoercePredicate>;
        let _: ::core::cmp::AssertParamIsEq<TyConst>;
        let _: ::core::cmp::AssertParamIsEq<TermKind>;
        let _: ::core::cmp::AssertParamIsEq<AliasRelationDirection>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for PredicateKind {
    #[inline]
    fn eq(&self, other: &PredicateKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (PredicateKind::Clause(__self_0),
                    PredicateKind::Clause(__arg1_0)) => __self_0 == __arg1_0,
                (PredicateKind::DynCompatible(__self_0),
                    PredicateKind::DynCompatible(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (PredicateKind::SubType(__self_0),
                    PredicateKind::SubType(__arg1_0)) => __self_0 == __arg1_0,
                (PredicateKind::Coerce(__self_0),
                    PredicateKind::Coerce(__arg1_0)) => __self_0 == __arg1_0,
                (PredicateKind::ConstEquate(__self_0, __self_1),
                    PredicateKind::ConstEquate(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (PredicateKind::AliasRelate(__self_0, __self_1, __self_2),
                    PredicateKind::AliasRelate(__arg1_0, __arg1_1, __arg1_2)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                _ => true,
            }
    }
}PartialEq, #[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 PredicateKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    PredicateKind::Clause(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "PredicateKind", 0u32, "Clause", __field0),
                    PredicateKind::DynCompatible(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "PredicateKind", 1u32, "DynCompatible", __field0),
                    PredicateKind::SubType(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "PredicateKind", 2u32, "SubType", __field0),
                    PredicateKind::Coerce(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "PredicateKind", 3u32, "Coerce", __field0),
                    PredicateKind::ConstEquate(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "PredicateKind", 4u32, "ConstEquate", 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)
                    }
                    PredicateKind::Ambiguous =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "PredicateKind", 5u32, "Ambiguous"),
                    PredicateKind::AliasRelate(ref __field0, ref __field1,
                        ref __field2) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "PredicateKind", 6u32, "AliasRelate", 0 + 1 + 1 + 1)?;
                        _serde::ser::SerializeTupleVariant::serialize_field(&mut __serde_state,
                                __field0)?;
                        _serde::ser::SerializeTupleVariant::serialize_field(&mut __serde_state,
                                __field1)?;
                        _serde::ser::SerializeTupleVariant::serialize_field(&mut __serde_state,
                                __field2)?;
                        _serde::ser::SerializeTupleVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
1512pub enum PredicateKind {
1513    Clause(ClauseKind),
1514    DynCompatible(TraitDef),
1515    SubType(SubtypePredicate),
1516    Coerce(CoercePredicate),
1517    ConstEquate(TyConst, TyConst),
1518    Ambiguous,
1519    AliasRelate(TermKind, TermKind, AliasRelationDirection),
1520}
1521
1522#[derive(#[automatically_derived]
impl ::core::clone::Clone for ClauseKind {
    #[inline]
    fn clone(&self) -> ClauseKind {
        match self {
            ClauseKind::Trait(__self_0) =>
                ClauseKind::Trait(::core::clone::Clone::clone(__self_0)),
            ClauseKind::RegionOutlives(__self_0) =>
                ClauseKind::RegionOutlives(::core::clone::Clone::clone(__self_0)),
            ClauseKind::TypeOutlives(__self_0) =>
                ClauseKind::TypeOutlives(::core::clone::Clone::clone(__self_0)),
            ClauseKind::Projection(__self_0) =>
                ClauseKind::Projection(::core::clone::Clone::clone(__self_0)),
            ClauseKind::ConstArgHasType(__self_0, __self_1) =>
                ClauseKind::ConstArgHasType(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ClauseKind::WellFormed(__self_0) =>
                ClauseKind::WellFormed(::core::clone::Clone::clone(__self_0)),
            ClauseKind::ConstEvaluatable(__self_0) =>
                ClauseKind::ConstEvaluatable(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ClauseKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ClauseKind::Trait(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Trait",
                    &__self_0),
            ClauseKind::RegionOutlives(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "RegionOutlives", &__self_0),
            ClauseKind::TypeOutlives(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TypeOutlives", &__self_0),
            ClauseKind::Projection(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Projection", &__self_0),
            ClauseKind::ConstArgHasType(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ConstArgHasType", __self_0, &__self_1),
            ClauseKind::WellFormed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "WellFormed", &__self_0),
            ClauseKind::ConstEvaluatable(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ConstEvaluatable", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ClauseKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TraitPredicate>;
        let _: ::core::cmp::AssertParamIsEq<RegionOutlivesPredicate>;
        let _: ::core::cmp::AssertParamIsEq<TypeOutlivesPredicate>;
        let _: ::core::cmp::AssertParamIsEq<ProjectionPredicate>;
        let _: ::core::cmp::AssertParamIsEq<TyConst>;
        let _: ::core::cmp::AssertParamIsEq<Ty>;
        let _: ::core::cmp::AssertParamIsEq<TermKind>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ClauseKind {
    #[inline]
    fn eq(&self, other: &ClauseKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ClauseKind::Trait(__self_0), ClauseKind::Trait(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ClauseKind::RegionOutlives(__self_0),
                    ClauseKind::RegionOutlives(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (ClauseKind::TypeOutlives(__self_0),
                    ClauseKind::TypeOutlives(__arg1_0)) => __self_0 == __arg1_0,
                (ClauseKind::Projection(__self_0),
                    ClauseKind::Projection(__arg1_0)) => __self_0 == __arg1_0,
                (ClauseKind::ConstArgHasType(__self_0, __self_1),
                    ClauseKind::ConstArgHasType(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (ClauseKind::WellFormed(__self_0),
                    ClauseKind::WellFormed(__arg1_0)) => __self_0 == __arg1_0,
                (ClauseKind::ConstEvaluatable(__self_0),
                    ClauseKind::ConstEvaluatable(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[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 ClauseKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ClauseKind::Trait(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ClauseKind", 0u32, "Trait", __field0),
                    ClauseKind::RegionOutlives(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ClauseKind", 1u32, "RegionOutlives", __field0),
                    ClauseKind::TypeOutlives(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ClauseKind", 2u32, "TypeOutlives", __field0),
                    ClauseKind::Projection(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ClauseKind", 3u32, "Projection", __field0),
                    ClauseKind::ConstArgHasType(ref __field0, ref __field1) => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_tuple_variant(__serializer,
                                    "ClauseKind", 4u32, "ConstArgHasType", 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)
                    }
                    ClauseKind::WellFormed(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ClauseKind", 5u32, "WellFormed", __field0),
                    ClauseKind::ConstEvaluatable(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "ClauseKind", 6u32, "ConstEvaluatable", __field0),
                }
            }
        }
    };Serialize)]
1523pub enum ClauseKind {
1524    Trait(TraitPredicate),
1525    RegionOutlives(RegionOutlivesPredicate),
1526    TypeOutlives(TypeOutlivesPredicate),
1527    Projection(ProjectionPredicate),
1528    ConstArgHasType(TyConst, Ty),
1529    WellFormed(TermKind),
1530    ConstEvaluatable(TyConst),
1531}
1532
1533#[derive(#[automatically_derived]
impl ::core::clone::Clone for ClosureKind {
    #[inline]
    fn clone(&self) -> ClosureKind {
        match self {
            ClosureKind::Fn => ClosureKind::Fn,
            ClosureKind::FnMut => ClosureKind::FnMut,
            ClosureKind::FnOnce => ClosureKind::FnOnce,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ClosureKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                ClosureKind::Fn => "Fn",
                ClosureKind::FnMut => "FnMut",
                ClosureKind::FnOnce => "FnOnce",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ClosureKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ClosureKind {
    #[inline]
    fn eq(&self, other: &ClosureKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[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 ClosureKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ClosureKind::Fn =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ClosureKind", 0u32, "Fn"),
                    ClosureKind::FnMut =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ClosureKind", 1u32, "FnMut"),
                    ClosureKind::FnOnce =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ClosureKind", 2u32, "FnOnce"),
                }
            }
        }
    };Serialize)]
1534pub enum ClosureKind {
1535    Fn,
1536    FnMut,
1537    FnOnce,
1538}
1539
1540#[derive(#[automatically_derived]
impl ::core::clone::Clone for SubtypePredicate {
    #[inline]
    fn clone(&self) -> SubtypePredicate {
        SubtypePredicate {
            a: ::core::clone::Clone::clone(&self.a),
            b: ::core::clone::Clone::clone(&self.b),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for SubtypePredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "SubtypePredicate", "a", &self.a, "b", &&self.b)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for SubtypePredicate {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ty>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for SubtypePredicate {
    #[inline]
    fn eq(&self, other: &SubtypePredicate) -> bool {
        self.a == other.a && self.b == other.b
    }
}PartialEq, #[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 SubtypePredicate {
            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,
                            "SubtypePredicate", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "a", &self.a)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "b", &self.b)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1541pub struct SubtypePredicate {
1542    pub a: Ty,
1543    pub b: Ty,
1544}
1545
1546#[derive(#[automatically_derived]
impl ::core::clone::Clone for CoercePredicate {
    #[inline]
    fn clone(&self) -> CoercePredicate {
        CoercePredicate {
            a: ::core::clone::Clone::clone(&self.a),
            b: ::core::clone::Clone::clone(&self.b),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for CoercePredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "CoercePredicate", "a", &self.a, "b", &&self.b)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for CoercePredicate {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ty>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for CoercePredicate {
    #[inline]
    fn eq(&self, other: &CoercePredicate) -> bool {
        self.a == other.a && self.b == other.b
    }
}PartialEq, #[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 CoercePredicate {
            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,
                            "CoercePredicate", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "a", &self.a)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "b", &self.b)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1547pub struct CoercePredicate {
1548    pub a: Ty,
1549    pub b: Ty,
1550}
1551
1552#[derive(#[automatically_derived]
impl ::core::clone::Clone for AliasRelationDirection {
    #[inline]
    fn clone(&self) -> AliasRelationDirection {
        match self {
            AliasRelationDirection::Equate => AliasRelationDirection::Equate,
            AliasRelationDirection::Subtype =>
                AliasRelationDirection::Subtype,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AliasRelationDirection {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AliasRelationDirection::Equate => "Equate",
                AliasRelationDirection::Subtype => "Subtype",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for AliasRelationDirection {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for AliasRelationDirection {
    #[inline]
    fn eq(&self, other: &AliasRelationDirection) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[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 AliasRelationDirection {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    AliasRelationDirection::Equate =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AliasRelationDirection", 0u32, "Equate"),
                    AliasRelationDirection::Subtype =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AliasRelationDirection", 1u32, "Subtype"),
                }
            }
        }
    };Serialize)]
1553pub enum AliasRelationDirection {
1554    Equate,
1555    Subtype,
1556}
1557
1558#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitPredicate {
    #[inline]
    fn clone(&self) -> TraitPredicate {
        TraitPredicate {
            trait_ref: ::core::clone::Clone::clone(&self.trait_ref),
            polarity: ::core::clone::Clone::clone(&self.polarity),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TraitPredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "TraitPredicate", "trait_ref", &self.trait_ref, "polarity",
            &&self.polarity)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for TraitPredicate {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TraitRef>;
        let _: ::core::cmp::AssertParamIsEq<PredicatePolarity>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for TraitPredicate {
    #[inline]
    fn eq(&self, other: &TraitPredicate) -> bool {
        self.trait_ref == other.trait_ref && self.polarity == other.polarity
    }
}PartialEq, #[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 TraitPredicate {
            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,
                            "TraitPredicate", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "trait_ref", &self.trait_ref)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "polarity", &self.polarity)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1559pub struct TraitPredicate {
1560    pub trait_ref: TraitRef,
1561    pub polarity: PredicatePolarity,
1562}
1563
1564#[derive(#[automatically_derived]
impl<A: ::core::clone::Clone, B: ::core::clone::Clone> ::core::clone::Clone
    for OutlivesPredicate<A, B> {
    #[inline]
    fn clone(&self) -> OutlivesPredicate<A, B> {
        OutlivesPredicate(::core::clone::Clone::clone(&self.0),
            ::core::clone::Clone::clone(&self.1))
    }
}Clone, #[automatically_derived]
impl<A: ::core::fmt::Debug, B: ::core::fmt::Debug> ::core::fmt::Debug for
    OutlivesPredicate<A, B> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field2_finish(f,
            "OutlivesPredicate", &self.0, &&self.1)
    }
}Debug, #[automatically_derived]
impl<A: ::core::cmp::Eq, B: ::core::cmp::Eq> ::core::cmp::Eq for
    OutlivesPredicate<A, B> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<A>;
        let _: ::core::cmp::AssertParamIsEq<B>;
    }
}Eq, #[automatically_derived]
impl<A: ::core::cmp::PartialEq, B: ::core::cmp::PartialEq>
    ::core::cmp::PartialEq for OutlivesPredicate<A, B> {
    #[inline]
    fn eq(&self, other: &OutlivesPredicate<A, B>) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq, #[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<A, B> _serde::Serialize for OutlivesPredicate<A, B> where
            A: _serde::Serialize, B: _serde::Serialize {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                let mut __serde_state =
                    _serde::Serializer::serialize_tuple_struct(__serializer,
                            "OutlivesPredicate", 0 + 1 + 1)?;
                _serde::ser::SerializeTupleStruct::serialize_field(&mut __serde_state,
                        &self.0)?;
                _serde::ser::SerializeTupleStruct::serialize_field(&mut __serde_state,
                        &self.1)?;
                _serde::ser::SerializeTupleStruct::end(__serde_state)
            }
        }
    };Serialize)]
1565pub struct OutlivesPredicate<A, B>(pub A, pub B);
1566
1567pub type RegionOutlivesPredicate = OutlivesPredicate<Region, Region>;
1568pub type TypeOutlivesPredicate = OutlivesPredicate<Ty, Region>;
1569
1570#[derive(#[automatically_derived]
impl ::core::clone::Clone for ProjectionPredicate {
    #[inline]
    fn clone(&self) -> ProjectionPredicate {
        ProjectionPredicate {
            projection_term: ::core::clone::Clone::clone(&self.projection_term),
            term: ::core::clone::Clone::clone(&self.term),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ProjectionPredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "ProjectionPredicate", "projection_term", &self.projection_term,
            "term", &&self.term)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ProjectionPredicate {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<AliasTerm>;
        let _: ::core::cmp::AssertParamIsEq<TermKind>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ProjectionPredicate {
    #[inline]
    fn eq(&self, other: &ProjectionPredicate) -> bool {
        self.projection_term == other.projection_term &&
            self.term == other.term
    }
}PartialEq, #[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 ProjectionPredicate {
            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,
                            "ProjectionPredicate", false as usize + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "projection_term", &self.projection_term)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "term", &self.term)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1571pub struct ProjectionPredicate {
1572    pub projection_term: AliasTerm,
1573    pub term: TermKind,
1574}
1575
1576#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImplPolarity {
    #[inline]
    fn clone(&self) -> ImplPolarity {
        match self {
            ImplPolarity::Positive => ImplPolarity::Positive,
            ImplPolarity::Negative => ImplPolarity::Negative,
            ImplPolarity::Reservation => ImplPolarity::Reservation,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ImplPolarity {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                ImplPolarity::Positive => "Positive",
                ImplPolarity::Negative => "Negative",
                ImplPolarity::Reservation => "Reservation",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ImplPolarity {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplPolarity {
    #[inline]
    fn eq(&self, other: &ImplPolarity) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[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 ImplPolarity {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ImplPolarity::Positive =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ImplPolarity", 0u32, "Positive"),
                    ImplPolarity::Negative =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ImplPolarity", 1u32, "Negative"),
                    ImplPolarity::Reservation =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "ImplPolarity", 2u32, "Reservation"),
                }
            }
        }
    };Serialize)]
1577pub enum ImplPolarity {
1578    Positive,
1579    Negative,
1580    Reservation,
1581}
1582
1583#[derive(#[automatically_derived]
impl ::core::clone::Clone for PredicatePolarity {
    #[inline]
    fn clone(&self) -> PredicatePolarity {
        match self {
            PredicatePolarity::Positive => PredicatePolarity::Positive,
            PredicatePolarity::Negative => PredicatePolarity::Negative,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for PredicatePolarity {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                PredicatePolarity::Positive => "Positive",
                PredicatePolarity::Negative => "Negative",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for PredicatePolarity {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for PredicatePolarity {
    #[inline]
    fn eq(&self, other: &PredicatePolarity) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[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 PredicatePolarity {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    PredicatePolarity::Positive =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "PredicatePolarity", 0u32, "Positive"),
                    PredicatePolarity::Negative =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "PredicatePolarity", 1u32, "Negative"),
                }
            }
        }
    };Serialize)]
1584pub enum PredicatePolarity {
1585    Positive,
1586    Negative,
1587}
1588
1589macro_rules! index_impl {
1590    ($name:ident) => {
1591        impl crate::IndexedVal for $name {
1592            fn to_val(index: usize) -> Self {
1593                $name(index, $crate::ThreadLocalIndex)
1594            }
1595            fn to_index(&self) -> usize {
1596                self.0
1597            }
1598        }
1599        $crate::ty::serialize_index_impl!($name);
1600    };
1601}
1602macro_rules! serialize_index_impl {
1603    ($name:ident) => {
1604        impl ::serde::Serialize for $name {
1605            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1606            where
1607                S: ::serde::Serializer,
1608            {
1609                let n: usize = self.0; // Make sure we're serializing an int.
1610                ::serde::Serialize::serialize(&n, serializer)
1611            }
1612        }
1613    };
1614}
1615pub(crate) use index_impl;
1616pub(crate) use serialize_index_impl;
1617
1618impl crate::IndexedVal for TyConstId {
    fn to_val(index: usize) -> Self {
        TyConstId(index, crate::ThreadLocalIndex)
    }
    fn to_index(&self) -> usize { self.0 }
}
impl ::serde::Serialize for TyConstId {
    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!(TyConstId);
1619impl crate::IndexedVal for MirConstId {
    fn to_val(index: usize) -> Self {
        MirConstId(index, crate::ThreadLocalIndex)
    }
    fn to_index(&self) -> usize { self.0 }
}
impl ::serde::Serialize for MirConstId {
    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!(MirConstId);
1620impl crate::IndexedVal for Ty {
    fn to_val(index: usize) -> Self { Ty(index, crate::ThreadLocalIndex) }
    fn to_index(&self) -> usize { self.0 }
}
impl ::serde::Serialize for Ty {
    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!(Ty);
1621impl crate::IndexedVal for Span {
    fn to_val(index: usize) -> Self { Span(index, crate::ThreadLocalIndex) }
    fn to_index(&self) -> usize { self.0 }
}
impl ::serde::Serialize for Span {
    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!(Span);
1622
1623/// The source-order index of a variant in a type.
1624///
1625/// For example, in the following types,
1626/// ```ignore(illustrative)
1627/// enum Demo1 {
1628///    Variant0 { a: bool, b: i32 },
1629///    Variant1 { c: u8, d: u64 },
1630/// }
1631/// struct Demo2 { e: u8, f: u16, g: u8 }
1632/// ```
1633/// `a` is in the variant with the `VariantIdx` of `0`,
1634/// `c` is in the variant with the `VariantIdx` of `1`, and
1635/// `g` is in the variant with the `VariantIdx` of `0`.
1636#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantIdx {
    #[inline]
    fn clone(&self) -> VariantIdx {
        let _: ::core::clone::AssertParamIsClone<usize>;
        let _: ::core::clone::AssertParamIsClone<ThreadLocalIndex>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for VariantIdx { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for VariantIdx {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field2_finish(f, "VariantIdx",
            &self.0, &&self.1)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for VariantIdx {
    #[inline]
    fn eq(&self, other: &VariantIdx) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantIdx {
    #[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 VariantIdx {
    #[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)]
1637pub struct VariantIdx(usize, ThreadLocalIndex);
1638
1639impl crate::IndexedVal for VariantIdx {
    fn to_val(index: usize) -> Self {
        VariantIdx(index, crate::ThreadLocalIndex)
    }
    fn to_index(&self) -> usize { self.0 }
}
impl ::serde::Serialize for VariantIdx {
    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!(VariantIdx);
1640
1641#[automatically_derived]
impl ::core::clone::Clone for OpaqueDef {
    #[inline]
    fn clone(&self) -> OpaqueDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for OpaqueDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for OpaqueDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for OpaqueDef {
    #[inline]
    fn eq(&self, other: &OpaqueDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for OpaqueDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for OpaqueDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "OpaqueDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for OpaqueDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 OpaqueDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "OpaqueDef", &self.0)
            }
        }
    };
impl CrateDef for OpaqueDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
1642    /// Hold information about an Opaque definition, particularly useful in `RPITIT`.
1643    #[derive(Serialize)]
1644    pub OpaqueDef;
1645}
1646
1647#[automatically_derived]
impl ::core::clone::Clone for AssocDef {
    #[inline]
    fn clone(&self) -> AssocDef {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}
#[automatically_derived]
impl ::core::marker::Copy for AssocDef { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for AssocDef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AssocDef {
    #[inline]
    fn eq(&self, other: &AssocDef) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for AssocDef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}
#[automatically_derived]
impl ::core::fmt::Debug for AssocDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "AssocDef",
            &&self.0)
    }
}
#[automatically_derived]
impl ::core::hash::Hash for AssocDef {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}
#[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 AssocDef {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                _serde::Serializer::serialize_newtype_struct(__serializer,
                    "AssocDef", &self.0)
            }
        }
    };
impl CrateDef for AssocDef {
    fn def_id(&self) -> DefId { self.0 }
}crate_def! {
1648    #[derive(Serialize)]
1649    pub AssocDef;
1650}
1651
1652#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocItem {
    #[inline]
    fn clone(&self) -> AssocItem {
        AssocItem {
            def_id: ::core::clone::Clone::clone(&self.def_id),
            kind: ::core::clone::Clone::clone(&self.kind),
            container: ::core::clone::Clone::clone(&self.container),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AssocItem {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "AssocItem",
            "def_id", &self.def_id, "kind", &self.kind, "container",
            &&self.container)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for AssocItem {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<AssocDef>;
        let _: ::core::cmp::AssertParamIsEq<AssocKind>;
        let _: ::core::cmp::AssertParamIsEq<AssocContainer>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for AssocItem {
    #[inline]
    fn eq(&self, other: &AssocItem) -> bool {
        self.def_id == other.def_id && self.kind == other.kind &&
            self.container == other.container
    }
}PartialEq, #[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 AssocItem {
            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,
                            "AssocItem", false as usize + 1 + 1 + 1)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "def_id", &self.def_id)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "kind", &self.kind)?;
                _serde::ser::SerializeStruct::serialize_field(&mut __serde_state,
                        "container", &self.container)?;
                _serde::ser::SerializeStruct::end(__serde_state)
            }
        }
    };Serialize)]
1653pub struct AssocItem {
1654    pub def_id: AssocDef,
1655    pub kind: AssocKind,
1656    pub container: AssocContainer,
1657}
1658
1659#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocTypeData {
    #[inline]
    fn clone(&self) -> AssocTypeData {
        match self {
            AssocTypeData::Normal(__self_0) =>
                AssocTypeData::Normal(::core::clone::Clone::clone(__self_0)),
            AssocTypeData::Rpitit(__self_0) =>
                AssocTypeData::Rpitit(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for AssocTypeData {
    #[inline]
    fn eq(&self, other: &AssocTypeData) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (AssocTypeData::Normal(__self_0),
                    AssocTypeData::Normal(__arg1_0)) => __self_0 == __arg1_0,
                (AssocTypeData::Rpitit(__self_0),
                    AssocTypeData::Rpitit(__arg1_0)) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for AssocTypeData {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AssocTypeData::Normal(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Normal",
                    &__self_0),
            AssocTypeData::Rpitit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Rpitit",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for AssocTypeData {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Symbol>;
        let _: ::core::cmp::AssertParamIsEq<ImplTraitInTraitData>;
    }
}Eq, #[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 AssocTypeData {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    AssocTypeData::Normal(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "AssocTypeData", 0u32, "Normal", __field0),
                    AssocTypeData::Rpitit(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "AssocTypeData", 1u32, "Rpitit", __field0),
                }
            }
        }
    };Serialize)]
1660pub enum AssocTypeData {
1661    Normal(Symbol),
1662    /// The associated type comes from an RPITIT. It has no name, and the
1663    /// `ImplTraitInTraitData` provides additional information about its
1664    /// source.
1665    Rpitit(ImplTraitInTraitData),
1666}
1667
1668#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocKind {
    #[inline]
    fn clone(&self) -> AssocKind {
        match self {
            AssocKind::Const { name: __self_0 } =>
                AssocKind::Const {
                    name: ::core::clone::Clone::clone(__self_0),
                },
            AssocKind::Fn { name: __self_0, has_self: __self_1 } =>
                AssocKind::Fn {
                    name: ::core::clone::Clone::clone(__self_0),
                    has_self: ::core::clone::Clone::clone(__self_1),
                },
            AssocKind::Type { data: __self_0 } =>
                AssocKind::Type {
                    data: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AssocKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AssocKind::Const { name: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
                    "name", &__self_0),
            AssocKind::Fn { name: __self_0, has_self: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Fn",
                    "name", __self_0, "has_self", &__self_1),
            AssocKind::Type { data: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Type",
                    "data", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for AssocKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Symbol>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<AssocTypeData>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for AssocKind {
    #[inline]
    fn eq(&self, other: &AssocKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (AssocKind::Const { name: __self_0 }, AssocKind::Const {
                    name: __arg1_0 }) => __self_0 == __arg1_0,
                (AssocKind::Fn { name: __self_0, has_self: __self_1 },
                    AssocKind::Fn { name: __arg1_0, has_self: __arg1_1 }) =>
                    __self_1 == __arg1_1 && __self_0 == __arg1_0,
                (AssocKind::Type { data: __self_0 }, AssocKind::Type {
                    data: __arg1_0 }) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[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 AssocKind {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    AssocKind::Const { ref name } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "AssocKind", 0u32, "Const", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "name", name)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    AssocKind::Fn { ref name, ref has_self } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "AssocKind", 1u32, "Fn", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "name", name)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "has_self", has_self)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    AssocKind::Type { ref data } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "AssocKind", 2u32, "Type", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "data", data)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
1669pub enum AssocKind {
1670    Const { name: Symbol },
1671    Fn { name: Symbol, has_self: bool },
1672    Type { data: AssocTypeData },
1673}
1674
1675#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocContainer {
    #[inline]
    fn clone(&self) -> AssocContainer {
        match self {
            AssocContainer::InherentImpl => AssocContainer::InherentImpl,
            AssocContainer::TraitImpl(__self_0) =>
                AssocContainer::TraitImpl(::core::clone::Clone::clone(__self_0)),
            AssocContainer::Trait => AssocContainer::Trait,
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AssocContainer {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AssocContainer::InherentImpl =>
                ::core::fmt::Formatter::write_str(f, "InherentImpl"),
            AssocContainer::TraitImpl(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TraitImpl", &__self_0),
            AssocContainer::Trait =>
                ::core::fmt::Formatter::write_str(f, "Trait"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for AssocContainer {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<AssocDef>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for AssocContainer {
    #[inline]
    fn eq(&self, other: &AssocContainer) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (AssocContainer::TraitImpl(__self_0),
                    AssocContainer::TraitImpl(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[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 AssocContainer {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    AssocContainer::InherentImpl =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AssocContainer", 0u32, "InherentImpl"),
                    AssocContainer::TraitImpl(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "AssocContainer", 1u32, "TraitImpl", __field0),
                    AssocContainer::Trait =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "AssocContainer", 2u32, "Trait"),
                }
            }
        }
    };Serialize)]
1676pub enum AssocContainer {
1677    InherentImpl,
1678    /// The `AssocDef` points to the trait item being implemented.
1679    TraitImpl(AssocDef),
1680    Trait,
1681}
1682
1683#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImplTraitInTraitData {
    #[inline]
    fn clone(&self) -> ImplTraitInTraitData {
        let _: ::core::clone::AssertParamIsClone<FnDef>;
        let _: ::core::clone::AssertParamIsClone<OpaqueDef>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ImplTraitInTraitData { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplTraitInTraitData {
    #[inline]
    fn eq(&self, other: &ImplTraitInTraitData) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ImplTraitInTraitData::Trait {
                    fn_def_id: __self_0, opaque_def_id: __self_1 },
                    ImplTraitInTraitData::Trait {
                    fn_def_id: __arg1_0, opaque_def_id: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (ImplTraitInTraitData::Impl { fn_def_id: __self_0 },
                    ImplTraitInTraitData::Impl { fn_def_id: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplTraitInTraitData {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<FnDef>;
        let _: ::core::cmp::AssertParamIsEq<OpaqueDef>;
    }
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for ImplTraitInTraitData {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ImplTraitInTraitData::Trait {
                fn_def_id: __self_0, opaque_def_id: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Trait",
                    "fn_def_id", __self_0, "opaque_def_id", &__self_1),
            ImplTraitInTraitData::Impl { fn_def_id: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Impl",
                    "fn_def_id", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for ImplTraitInTraitData {
    #[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 {
            ImplTraitInTraitData::Trait {
                fn_def_id: __self_0, opaque_def_id: __self_1 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            ImplTraitInTraitData::Impl { fn_def_id: __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 ImplTraitInTraitData {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    ImplTraitInTraitData::Trait {
                        ref fn_def_id, ref opaque_def_id } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ImplTraitInTraitData", 0u32, "Trait", 0 + 1 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "fn_def_id", fn_def_id)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "opaque_def_id", opaque_def_id)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                    ImplTraitInTraitData::Impl { ref fn_def_id } => {
                        let mut __serde_state =
                            _serde::Serializer::serialize_struct_variant(__serializer,
                                    "ImplTraitInTraitData", 1u32, "Impl", 0 + 1)?;
                        _serde::ser::SerializeStructVariant::serialize_field(&mut __serde_state,
                                "fn_def_id", fn_def_id)?;
                        _serde::ser::SerializeStructVariant::end(__serde_state)
                    }
                }
            }
        }
    };Serialize)]
1684pub enum ImplTraitInTraitData {
1685    Trait { fn_def_id: FnDef, opaque_def_id: OpaqueDef },
1686    Impl { fn_def_id: FnDef },
1687}
1688
1689impl AssocItem {
1690    pub fn is_impl_trait_in_trait(&self) -> bool {
1691        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    AssocKind::Type { data: AssocTypeData::Rpitit(_) } => true,
    _ => false,
}matches!(self.kind, AssocKind::Type { data: AssocTypeData::Rpitit(_) })
1692    }
1693}
1694
1695#[derive(#[automatically_derived]
impl ::core::clone::Clone for VtblEntry {
    #[inline]
    fn clone(&self) -> VtblEntry {
        match self {
            VtblEntry::MetadataDropInPlace => VtblEntry::MetadataDropInPlace,
            VtblEntry::MetadataSize => VtblEntry::MetadataSize,
            VtblEntry::MetadataAlign => VtblEntry::MetadataAlign,
            VtblEntry::Vacant => VtblEntry::Vacant,
            VtblEntry::Method(__self_0) =>
                VtblEntry::Method(::core::clone::Clone::clone(__self_0)),
            VtblEntry::TraitVPtr(__self_0) =>
                VtblEntry::TraitVPtr(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for VtblEntry {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            VtblEntry::MetadataDropInPlace =>
                ::core::fmt::Formatter::write_str(f, "MetadataDropInPlace"),
            VtblEntry::MetadataSize =>
                ::core::fmt::Formatter::write_str(f, "MetadataSize"),
            VtblEntry::MetadataAlign =>
                ::core::fmt::Formatter::write_str(f, "MetadataAlign"),
            VtblEntry::Vacant =>
                ::core::fmt::Formatter::write_str(f, "Vacant"),
            VtblEntry::Method(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Method",
                    &__self_0),
            VtblEntry::TraitVPtr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TraitVPtr", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for VtblEntry {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Instance>;
        let _: ::core::cmp::AssertParamIsEq<TraitRef>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for VtblEntry {
    #[inline]
    fn eq(&self, other: &VtblEntry) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (VtblEntry::Method(__self_0), VtblEntry::Method(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (VtblEntry::TraitVPtr(__self_0),
                    VtblEntry::TraitVPtr(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[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 VtblEntry {
            fn serialize<__S>(&self, __serializer: __S)
                -> _serde::__private228::Result<__S::Ok, __S::Error> where
                __S: _serde::Serializer {
                match *self {
                    VtblEntry::MetadataDropInPlace =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "VtblEntry", 0u32, "MetadataDropInPlace"),
                    VtblEntry::MetadataSize =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "VtblEntry", 1u32, "MetadataSize"),
                    VtblEntry::MetadataAlign =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "VtblEntry", 2u32, "MetadataAlign"),
                    VtblEntry::Vacant =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "VtblEntry", 3u32, "Vacant"),
                    VtblEntry::Method(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "VtblEntry", 4u32, "Method", __field0),
                    VtblEntry::TraitVPtr(ref __field0) =>
                        _serde::Serializer::serialize_newtype_variant(__serializer,
                            "VtblEntry", 5u32, "TraitVPtr", __field0),
                }
            }
        }
    };Serialize)]
1696pub enum VtblEntry {
1697    /// destructor of this type (used in vtable header)
1698    MetadataDropInPlace,
1699    /// layout size of this type (used in vtable header)
1700    MetadataSize,
1701    /// layout align of this type (used in vtable header)
1702    MetadataAlign,
1703    /// non-dispatchable associated function that is excluded from trait object
1704    Vacant,
1705    /// dispatchable associated function
1706    Method(Instance),
1707    /// pointer to a separate supertrait vtable, can be used by trait upcasting coercion
1708    TraitVPtr(TraitRef),
1709}