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