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
900#[derive(#[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),
        }
    }
}Clone, #[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)
    }
}Debug, #[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>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for FieldDef {
    #[inline]
    fn eq(&self, other: &FieldDef) -> bool {
        self.def == other.def && 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 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)
            }
        }
    };Serialize)]
901pub struct FieldDef {
902    /// The field definition.
903    pub(crate) def: DefId,
904
905    /// The field name.
906    pub name: Symbol,
907}
908
909impl FieldDef {
910    /// Retrieve the type of this field instantiating and normalizing it with the given arguments.
911    ///
912    /// This will assume the type can be instantiated with these arguments.
913    pub fn ty_with_args(&self, args: &GenericArgs) -> Ty {
914        with(|cx| cx.def_ty_with_args(self.def, args))
915    }
916
917    /// Retrieve the type of this field.
918    pub fn ty(&self) -> Ty {
919        with(|cx| cx.def_ty(self.def))
920    }
921}
922
923impl Display for AdtKind {
924    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
925        f.write_str(match self {
926            AdtKind::Enum => "enum",
927            AdtKind::Union => "union",
928            AdtKind::Struct => "struct",
929        })
930    }
931}
932
933impl AdtKind {
934    pub fn is_enum(&self) -> bool {
935        #[allow(non_exhaustive_omitted_patterns)] match self {
    AdtKind::Enum => true,
    _ => false,
}matches!(self, AdtKind::Enum)
936    }
937
938    pub fn is_struct(&self) -> bool {
939        #[allow(non_exhaustive_omitted_patterns)] match self {
    AdtKind::Struct => true,
    _ => false,
}matches!(self, AdtKind::Struct)
940    }
941
942    pub fn is_union(&self) -> bool {
943        #[allow(non_exhaustive_omitted_patterns)] match self {
    AdtKind::Union => true,
    _ => false,
}matches!(self, AdtKind::Union)
944    }
945}
946
947#[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! {
948    #[derive(Serialize)]
949    pub AliasDef;
950}
951
952#[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! {
953    /// A trait's definition.
954    #[derive(Serialize)]
955    pub TraitDef;
956}
957
958impl TraitDef {
959    pub fn declaration(trait_def: &TraitDef) -> TraitDecl {
960        with(|cx| cx.trait_decl(trait_def))
961    }
962
963    pub fn associated_items(&self) -> AssocItems {
964        with(|cx| cx.associated_items(self.def_id()))
965    }
966}
967
968#[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! {
969    #[derive(Serialize)]
970    pub GenericDef;
971}
972
973#[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! {
974    #[derive(Serialize)]
975    pub ConstDef;
976}
977
978#[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! {
979    /// A trait impl definition.
980    #[derive(Serialize)]
981    pub ImplDef;
982}
983
984impl ImplDef {
985    /// Retrieve information about this implementation.
986    pub fn trait_impl(&self) -> ImplTrait {
987        with(|cx| cx.trait_impl(self))
988    }
989
990    pub fn associated_items(&self) -> AssocItems {
991        with(|cx| cx.associated_items(self.def_id()))
992    }
993}
994
995#[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! {
996    #[derive(Serialize)]
997    pub RegionDef;
998}
999
1000#[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! {
1001    #[derive(Serialize)]
1002    pub CoroutineWitnessDef;
1003}
1004
1005/// A list of generic arguments.
1006#[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)]
1007pub struct GenericArgs(pub Vec<GenericArgKind>);
1008
1009impl std::ops::Index<ParamTy> for GenericArgs {
1010    type Output = Ty;
1011
1012    fn index(&self, index: ParamTy) -> &Self::Output {
1013        self.0[index.index as usize].expect_ty()
1014    }
1015}
1016
1017impl std::ops::Index<ParamConst> for GenericArgs {
1018    type Output = TyConst;
1019
1020    fn index(&self, index: ParamConst) -> &Self::Output {
1021        self.0[index.index as usize].expect_const()
1022    }
1023}
1024
1025#[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)]
1026pub enum GenericArgKind {
1027    Lifetime(Region),
1028    Type(Ty),
1029    Const(TyConst),
1030}
1031
1032impl GenericArgKind {
1033    /// Panic if this generic argument is not a type, otherwise
1034    /// return the type.
1035    #[track_caller]
1036    pub fn expect_ty(&self) -> &Ty {
1037        match self {
1038            GenericArgKind::Type(ty) => ty,
1039            _ => { ::core::panicking::panic_fmt(format_args!("{0:?}", self)); }panic!("{self:?}"),
1040        }
1041    }
1042
1043    /// Panic if this generic argument is not a const, otherwise
1044    /// return the const.
1045    #[track_caller]
1046    pub fn expect_const(&self) -> &TyConst {
1047        match self {
1048            GenericArgKind::Const(c) => c,
1049            _ => { ::core::panicking::panic_fmt(format_args!("{0:?}", self)); }panic!("{self:?}"),
1050        }
1051    }
1052
1053    /// Return the generic argument type if applicable, otherwise return `None`.
1054    pub fn ty(&self) -> Option<&Ty> {
1055        match self {
1056            GenericArgKind::Type(ty) => Some(ty),
1057            _ => None,
1058        }
1059    }
1060}
1061
1062#[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)]
1063pub enum TermKind {
1064    Type(Ty),
1065    Const(TyConst),
1066}
1067
1068#[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)]
1069pub enum AliasKind {
1070    Projection,
1071    Inherent,
1072    Opaque,
1073    Free,
1074}
1075
1076#[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)]
1077pub struct AliasTy {
1078    pub def_id: AliasDef,
1079    pub args: GenericArgs,
1080}
1081
1082#[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)]
1083pub struct AliasTerm {
1084    pub def_id: AliasDef,
1085    pub args: GenericArgs,
1086}
1087
1088pub type PolyFnSig = Binder<FnSig>;
1089
1090impl PolyFnSig {
1091    /// Compute a `FnAbi` suitable for indirect calls, i.e. to `fn` pointers.
1092    ///
1093    /// NB: this doesn't handle virtual calls - those should use `Instance::fn_abi`
1094    /// instead, where the instance is an `InstanceKind::Virtual`.
1095    pub fn fn_ptr_abi(self) -> Result<FnAbi, Error> {
1096        with(|cx| cx.fn_ptr_abi(self))
1097    }
1098}
1099
1100#[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)]
1101pub struct FnSig {
1102    pub inputs_and_output: Vec<Ty>,
1103    pub c_variadic: bool,
1104    pub safety: Safety,
1105    pub abi: Abi,
1106}
1107
1108impl FnSig {
1109    pub fn output(&self) -> Ty {
1110        self.inputs_and_output[self.inputs_and_output.len() - 1]
1111    }
1112
1113    pub fn inputs(&self) -> &[Ty] {
1114        &self.inputs_and_output[..self.inputs_and_output.len() - 1]
1115    }
1116}
1117
1118#[derive(#[automatically_derived]
impl ::core::marker::Copy for Constness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Constness {
    #[inline]
    fn clone(&self) -> Constness { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Constness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                Constness::Const => "Const",
                Constness::NotConst => "NotConst",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Constness {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}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
    }
}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 =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Constness", 0u32, "Const"),
                    Constness::NotConst =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Constness", 1u32, "NotConst"),
                }
            }
        }
    };Serialize)]
1119pub enum Constness {
1120    Const,
1121    NotConst,
1122}
1123
1124impl Constness {
1125    pub fn is_const(self) -> bool {
1126        #[allow(non_exhaustive_omitted_patterns)] match self {
    Constness::Const => true,
    _ => false,
}matches!(self, Constness::Const)
1127    }
1128}
1129
1130#[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)]
1131pub enum Asyncness {
1132    Async,
1133    NotAsync,
1134}
1135
1136impl Asyncness {
1137    pub fn is_async(self) -> bool {
1138        #[allow(non_exhaustive_omitted_patterns)] match self {
    Asyncness::Async => true,
    _ => false,
}matches!(self, Asyncness::Async)
1139    }
1140}
1141
1142#[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::RustInvalid => Abi::RustInvalid,
            Abi::Custom => Abi::Custom,
        }
    }
}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::RustInvalid =>
                ::core::fmt::Formatter::write_str(f, "RustInvalid"),
            Abi::Custom => ::core::fmt::Formatter::write_str(f, "Custom"),
        }
    }
}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::RustInvalid =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 26u32, "RustInvalid"),
                    Abi::Custom =>
                        _serde::Serializer::serialize_unit_variant(__serializer,
                            "Abi", 27u32, "Custom"),
                }
            }
        }
    };Serialize)]
1143pub enum Abi {
1144    Rust,
1145    C { unwind: bool },
1146    Cdecl { unwind: bool },
1147    Stdcall { unwind: bool },
1148    Fastcall { unwind: bool },
1149    Vectorcall { unwind: bool },
1150    Thiscall { unwind: bool },
1151    Aapcs { unwind: bool },
1152    Win64 { unwind: bool },
1153    SysV64 { unwind: bool },
1154    PtxKernel,
1155    Msp430Interrupt,
1156    X86Interrupt,
1157    GpuKernel,
1158    EfiApi,
1159    AvrInterrupt,
1160    AvrNonBlockingInterrupt,
1161    CCmseNonSecureCall,
1162    CCmseNonSecureEntry,
1163    System { unwind: bool },
1164    RustCall,
1165    Unadjusted,
1166    RustCold,
1167    RiscvInterruptM,
1168    RiscvInterruptS,
1169    RustPreserveNone,
1170    RustInvalid,
1171    Custom,
1172}
1173
1174/// A binder represents a possibly generic type and its bound vars.
1175#[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)]
1176pub struct Binder<T> {
1177    pub value: T,
1178    pub bound_vars: Vec<BoundVariableKind>,
1179}
1180
1181impl<T> Binder<T> {
1182    /// Create a new binder with the given bound vars.
1183    pub fn bind_with_vars(value: T, bound_vars: Vec<BoundVariableKind>) -> Self {
1184        Binder { value, bound_vars }
1185    }
1186
1187    /// Create a new binder with no bounded variable.
1188    pub fn dummy(value: T) -> Self {
1189        Binder { value, bound_vars: ::alloc::vec::Vec::new()vec![] }
1190    }
1191
1192    pub fn skip_binder(self) -> T {
1193        self.value
1194    }
1195
1196    pub fn map_bound_ref<F, U>(&self, f: F) -> Binder<U>
1197    where
1198        F: FnOnce(&T) -> U,
1199    {
1200        let Binder { value, bound_vars } = self;
1201        let new_value = f(value);
1202        Binder { value: new_value, bound_vars: bound_vars.clone() }
1203    }
1204
1205    pub fn map_bound<F, U>(self, f: F) -> Binder<U>
1206    where
1207        F: FnOnce(T) -> U,
1208    {
1209        let Binder { value, bound_vars } = self;
1210        let new_value = f(value);
1211        Binder { value: new_value, bound_vars }
1212    }
1213}
1214
1215#[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)]
1216pub struct EarlyBinder<T> {
1217    pub value: T,
1218}
1219
1220#[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)]
1221pub enum BoundVariableKind {
1222    Ty(BoundTyKind),
1223    Region(BoundRegionKind),
1224    Const,
1225}
1226
1227#[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)]
1228pub enum BoundTyKind {
1229    Anon,
1230    Param(ParamDef, String),
1231}
1232
1233#[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)]
1234pub enum BoundRegionKind {
1235    BrAnon,
1236    BrNamed(BrNamedDef, String),
1237    BrEnv,
1238}
1239
1240#[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)]
1241pub enum ExistentialPredicate {
1242    Trait(ExistentialTraitRef),
1243    Projection(ExistentialProjection),
1244    AutoTrait(TraitDef),
1245}
1246
1247/// An existential reference to a trait where `Self` is not included.
1248///
1249/// The `generic_args` will include any other known argument.
1250#[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)]
1251pub struct ExistentialTraitRef {
1252    pub def_id: TraitDef,
1253    pub generic_args: GenericArgs,
1254}
1255
1256impl Binder<ExistentialTraitRef> {
1257    pub fn with_self_ty(&self, self_ty: Ty) -> Binder<TraitRef> {
1258        self.map_bound_ref(|trait_ref| trait_ref.with_self_ty(self_ty))
1259    }
1260}
1261
1262impl ExistentialTraitRef {
1263    pub fn with_self_ty(&self, self_ty: Ty) -> TraitRef {
1264        TraitRef::new(self.def_id, self_ty, &self.generic_args)
1265    }
1266}
1267
1268#[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)]
1269pub struct ExistentialProjection {
1270    pub def_id: TraitDef,
1271    pub generic_args: GenericArgs,
1272    pub term: TermKind,
1273}
1274
1275#[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)]
1276pub struct ParamTy {
1277    pub index: u32,
1278    pub name: String,
1279}
1280
1281#[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)]
1282pub struct BoundTy {
1283    pub var: usize,
1284    pub kind: BoundTyKind,
1285}
1286
1287pub type Bytes = Vec<Option<u8>>;
1288
1289/// Size in bytes.
1290pub type Size = usize;
1291
1292#[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)]
1293pub struct Prov(pub AllocId);
1294
1295pub type Align = u64;
1296pub type Promoted = u32;
1297pub type InitMaskMaterialized = Vec<u64>;
1298
1299/// Stores the provenance information of pointers stored in memory.
1300#[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)]
1301pub struct ProvenanceMap {
1302    /// Provenance in this map applies from the given offset for an entire pointer-size worth of
1303    /// bytes. Two entries in this map are always at least a pointer size apart.
1304    pub ptrs: Vec<(Size, Prov)>,
1305}
1306
1307#[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)]
1308pub struct Allocation {
1309    pub bytes: Bytes,
1310    pub provenance: ProvenanceMap,
1311    pub align: Align,
1312    pub mutability: Mutability,
1313}
1314
1315impl Allocation {
1316    /// Get a vector of bytes for an Allocation that has been fully initialized
1317    pub fn raw_bytes(&self) -> Result<Vec<u8>, Error> {
1318        self.bytes
1319            .iter()
1320            .copied()
1321            .collect::<Option<Vec<_>>>()
1322            .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))
1323    }
1324
1325    /// Read a uint value from the specified range.
1326    pub fn read_partial_uint(&self, range: Range<usize>) -> Result<u128, Error> {
1327        if range.end - range.start > 16 {
1328            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"));
1329        }
1330        if range.end > self.bytes.len() {
1331            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!(
1332                "Range is out of bounds. Allocation length is `{}`, but requested range `{:?}`",
1333                self.bytes.len(),
1334                range
1335            ));
1336        }
1337        let raw = self.bytes[range]
1338            .iter()
1339            .copied()
1340            .collect::<Option<Vec<_>>>()
1341            .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))?;
1342        read_target_uint(&raw)
1343    }
1344
1345    /// Read this allocation and try to convert it to an unassigned integer.
1346    pub fn read_uint(&self) -> Result<u128, Error> {
1347        if self.bytes.len() > 16 {
1348            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"));
1349        }
1350        let raw = self.raw_bytes()?;
1351        read_target_uint(&raw)
1352    }
1353
1354    /// Read this allocation and try to convert it to a signed integer.
1355    pub fn read_int(&self) -> Result<i128, Error> {
1356        if self.bytes.len() > 16 {
1357            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"));
1358        }
1359        let raw = self.raw_bytes()?;
1360        read_target_int(&raw)
1361    }
1362
1363    /// Read this allocation and try to convert it to a boolean.
1364    pub fn read_bool(&self) -> Result<bool, Error> {
1365        match self.read_int()? {
1366            0 => Ok(false),
1367            1 => Ok(true),
1368            val => Err(Error(::alloc::__export::must_use({
            ::alloc::fmt::format(format_args!("Unexpected value for bool: `{0}`",
                    val))
        }))error!("Unexpected value for bool: `{val}`")),
1369        }
1370    }
1371
1372    /// Read this allocation as a pointer and return whether it represents a `null` pointer.
1373    pub fn is_null(&self) -> Result<bool, Error> {
1374        let len = self.bytes.len();
1375        let ptr_len = MachineInfo::target_pointer_width().bytes();
1376        if len != ptr_len {
1377            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}`"));
1378        }
1379        Ok(self.read_uint()? == 0 && self.provenance.ptrs.is_empty())
1380    }
1381}
1382
1383#[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)]
1384pub enum ConstantKind {
1385    Ty(TyConst),
1386    Allocated(Allocation),
1387    Unevaluated(UnevaluatedConst),
1388    Param(ParamConst),
1389    /// Store ZST constants.
1390    /// We have to special handle these constants since its type might be generic.
1391    ZeroSized,
1392}
1393
1394#[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)]
1395pub struct ParamConst {
1396    pub index: u32,
1397    pub name: String,
1398}
1399
1400#[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)]
1401pub struct UnevaluatedConst {
1402    pub def: ConstDef,
1403    pub args: GenericArgs,
1404    pub promoted: Option<Promoted>,
1405}
1406
1407#[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)]
1408pub enum TraitSpecializationKind {
1409    None,
1410    Marker,
1411    AlwaysApplicable,
1412}
1413
1414#[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)]
1415pub struct TraitDecl {
1416    pub def_id: TraitDef,
1417    pub safety: Safety,
1418    pub paren_sugar: bool,
1419    pub has_auto_impl: bool,
1420    pub is_marker: bool,
1421    pub is_coinductive: bool,
1422    pub skip_array_during_method_dispatch: bool,
1423    pub skip_boxed_slice_during_method_dispatch: bool,
1424    pub specialization_kind: TraitSpecializationKind,
1425    pub must_implement_one_of: Option<Vec<Ident>>,
1426    pub force_dyn_incompatible: Option<Span>,
1427    pub deny_explicit_impl: bool,
1428}
1429
1430impl TraitDecl {
1431    pub fn generics_of(&self) -> Generics {
1432        with(|cx| cx.generics_of(self.def_id.0))
1433    }
1434
1435    pub fn predicates_of(&self) -> GenericPredicates {
1436        with(|cx| cx.predicates_of(self.def_id.0))
1437    }
1438
1439    pub fn explicit_predicates_of(&self) -> GenericPredicates {
1440        with(|cx| cx.explicit_predicates_of(self.def_id.0))
1441    }
1442}
1443
1444pub type ImplTrait = EarlyBinder<TraitRef>;
1445
1446/// A complete reference to a trait, i.e., one where `Self` is known.
1447#[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)]
1448pub struct TraitRef {
1449    pub def_id: TraitDef,
1450    /// The generic arguments for this definition.
1451    /// The first element must always be type, and it represents `Self`.
1452    args: GenericArgs,
1453}
1454
1455impl TraitRef {
1456    pub fn new(def_id: TraitDef, self_ty: Ty, gen_args: &GenericArgs) -> TraitRef {
1457        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)];
1458        args.extend_from_slice(&gen_args.0);
1459        TraitRef { def_id, args: GenericArgs(args) }
1460    }
1461
1462    pub fn try_new(def_id: TraitDef, args: GenericArgs) -> Result<TraitRef, ()> {
1463        match &args.0[..] {
1464            [GenericArgKind::Type(_), ..] => Ok(TraitRef { def_id, args }),
1465            _ => Err(()),
1466        }
1467    }
1468
1469    pub fn args(&self) -> &GenericArgs {
1470        &self.args
1471    }
1472
1473    pub fn self_ty(&self) -> Ty {
1474        let GenericArgKind::Type(self_ty) = self.args.0[0] else {
1475            {
    ::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])
1476        };
1477        self_ty
1478    }
1479
1480    /// Retrieve all vtable entries.
1481    pub fn vtable_entries(&self) -> Vec<VtblEntry> {
1482        with(|cx| cx.vtable_entries(self))
1483    }
1484
1485    /// Returns the vtable entry at the given index.
1486    ///
1487    /// Returns `None` if the index is out of bounds.
1488    pub fn vtable_entry(&self, idx: usize) -> Option<VtblEntry> {
1489        with(|cx| cx.vtable_entry(self, idx))
1490    }
1491}
1492
1493#[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)]
1494pub struct Generics {
1495    pub parent: Option<GenericDef>,
1496    pub parent_count: usize,
1497    pub params: Vec<GenericParamDef>,
1498    pub param_def_id_to_index: Vec<(GenericDef, u32)>,
1499    pub has_self: bool,
1500    pub has_late_bound_regions: Option<Span>,
1501}
1502
1503#[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)]
1504pub enum GenericParamDefKind {
1505    Lifetime,
1506    Type { has_default: bool, synthetic: bool },
1507    Const { has_default: bool },
1508}
1509
1510#[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)]
1511pub struct GenericParamDef {
1512    pub name: super::Symbol,
1513    pub def_id: GenericDef,
1514    pub index: u32,
1515    pub pure_wrt_drop: bool,
1516    pub kind: GenericParamDefKind,
1517}
1518
1519pub struct GenericPredicates {
1520    pub parent: Option<TraitDef>,
1521    pub predicates: Vec<(PredicateKind, Span)>,
1522}
1523
1524#[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)]
1525pub enum PredicateKind {
1526    Clause(ClauseKind),
1527    DynCompatible(TraitDef),
1528    SubType(SubtypePredicate),
1529    Coerce(CoercePredicate),
1530    ConstEquate(TyConst, TyConst),
1531    Ambiguous,
1532    AliasRelate(TermKind, TermKind, AliasRelationDirection),
1533}
1534
1535#[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)]
1536pub enum ClauseKind {
1537    Trait(TraitPredicate),
1538    RegionOutlives(RegionOutlivesPredicate),
1539    TypeOutlives(TypeOutlivesPredicate),
1540    Projection(ProjectionPredicate),
1541    ConstArgHasType(TyConst, Ty),
1542    WellFormed(TermKind),
1543    ConstEvaluatable(TyConst),
1544}
1545
1546#[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)]
1547pub enum ClosureKind {
1548    Fn,
1549    FnMut,
1550    FnOnce,
1551}
1552
1553#[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)]
1554pub struct SubtypePredicate {
1555    pub a: Ty,
1556    pub b: Ty,
1557}
1558
1559#[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)]
1560pub struct CoercePredicate {
1561    pub a: Ty,
1562    pub b: Ty,
1563}
1564
1565#[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)]
1566pub enum AliasRelationDirection {
1567    Equate,
1568    Subtype,
1569}
1570
1571#[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)]
1572pub struct TraitPredicate {
1573    pub trait_ref: TraitRef,
1574    pub polarity: PredicatePolarity,
1575}
1576
1577#[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)]
1578pub struct OutlivesPredicate<A, B>(pub A, pub B);
1579
1580pub type RegionOutlivesPredicate = OutlivesPredicate<Region, Region>;
1581pub type TypeOutlivesPredicate = OutlivesPredicate<Ty, Region>;
1582
1583#[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)]
1584pub struct ProjectionPredicate {
1585    pub projection_term: AliasTerm,
1586    pub term: TermKind,
1587}
1588
1589#[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)]
1590pub enum ImplPolarity {
1591    Positive,
1592    Negative,
1593    Reservation,
1594}
1595
1596#[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)]
1597pub enum PredicatePolarity {
1598    Positive,
1599    Negative,
1600}
1601
1602macro_rules! index_impl {
1603    ($name:ident) => {
1604        impl crate::IndexedVal for $name {
1605            fn to_val(index: usize) -> Self {
1606                $name(index, $crate::ThreadLocalIndex)
1607            }
1608            fn to_index(&self) -> usize {
1609                self.0
1610            }
1611        }
1612        $crate::ty::serialize_index_impl!($name);
1613    };
1614}
1615macro_rules! serialize_index_impl {
1616    ($name:ident) => {
1617        impl ::serde::Serialize for $name {
1618            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1619            where
1620                S: ::serde::Serializer,
1621            {
1622                let n: usize = self.0; // Make sure we're serializing an int.
1623                ::serde::Serialize::serialize(&n, serializer)
1624            }
1625        }
1626    };
1627}
1628pub(crate) use index_impl;
1629pub(crate) use serialize_index_impl;
1630
1631impl 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);
1632impl 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);
1633impl 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);
1634impl 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);
1635
1636/// The source-order index of a variant in a type.
1637///
1638/// For example, in the following types,
1639/// ```ignore(illustrative)
1640/// enum Demo1 {
1641///    Variant0 { a: bool, b: i32 },
1642///    Variant1 { c: u8, d: u64 },
1643/// }
1644/// struct Demo2 { e: u8, f: u16, g: u8 }
1645/// ```
1646/// `a` is in the variant with the `VariantIdx` of `0`,
1647/// `c` is in the variant with the `VariantIdx` of `1`, and
1648/// `g` is in the variant with the `VariantIdx` of `0`.
1649#[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)]
1650pub struct VariantIdx(usize, ThreadLocalIndex);
1651
1652impl 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);
1653
1654#[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! {
1655    /// Hold information about an Opaque definition, particularly useful in `RPITIT`.
1656    #[derive(Serialize)]
1657    pub OpaqueDef;
1658}
1659
1660#[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! {
1661    #[derive(Serialize)]
1662    pub AssocDef;
1663}
1664
1665#[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)]
1666pub struct AssocItem {
1667    pub def_id: AssocDef,
1668    pub kind: AssocKind,
1669    pub container: AssocContainer,
1670}
1671
1672#[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)]
1673pub enum AssocTypeData {
1674    Normal(Symbol),
1675    /// The associated type comes from an RPITIT. It has no name, and the
1676    /// `ImplTraitInTraitData` provides additional information about its
1677    /// source.
1678    Rpitit(ImplTraitInTraitData),
1679}
1680
1681#[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)]
1682pub enum AssocKind {
1683    Const { name: Symbol },
1684    Fn { name: Symbol, has_self: bool },
1685    Type { data: AssocTypeData },
1686}
1687
1688#[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)]
1689pub enum AssocContainer {
1690    InherentImpl,
1691    /// The `AssocDef` points to the trait item being implemented.
1692    TraitImpl(AssocDef),
1693    Trait,
1694}
1695
1696#[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)]
1697pub enum ImplTraitInTraitData {
1698    Trait { fn_def_id: FnDef, opaque_def_id: OpaqueDef },
1699    Impl { fn_def_id: FnDef },
1700}
1701
1702impl AssocItem {
1703    pub fn is_impl_trait_in_trait(&self) -> bool {
1704        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    AssocKind::Type { data: AssocTypeData::Rpitit(_) } => true,
    _ => false,
}matches!(self.kind, AssocKind::Type { data: AssocTypeData::Rpitit(_) })
1705    }
1706}
1707
1708#[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)]
1709pub enum VtblEntry {
1710    /// destructor of this type (used in vtable header)
1711    MetadataDropInPlace,
1712    /// layout size of this type (used in vtable header)
1713    MetadataSize,
1714    /// layout align of this type (used in vtable header)
1715    MetadataAlign,
1716    /// non-dispatchable associated function that is excluded from trait object
1717    Vacant,
1718    /// dispatchable associated function
1719    Method(Instance),
1720    /// pointer to a separate supertrait vtable, can be used by trait upcasting coercion
1721    TraitVPtr(TraitRef),
1722}