Skip to main content

rustc_public/
ty.rs

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