Skip to main content

rustc_type_ir/
ty_kind.rs

1use std::fmt;
2use std::marker::PhantomData;
3use std::ops::Deref;
4
5use derive_where::derive_where;
6use rustc_abi::ExternAbi;
7use rustc_ast_ir::Mutability;
8#[cfg(feature = "nightly")]
9use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
10#[cfg(feature = "nightly")]
11use rustc_macros::{Decodable_NoContext, Encodable_NoContext, StableHash, StableHash_NoContext};
12use rustc_type_ir::data_structures::{NoError, UnifyKey, UnifyValue};
13use rustc_type_ir_macros::{
14    GenericTypeVisitable, Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic,
15};
16
17use self::TyKind::*;
18pub use self::closure::*;
19use crate::inherent::*;
20use crate::ty::AliasTy;
21use crate::{
22    self as ty, BoundVarIndexKind, Const, FloatTy, FreeAliasTy, InherentAliasTy, IntTy, Interner,
23    OpaqueAliasTy, ProjectionAliasTy, Region, UintTy, Unnormalized,
24};
25
26mod closure;
27
28#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for AliasTyKind<I> where I: Interner {
    #[inline]
    fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for AliasTyKind<I> where I: Interner {
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for AliasTyKind<I> where I: Interner {
    fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
        match self {
            AliasTyKind::Projection { def_id: ref __field_def_id } => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_def_id, __state);
            }
            AliasTyKind::Inherent { def_id: ref __field_def_id } => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_def_id, __state);
            }
            AliasTyKind::Opaque { def_id: ref __field_def_id } => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_def_id, __state);
            }
            AliasTyKind::Free { def_id: ref __field_def_id } => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_def_id, __state);
            }
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for AliasTyKind<I> where I: Interner
    {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        if ::core::mem::discriminant(self) ==
                ::core::mem::discriminant(__other) {
            match (self, __other) {
                (AliasTyKind::Projection { def_id: ref __field_def_id },
                    AliasTyKind::Projection { def_id: ref __other_field_def_id
                    }) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_def_id,
                            __other_field_def_id),
                (AliasTyKind::Inherent { def_id: ref __field_def_id },
                    AliasTyKind::Inherent { def_id: ref __other_field_def_id })
                    =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_def_id,
                            __other_field_def_id),
                (AliasTyKind::Opaque { def_id: ref __field_def_id },
                    AliasTyKind::Opaque { def_id: ref __other_field_def_id }) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_def_id,
                            __other_field_def_id),
                (AliasTyKind::Free { def_id: ref __field_def_id },
                    AliasTyKind::Free { def_id: ref __other_field_def_id }) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_def_id,
                            __other_field_def_id),
                _ => unsafe { ::core::hint::unreachable_unchecked() },
            }
        } else { false }
    }
}
const _: () =
    {
        trait DeriveWhereAssertEq {
            fn assert(&self);
        }
        impl<I: Interner> DeriveWhereAssertEq for AliasTyKind<I> where
            I: Interner {
            fn assert(&self) {
                struct __AssertEq<__T: ::core::cmp::Eq +
                    ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
                let _: __AssertEq<I::TraitAssocTyId>;
                let _: __AssertEq<I::InherentAssocTyId>;
                let _: __AssertEq<I::OpaqueTyId>;
                let _: __AssertEq<I::FreeTyAliasId>;
            }
        }
    };
#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for AliasTyKind<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for AliasTyKind<I> where I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            AliasTyKind::Projection { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "Projection");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTyKind::Inherent { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "Inherent");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTyKind::Opaque { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "Opaque");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTyKind::Free { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "Free");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Eq, Debug; I: Interner)]
29#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for AliasTyKind<I>
            where I: Interner,
            I::TraitAssocTyId: ::rustc_type_ir::TypeVisitable<I>,
            I::InherentAssocTyId: ::rustc_type_ir::TypeVisitable<I>,
            I::OpaqueTyId: ::rustc_type_ir::TypeVisitable<I>,
            I::FreeTyAliasId: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    AliasTyKind::Projection { def_id: ref __binding_0 } => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AliasTyKind::Inherent { def_id: ref __binding_0 } => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AliasTyKind::Opaque { def_id: ref __binding_0 } => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AliasTyKind::Free { def_id: ref __binding_0 } => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        unsafe impl<I: Interner, __V>
            ::rustc_type_ir::GenericTypeVisitable<__V> for AliasTyKind<I>
            where
            I::TraitAssocTyId: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::InherentAssocTyId: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::OpaqueTyId: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::FreeTyAliasId: ::rustc_type_ir::GenericTypeVisitable<__V> {
            fn generic_visit_with(&self, __visitor: &mut __V) {
                match *self {
                    AliasTyKind::Projection { def_id: ref __binding_0 } => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    AliasTyKind::Inherent { def_id: ref __binding_0 } => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    AliasTyKind::Opaque { def_id: ref __binding_0 } => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    AliasTyKind::Free { def_id: ref __binding_0 } => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                }
            }
        }
    };GenericTypeVisitable, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for AliasTyKind<I>
            where I: Interner,
            I::TraitAssocTyId: ::rustc_type_ir::TypeFoldable<I>,
            I::InherentAssocTyId: ::rustc_type_ir::TypeFoldable<I>,
            I::OpaqueTyId: ::rustc_type_ir::TypeFoldable<I>,
            I::FreeTyAliasId: ::rustc_type_ir::TypeFoldable<I> {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        AliasTyKind::Projection { def_id: __binding_0 } => {
                            AliasTyKind::Projection {
                                def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                            }
                        }
                        AliasTyKind::Inherent { def_id: __binding_0 } => {
                            AliasTyKind::Inherent {
                                def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                            }
                        }
                        AliasTyKind::Opaque { def_id: __binding_0 } => {
                            AliasTyKind::Opaque {
                                def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                            }
                        }
                        AliasTyKind::Free { def_id: __binding_0 } => {
                            AliasTyKind::Free {
                                def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    AliasTyKind::Projection { def_id: __binding_0 } => {
                        AliasTyKind::Projection {
                            def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                    AliasTyKind::Inherent { def_id: __binding_0 } => {
                        AliasTyKind::Inherent {
                            def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                    AliasTyKind::Opaque { def_id: __binding_0 } => {
                        AliasTyKind::Opaque {
                            def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                    AliasTyKind::Free { def_id: __binding_0 } => {
                        AliasTyKind::Free {
                            def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for AliasTyKind<I>
            where J: Interner, I: ::rustc_type_ir::LiftInto<J> {
            type Lifted = AliasTyKind<J>;
            fn lift_to_interner(self, interner: J) -> Self::Lifted {
                match self {
                    AliasTyKind::Projection { def_id: __binding_0 } => {
                        AliasTyKind::Projection {
                            def_id: __binding_0.lift_to_interner(interner),
                        }
                    }
                    AliasTyKind::Inherent { def_id: __binding_0 } => {
                        AliasTyKind::Inherent {
                            def_id: __binding_0.lift_to_interner(interner),
                        }
                    }
                    AliasTyKind::Opaque { def_id: __binding_0 } => {
                        AliasTyKind::Opaque {
                            def_id: __binding_0.lift_to_interner(interner),
                        }
                    }
                    AliasTyKind::Free { def_id: __binding_0 } => {
                        AliasTyKind::Free {
                            def_id: __binding_0.lift_to_interner(interner),
                        }
                    }
                }
            }
        }
    };Lift_Generic)]
30#[cfg_attr(
31    feature = "nightly",
32    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for AliasTyKind<I> where
            I::TraitAssocTyId: ::rustc_serialize::Encodable<__E>,
            I::InherentAssocTyId: ::rustc_serialize::Encodable<__E>,
            I::OpaqueTyId: ::rustc_serialize::Encodable<__E>,
            I::FreeTyAliasId: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AliasTyKind::Projection { def_id: ref __binding_0 } => {
                            0usize
                        }
                        AliasTyKind::Inherent { def_id: ref __binding_0 } => {
                            1usize
                        }
                        AliasTyKind::Opaque { def_id: ref __binding_0 } => {
                            2usize
                        }
                        AliasTyKind::Free { def_id: ref __binding_0 } => { 3usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AliasTyKind::Projection { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTyKind::Inherent { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTyKind::Opaque { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTyKind::Free { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for AliasTyKind<I> where
            I::TraitAssocTyId: ::rustc_serialize::Decodable<__D>,
            I::InherentAssocTyId: ::rustc_serialize::Decodable<__D>,
            I::OpaqueTyId: ::rustc_serialize::Decodable<__D>,
            I::FreeTyAliasId: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AliasTyKind::Projection {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        AliasTyKind::Inherent {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        AliasTyKind::Opaque {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    3usize => {
                        AliasTyKind::Free {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AliasTyKind`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            AliasTyKind<I> where
            I::TraitAssocTyId: ::rustc_data_structures::stable_hash::StableHash,
            I::InherentAssocTyId: ::rustc_data_structures::stable_hash::StableHash,
            I::OpaqueTyId: ::rustc_data_structures::stable_hash::StableHash,
            I::FreeTyAliasId: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    AliasTyKind::Projection { def_id: ref __binding_0 } =>
                        0u8.stable_hash(__hcx, __hasher),
                    AliasTyKind::Inherent { def_id: ref __binding_0 } =>
                        1u8.stable_hash(__hcx, __hasher),
                    AliasTyKind::Opaque { def_id: ref __binding_0 } =>
                        2u8.stable_hash(__hcx, __hasher),
                    AliasTyKind::Free { def_id: ref __binding_0 } =>
                        3u8.stable_hash(__hcx, __hasher),
                }
                match *self {
                    AliasTyKind::Projection { def_id: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AliasTyKind::Inherent { def_id: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AliasTyKind::Opaque { def_id: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AliasTyKind::Free { def_id: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
33)]
34pub enum AliasTyKind<I: Interner> {
35    /// A projection `<Type as Trait>::AssocType`.
36    ///
37    /// Can get normalized away if monomorphic enough.
38    ///
39    /// The `def_id` is the `DefId` of the `TraitItem` for the associated type.
40    ///
41    /// Note that the `def_id` is not the `DefId` of the `TraitRef` containing this
42    /// associated type, which is in `interner.associated_item(def_id).container`,
43    /// aka. `interner.parent(def_id)`.
44    Projection { def_id: I::TraitAssocTyId },
45
46    /// An associated type in an inherent `impl`
47    ///
48    /// The `def_id` is the `DefId` of the `ImplItem` for the associated type.
49    Inherent { def_id: I::InherentAssocTyId },
50
51    /// An opaque type (usually from `impl Trait` in type aliases or function return types)
52    ///
53    /// `def_id` is the `DefId` of the `OpaqueType` item.
54    ///
55    ///
56    /// Can only be normalized away in `PostAnalysis` mode or its defining scope.
57    ///
58    /// During codegen, `interner.type_of(def_id)` can be used to get the type of the
59    /// underlying type if the type is an opaque.
60    Opaque { def_id: I::OpaqueTyId },
61
62    /// A type alias that actually checks its trait bounds.
63    ///
64    /// Currently only used if the type alias references opaque types.
65    /// Can always be normalized away.
66    Free { def_id: I::FreeTyAliasId },
67}
68
69impl<I: Interner> AliasTyKind<I> {
70    pub fn descr(self) -> &'static str {
71        match self {
72            AliasTyKind::Projection { .. } => "associated type",
73            AliasTyKind::Inherent { .. } => "inherent associated type",
74            AliasTyKind::Opaque { .. } => "opaque type",
75            AliasTyKind::Free { .. } => "type alias",
76        }
77    }
78
79    pub fn try_to_projection(self) -> Option<I::TraitAssocTyId> {
80        match self {
81            AliasTyKind::Projection { def_id } => Some(def_id),
82            _ => None,
83        }
84    }
85
86    pub fn try_to_inherent(self) -> Option<I::InherentAssocTyId> {
87        match self {
88            AliasTyKind::Inherent { def_id } => Some(def_id),
89            _ => None,
90        }
91    }
92
93    pub fn try_to_opaque(self) -> Option<I::OpaqueTyId> {
94        match self {
95            AliasTyKind::Opaque { def_id } => Some(def_id),
96            _ => None,
97        }
98    }
99
100    pub fn try_to_free(self) -> Option<I::FreeTyAliasId> {
101        match self {
102            AliasTyKind::Free { def_id } => Some(def_id),
103            _ => None,
104        }
105    }
106}
107
108/// Whether an alias type is rigid or potentially normalizeable.
109///
110/// This is not used by the old solver and is always `IsRigid::No` there. In the new solver,
111/// aliases which cannot be further normalized in their current scope normalize to themselves
112/// with `IsRigid::Yes`. At this point we no longer have to try and renormalize this alias
113/// later on.
114///
115/// Rigidness becomes outdated when the surrounding typing mode or param env changes,
116/// because further normalization might be possible.
117/// We should also note that rigidness can be shared within some typing mode groups
118/// if the param env is the same, e.g., `Typeck/PostTypeckThroughBorrowck` and
119/// `PostAnalysis/Codegen`.
120///
121/// We always reveal auto traits for rigid aliases and this can cause query cycle in
122/// `TypingMode::ErasedNotCoherence`. Thus we don't allow incorrectly marked rigid local
123/// opaques. We achieve this by immediately bailing out when normalizing local opaques.
124///
125/// FIXME(#155345): Alias handling is currently still in flux for the new trait
126/// solver and this is currently somewhat messy. Please reach out on
127/// #t-types/trait-system-refactor-initiative if you encounter this and it isn't
128/// immediately clear what to do.
129#[derive(#[automatically_derived]impl ::core::fmt::Debug for IsRigid {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self { IsRigid::Yes => "Yes", IsRigid::No => "No", })
    }
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
    for IsRigid {
}
#[automatically_derived]impl ::core::clone::Clone for IsRigid {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::marker::Copy for IsRigid { }Copy, #[automatically_derived]impl ::core::hash::Hash for IsRigid {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state)
    }
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for IsRigid {
}
#[automatically_derived]impl ::core::cmp::PartialEq for IsRigid {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq)]
130#[derive(const _: () =
    {
        impl<I> ::rustc_type_ir::TypeVisitable<I> for IsRigid where
            I: Interner {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self { IsRigid::Yes => {} IsRigid::No => {} }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        unsafe impl<__V> ::rustc_type_ir::GenericTypeVisitable<__V> for
            IsRigid {
            fn generic_visit_with(&self, __visitor: &mut __V) {
                match *self { IsRigid::Yes => {} IsRigid::No => {} }
            }
        }
    };GenericTypeVisitable, const _: () =
    {
        impl<I> ::rustc_type_ir::TypeFoldable<I> for IsRigid where I: Interner
            {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        IsRigid::Yes => { IsRigid::Yes }
                        IsRigid::No => { IsRigid::No }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    IsRigid::Yes => { IsRigid::Yes }
                    IsRigid::No => { IsRigid::No }
                }
            }
        }
    };TypeFoldable_Generic)]
131#[cfg_attr(
132    feature = "nightly",
133    derive(const _: () =
    {
        impl<__D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for IsRigid {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { IsRigid::Yes }
                    1usize => { IsRigid::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `IsRigid`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<__E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for IsRigid {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        IsRigid::Yes => { 0usize }
                        IsRigid::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for IsRigid {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    IsRigid::Yes => 0u8.stable_hash(__hcx, __hasher),
                    IsRigid::No => 1u8.stable_hash(__hcx, __hasher),
                }
                match *self { IsRigid::Yes => {} IsRigid::No => {} }
            }
        }
    };StableHash_NoContext)
134)]
135pub enum IsRigid {
136    Yes,
137    No,
138}
139
140impl IsRigid {
141    pub fn yes_if_next_solver<I: Interner>(interner: I) -> IsRigid {
142        if interner.next_trait_solver_globally() { IsRigid::Yes } else { IsRigid::No }
143    }
144}
145
146/// Defines the kinds of types used by the type system.
147///
148/// Types written by the user start out as `hir::TyKind` and get
149/// converted to this representation using `<dyn HirTyLowerer>::lower_ty`.
150#[cfg_attr(feature = "nightly", rustc_diagnostic_item = "IrTyKind")]
151#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for TyKind<I> where I: Interner {
    #[inline]
    fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for TyKind<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for TyKind<I> where I: Interner {
    fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
        match self {
            TyKind::Bool => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
            }
            TyKind::Char => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
            }
            TyKind::Int(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::Uint(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::Float(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::Adt(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::Foreign(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::Str => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
            }
            TyKind::Array(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::Pat(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::Slice(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::RawPtr(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::Ref(ref __field_0, ref __field_1, ref __field_2) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
                ::core::hash::Hash::hash(__field_2, __state);
            }
            TyKind::FnDef(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::FnPtr(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::UnsafeBinder(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::Dynamic(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::Closure(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::CoroutineClosure(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::Coroutine(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::CoroutineWitness(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::Never => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
            }
            TyKind::Tuple(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::Alias(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::Param(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::Bound(ref __field_0, ref __field_1) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
                ::core::hash::Hash::hash(__field_1, __state);
            }
            TyKind::Placeholder(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::Infer(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
            TyKind::Error(ref __field_0) => {
                ::core::hash::Hash::hash(&::core::mem::discriminant(self),
                    __state);
                ::core::hash::Hash::hash(__field_0, __state);
            }
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for TyKind<I> where I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        if ::core::mem::discriminant(self) ==
                ::core::mem::discriminant(__other) {
            match (self, __other) {
                (TyKind::Int(ref __field_0), TyKind::Int(ref __other_field_0))
                    =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::Uint(ref __field_0),
                    TyKind::Uint(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::Float(ref __field_0),
                    TyKind::Float(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::Adt(ref __field_0, ref __field_1),
                    TyKind::Adt(ref __other_field_0, ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::Foreign(ref __field_0),
                    TyKind::Foreign(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::Array(ref __field_0, ref __field_1),
                    TyKind::Array(ref __other_field_0, ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::Pat(ref __field_0, ref __field_1),
                    TyKind::Pat(ref __other_field_0, ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::Slice(ref __field_0),
                    TyKind::Slice(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::RawPtr(ref __field_0, ref __field_1),
                    TyKind::RawPtr(ref __other_field_0, ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::Ref(ref __field_0, ref __field_1, ref __field_2),
                    TyKind::Ref(ref __other_field_0, ref __other_field_1,
                    ref __other_field_2)) =>
                    true &&
                                ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                            ::core::cmp::PartialEq::eq(__field_1, __other_field_1) &&
                        ::core::cmp::PartialEq::eq(__field_2, __other_field_2),
                (TyKind::FnDef(ref __field_0, ref __field_1),
                    TyKind::FnDef(ref __other_field_0, ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::FnPtr(ref __field_0, ref __field_1),
                    TyKind::FnPtr(ref __other_field_0, ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::UnsafeBinder(ref __field_0),
                    TyKind::UnsafeBinder(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::Dynamic(ref __field_0, ref __field_1),
                    TyKind::Dynamic(ref __other_field_0, ref __other_field_1))
                    =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::Closure(ref __field_0, ref __field_1),
                    TyKind::Closure(ref __other_field_0, ref __other_field_1))
                    =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::CoroutineClosure(ref __field_0, ref __field_1),
                    TyKind::CoroutineClosure(ref __other_field_0,
                    ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::Coroutine(ref __field_0, ref __field_1),
                    TyKind::Coroutine(ref __other_field_0, ref __other_field_1))
                    =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::CoroutineWitness(ref __field_0, ref __field_1),
                    TyKind::CoroutineWitness(ref __other_field_0,
                    ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::Tuple(ref __field_0),
                    TyKind::Tuple(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::Alias(ref __field_0, ref __field_1),
                    TyKind::Alias(ref __other_field_0, ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::Param(ref __field_0),
                    TyKind::Param(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::Bound(ref __field_0, ref __field_1),
                    TyKind::Bound(ref __other_field_0, ref __other_field_1)) =>
                    true &&
                            ::core::cmp::PartialEq::eq(__field_0, __other_field_0) &&
                        ::core::cmp::PartialEq::eq(__field_1, __other_field_1),
                (TyKind::Placeholder(ref __field_0),
                    TyKind::Placeholder(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::Infer(ref __field_0),
                    TyKind::Infer(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                (TyKind::Error(ref __field_0),
                    TyKind::Error(ref __other_field_0)) =>
                    true &&
                        ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
                _ => true,
            }
        } else { false }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq; I: Interner)]
152#[derive(const _: () =
    {
        unsafe impl<I: Interner, __V>
            ::rustc_type_ir::GenericTypeVisitable<__V> for TyKind<I> where
            IntTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
            UintTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
            FloatTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::AdtDef: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::ForeignId: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
            Const<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::Pat: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
            Mutability: ::rustc_type_ir::GenericTypeVisitable<__V>,
            Region<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
            Mutability: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::FunctionId: ::rustc_type_ir::GenericTypeVisitable<__V>,
            ty::Binder<I,
            I::GenericArgs>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            ty::Binder<I,
            FnSigTys<I>>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            FnHeader<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            UnsafeBinderInner<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::BoundExistentialPredicates: ::rustc_type_ir::GenericTypeVisitable<__V>,
            Region<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::ClosureId: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::CoroutineClosureId: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::CoroutineId: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::CoroutineId: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::Tys: ::rustc_type_ir::GenericTypeVisitable<__V>,
            IsRigid: ::rustc_type_ir::GenericTypeVisitable<__V>,
            AliasTy<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::ParamTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
            BoundVarIndexKind: ::rustc_type_ir::GenericTypeVisitable<__V>,
            ty::BoundTy<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            ty::PlaceholderType<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
            InferTy: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::ErrorGuaranteed: ::rustc_type_ir::GenericTypeVisitable<__V> {
            fn generic_visit_with(&self, __visitor: &mut __V) {
                match *self {
                    TyKind::Bool => {}
                    TyKind::Char => {}
                    TyKind::Int(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::Uint(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::Float(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::Adt(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::Foreign(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::Str => {}
                    TyKind::Array(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::Pat(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::Slice(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::RawPtr(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_2,
                                __visitor);
                        }
                    }
                    TyKind::FnDef(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::FnPtr(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::UnsafeBinder(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::Dynamic(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::Closure(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
                        => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::Coroutine(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
                        => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::Never => {}
                    TyKind::Tuple(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::Alias(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::Param(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::Bound(ref __binding_0, ref __binding_1) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                    TyKind::Placeholder(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::Infer(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                    TyKind::Error(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                }
            }
        }
    };GenericTypeVisitable)]
153#[cfg_attr(
154    feature = "nightly",
155    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for TyKind<I> where
            I::AdtDef: ::rustc_serialize::Encodable<__E>,
            I::GenericArgs: ::rustc_serialize::Encodable<__E>,
            I::ForeignId: ::rustc_serialize::Encodable<__E>,
            I::Ty: ::rustc_serialize::Encodable<__E>,
            Const<I>: ::rustc_serialize::Encodable<__E>,
            I::Pat: ::rustc_serialize::Encodable<__E>,
            Region<I>: ::rustc_serialize::Encodable<__E>,
            I::FunctionId: ::rustc_serialize::Encodable<__E>,
            ty::Binder<I, I::GenericArgs>: ::rustc_serialize::Encodable<__E>,
            ty::Binder<I, FnSigTys<I>>: ::rustc_serialize::Encodable<__E>,
            FnHeader<I>: ::rustc_serialize::Encodable<__E>,
            UnsafeBinderInner<I>: ::rustc_serialize::Encodable<__E>,
            I::BoundExistentialPredicates: ::rustc_serialize::Encodable<__E>,
            I::ClosureId: ::rustc_serialize::Encodable<__E>,
            I::CoroutineClosureId: ::rustc_serialize::Encodable<__E>,
            I::CoroutineId: ::rustc_serialize::Encodable<__E>,
            I::Tys: ::rustc_serialize::Encodable<__E>,
            AliasTy<I>: ::rustc_serialize::Encodable<__E>,
            I::ParamTy: ::rustc_serialize::Encodable<__E>,
            ty::BoundTy<I>: ::rustc_serialize::Encodable<__E>,
            ty::PlaceholderType<I>: ::rustc_serialize::Encodable<__E>,
            I::ErrorGuaranteed: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        TyKind::Bool => { 0usize }
                        TyKind::Char => { 1usize }
                        TyKind::Int(ref __binding_0) => { 2usize }
                        TyKind::Uint(ref __binding_0) => { 3usize }
                        TyKind::Float(ref __binding_0) => { 4usize }
                        TyKind::Adt(ref __binding_0, ref __binding_1) => { 5usize }
                        TyKind::Foreign(ref __binding_0) => { 6usize }
                        TyKind::Str => { 7usize }
                        TyKind::Array(ref __binding_0, ref __binding_1) => {
                            8usize
                        }
                        TyKind::Pat(ref __binding_0, ref __binding_1) => { 9usize }
                        TyKind::Slice(ref __binding_0) => { 10usize }
                        TyKind::RawPtr(ref __binding_0, ref __binding_1) => {
                            11usize
                        }
                        TyKind::Ref(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            12usize
                        }
                        TyKind::FnDef(ref __binding_0, ref __binding_1) => {
                            13usize
                        }
                        TyKind::FnPtr(ref __binding_0, ref __binding_1) => {
                            14usize
                        }
                        TyKind::UnsafeBinder(ref __binding_0) => { 15usize }
                        TyKind::Dynamic(ref __binding_0, ref __binding_1) => {
                            16usize
                        }
                        TyKind::Closure(ref __binding_0, ref __binding_1) => {
                            17usize
                        }
                        TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
                            => {
                            18usize
                        }
                        TyKind::Coroutine(ref __binding_0, ref __binding_1) => {
                            19usize
                        }
                        TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
                            => {
                            20usize
                        }
                        TyKind::Never => { 21usize }
                        TyKind::Tuple(ref __binding_0) => { 22usize }
                        TyKind::Alias(ref __binding_0, ref __binding_1) => {
                            23usize
                        }
                        TyKind::Param(ref __binding_0) => { 24usize }
                        TyKind::Bound(ref __binding_0, ref __binding_1) => {
                            25usize
                        }
                        TyKind::Placeholder(ref __binding_0) => { 26usize }
                        TyKind::Infer(ref __binding_0) => { 27usize }
                        TyKind::Error(ref __binding_0) => { 28usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    TyKind::Bool => {}
                    TyKind::Char => {}
                    TyKind::Int(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Uint(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Float(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Adt(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Foreign(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Str => {}
                    TyKind::Array(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Pat(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Slice(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::RawPtr(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    TyKind::FnDef(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::FnPtr(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::UnsafeBinder(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Dynamic(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Closure(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Coroutine(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Never => {}
                    TyKind::Tuple(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Alias(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Param(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Bound(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Placeholder(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Infer(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Error(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for TyKind<I> where
            I::AdtDef: ::rustc_serialize::Decodable<__D>,
            I::GenericArgs: ::rustc_serialize::Decodable<__D>,
            I::ForeignId: ::rustc_serialize::Decodable<__D>,
            I::Ty: ::rustc_serialize::Decodable<__D>,
            Const<I>: ::rustc_serialize::Decodable<__D>,
            I::Pat: ::rustc_serialize::Decodable<__D>,
            Region<I>: ::rustc_serialize::Decodable<__D>,
            I::FunctionId: ::rustc_serialize::Decodable<__D>,
            ty::Binder<I, I::GenericArgs>: ::rustc_serialize::Decodable<__D>,
            ty::Binder<I, FnSigTys<I>>: ::rustc_serialize::Decodable<__D>,
            FnHeader<I>: ::rustc_serialize::Decodable<__D>,
            UnsafeBinderInner<I>: ::rustc_serialize::Decodable<__D>,
            I::BoundExistentialPredicates: ::rustc_serialize::Decodable<__D>,
            I::ClosureId: ::rustc_serialize::Decodable<__D>,
            I::CoroutineClosureId: ::rustc_serialize::Decodable<__D>,
            I::CoroutineId: ::rustc_serialize::Decodable<__D>,
            I::Tys: ::rustc_serialize::Decodable<__D>,
            AliasTy<I>: ::rustc_serialize::Decodable<__D>,
            I::ParamTy: ::rustc_serialize::Decodable<__D>,
            ty::BoundTy<I>: ::rustc_serialize::Decodable<__D>,
            ty::PlaceholderType<I>: ::rustc_serialize::Decodable<__D>,
            I::ErrorGuaranteed: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { TyKind::Bool }
                    1usize => { TyKind::Char }
                    2usize => {
                        TyKind::Int(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        TyKind::Uint(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        TyKind::Float(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        TyKind::Adt(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        TyKind::Foreign(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => { TyKind::Str }
                    8usize => {
                        TyKind::Array(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => {
                        TyKind::Pat(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    10usize => {
                        TyKind::Slice(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    11usize => {
                        TyKind::RawPtr(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    12usize => {
                        TyKind::Ref(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    13usize => {
                        TyKind::FnDef(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    14usize => {
                        TyKind::FnPtr(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    15usize => {
                        TyKind::UnsafeBinder(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    16usize => {
                        TyKind::Dynamic(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    17usize => {
                        TyKind::Closure(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    18usize => {
                        TyKind::CoroutineClosure(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    19usize => {
                        TyKind::Coroutine(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    20usize => {
                        TyKind::CoroutineWitness(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    21usize => { TyKind::Never }
                    22usize => {
                        TyKind::Tuple(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    23usize => {
                        TyKind::Alias(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    24usize => {
                        TyKind::Param(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    25usize => {
                        TyKind::Bound(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    26usize => {
                        TyKind::Placeholder(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    27usize => {
                        TyKind::Infer(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    28usize => {
                        TyKind::Error(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TyKind`, expected 0..29, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            TyKind<I> where
            I::AdtDef: ::rustc_data_structures::stable_hash::StableHash,
            I::GenericArgs: ::rustc_data_structures::stable_hash::StableHash,
            I::ForeignId: ::rustc_data_structures::stable_hash::StableHash,
            I::Ty: ::rustc_data_structures::stable_hash::StableHash,
            Const<I>: ::rustc_data_structures::stable_hash::StableHash,
            I::Pat: ::rustc_data_structures::stable_hash::StableHash,
            Region<I>: ::rustc_data_structures::stable_hash::StableHash,
            I::FunctionId: ::rustc_data_structures::stable_hash::StableHash,
            ty::Binder<I,
            I::GenericArgs>: ::rustc_data_structures::stable_hash::StableHash,
            ty::Binder<I,
            FnSigTys<I>>: ::rustc_data_structures::stable_hash::StableHash,
            FnHeader<I>: ::rustc_data_structures::stable_hash::StableHash,
            UnsafeBinderInner<I>: ::rustc_data_structures::stable_hash::StableHash,
            I::BoundExistentialPredicates: ::rustc_data_structures::stable_hash::StableHash,
            I::ClosureId: ::rustc_data_structures::stable_hash::StableHash,
            I::CoroutineClosureId: ::rustc_data_structures::stable_hash::StableHash,
            I::CoroutineId: ::rustc_data_structures::stable_hash::StableHash,
            I::Tys: ::rustc_data_structures::stable_hash::StableHash,
            AliasTy<I>: ::rustc_data_structures::stable_hash::StableHash,
            I::ParamTy: ::rustc_data_structures::stable_hash::StableHash,
            ty::BoundTy<I>: ::rustc_data_structures::stable_hash::StableHash,
            ty::PlaceholderType<I>: ::rustc_data_structures::stable_hash::StableHash,
            I::ErrorGuaranteed: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    TyKind::Bool => 0u8.stable_hash(__hcx, __hasher),
                    TyKind::Char => 1u8.stable_hash(__hcx, __hasher),
                    TyKind::Int(ref __binding_0) =>
                        2u8.stable_hash(__hcx, __hasher),
                    TyKind::Uint(ref __binding_0) =>
                        3u8.stable_hash(__hcx, __hasher),
                    TyKind::Float(ref __binding_0) =>
                        4u8.stable_hash(__hcx, __hasher),
                    TyKind::Adt(ref __binding_0, ref __binding_1) =>
                        5u8.stable_hash(__hcx, __hasher),
                    TyKind::Foreign(ref __binding_0) =>
                        6u8.stable_hash(__hcx, __hasher),
                    TyKind::Str => 7u8.stable_hash(__hcx, __hasher),
                    TyKind::Array(ref __binding_0, ref __binding_1) =>
                        8u8.stable_hash(__hcx, __hasher),
                    TyKind::Pat(ref __binding_0, ref __binding_1) =>
                        9u8.stable_hash(__hcx, __hasher),
                    TyKind::Slice(ref __binding_0) =>
                        10u8.stable_hash(__hcx, __hasher),
                    TyKind::RawPtr(ref __binding_0, ref __binding_1) =>
                        11u8.stable_hash(__hcx, __hasher),
                    TyKind::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => 12u8.stable_hash(__hcx, __hasher),
                    TyKind::FnDef(ref __binding_0, ref __binding_1) =>
                        13u8.stable_hash(__hcx, __hasher),
                    TyKind::FnPtr(ref __binding_0, ref __binding_1) =>
                        14u8.stable_hash(__hcx, __hasher),
                    TyKind::UnsafeBinder(ref __binding_0) =>
                        15u8.stable_hash(__hcx, __hasher),
                    TyKind::Dynamic(ref __binding_0, ref __binding_1) =>
                        16u8.stable_hash(__hcx, __hasher),
                    TyKind::Closure(ref __binding_0, ref __binding_1) =>
                        17u8.stable_hash(__hcx, __hasher),
                    TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
                        => 18u8.stable_hash(__hcx, __hasher),
                    TyKind::Coroutine(ref __binding_0, ref __binding_1) =>
                        19u8.stable_hash(__hcx, __hasher),
                    TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
                        => 20u8.stable_hash(__hcx, __hasher),
                    TyKind::Never => 21u8.stable_hash(__hcx, __hasher),
                    TyKind::Tuple(ref __binding_0) =>
                        22u8.stable_hash(__hcx, __hasher),
                    TyKind::Alias(ref __binding_0, ref __binding_1) =>
                        23u8.stable_hash(__hcx, __hasher),
                    TyKind::Param(ref __binding_0) =>
                        24u8.stable_hash(__hcx, __hasher),
                    TyKind::Bound(ref __binding_0, ref __binding_1) =>
                        25u8.stable_hash(__hcx, __hasher),
                    TyKind::Placeholder(ref __binding_0) =>
                        26u8.stable_hash(__hcx, __hasher),
                    TyKind::Infer(ref __binding_0) =>
                        27u8.stable_hash(__hcx, __hasher),
                    TyKind::Error(ref __binding_0) =>
                        28u8.stable_hash(__hcx, __hasher),
                }
                match *self {
                    TyKind::Bool => {}
                    TyKind::Char => {}
                    TyKind::Int(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Uint(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Float(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Adt(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Foreign(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Str => {}
                    TyKind::Array(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Pat(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Slice(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::RawPtr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::FnDef(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::FnPtr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::UnsafeBinder(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Dynamic(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Closure(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Coroutine(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Never => {}
                    TyKind::Tuple(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Alias(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Param(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Bound(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Placeholder(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Infer(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TyKind::Error(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
156)]
157pub enum TyKind<I: Interner> {
158    /// The primitive boolean type. Written as `bool`.
159    Bool,
160
161    /// The primitive character type; holds a Unicode scalar value
162    /// (a non-surrogate code point). Written as `char`.
163    Char,
164
165    /// A primitive signed integer type. For example, `i32`.
166    Int(IntTy),
167
168    /// A primitive unsigned integer type. For example, `u32`.
169    Uint(UintTy),
170
171    /// A primitive floating-point type. For example, `f64`.
172    Float(FloatTy),
173
174    /// Algebraic data types (ADT). For example: structures, enumerations and unions.
175    ///
176    /// For example, the type `List<i32>` would be represented using the `AdtDef`
177    /// for `struct List<T>` and the args `[i32]`.
178    ///
179    /// Note that generic parameters in fields only get lazily instantiated
180    /// by using something like `adt_def.all_fields().map(|field| field.ty(interner, args))`.
181    Adt(I::AdtDef, I::GenericArgs),
182
183    /// An unsized FFI type that is opaque to Rust. Written as `extern type T`.
184    Foreign(I::ForeignId),
185
186    /// The pointee of a string slice. Written as `str`.
187    Str,
188
189    /// An array with the given length. Written as `[T; N]`.
190    Array(I::Ty, Const<I>),
191
192    /// A pattern newtype.
193    ///
194    /// Takes any type and restricts its valid values to its pattern.
195    /// This will also change the layout to take advantage of this restriction.
196    /// Only `Copy` and `Clone` will automatically get implemented for pattern types.
197    /// Auto-traits treat this as if it were an aggregate with a single nested type.
198    /// Only supports integer range patterns for now.
199    Pat(I::Ty, I::Pat),
200
201    /// The pointee of an array slice. Written as `[T]`.
202    Slice(I::Ty),
203
204    /// A raw pointer. Written as `*mut T` or `*const T`
205    RawPtr(I::Ty, Mutability),
206
207    /// A reference; a pointer with an associated lifetime. Written as
208    /// `&'a mut T` or `&'a T`.
209    Ref(Region<I>, I::Ty, Mutability),
210
211    /// The anonymous type of a function declaration/definition.
212    ///
213    /// Each function has a unique type.
214    ///
215    /// For the function `fn foo() -> i32 { 3 }` this type would be
216    /// shown to the user as `fn() -> i32 {foo}`.
217    ///
218    /// For example the type of `bar` here:
219    /// ```rust
220    /// fn foo() -> i32 { 1 }
221    /// let bar = foo; // bar: fn() -> i32 {foo}
222    /// ```
223    FnDef(I::FunctionId, ty::Binder<I, I::GenericArgs>),
224
225    /// A pointer to a function.
226    ///
227    /// Written as `fn() -> i32`.
228    ///
229    /// Note that both functions and closures start out as either
230    /// [FnDef] or [Closure] which can be then be coerced to this variant.
231    ///
232    /// For example the type of `bar` here:
233    ///
234    /// ```rust
235    /// fn foo() -> i32 { 1 }
236    /// let bar: fn() -> i32 = foo;
237    /// ```
238    ///
239    /// These two fields are equivalent to a `ty::Binder<I, FnSig<I>>`. But by
240    /// splitting that into two pieces, we get a more compact data layout that
241    /// reduces the size of `TyKind` by 8 bytes. It is a very hot type, so it's
242    /// worth the mild inconvenience.
243    FnPtr(ty::Binder<I, FnSigTys<I>>, FnHeader<I>),
244
245    /// An unsafe binder type.
246    ///
247    /// A higher-ranked type used to represent a type which has had some of its
248    /// lifetimes erased. This can be used to represent types in positions where
249    /// a lifetime is literally inexpressible, such as self-referential types.
250    UnsafeBinder(UnsafeBinderInner<I>),
251
252    /// A trait object. Written as `dyn for<'b> Trait<'b, Assoc = u32> + Send + 'a`.
253    Dynamic(I::BoundExistentialPredicates, Region<I>),
254
255    /// The anonymous type of a closure. Used to represent the type of `|a| a`.
256    ///
257    /// Closure args contain both the - potentially instantiated - generic parameters
258    /// of its parent and some synthetic parameters. See the documentation for
259    /// `ClosureArgs` for more details.
260    Closure(I::ClosureId, I::GenericArgs),
261
262    /// The anonymous type of an async closure. Used to represent the type of `async |a| a`.
263    ///
264    /// This type itself is not a coroutine, it just represents a closure that returns one.
265    ///
266    /// Coroutine-closure args contain both the - potentially instantiated - generic
267    /// parameters of its parent and some synthetic parameters. See the documentation
268    /// for `CoroutineClosureArgs` for more details.
269    CoroutineClosure(I::CoroutineClosureId, I::GenericArgs),
270
271    /// The anonymous type of a coroutine. Used to represent the type of
272    /// `|a| yield a`.
273    ///
274    /// For more info about coroutine args, visit the documentation for
275    /// `CoroutineArgs`.
276    Coroutine(I::CoroutineId, I::GenericArgs),
277
278    /// A type representing the types stored inside a coroutine.
279    ///
280    /// This should only appear as part of the `CoroutineArgs`.
281    ///
282    /// Unlike upvars, the witness can reference lifetimes from
283    /// inside of the coroutine itself. To deal with them in
284    /// the type of the coroutine, we convert them to higher ranked
285    /// lifetimes bound by the witness itself.
286    ///
287    /// This contains the `DefId` and the `GenericArg` of the coroutine.
288    /// The actual witness types are computed on MIR by the `mir_coroutine_witnesses` query.
289    ///
290    /// Looking at the following example, the witness for this coroutine
291    /// may end up as something like `for<'a> [Vec<i32>, &'a Vec<i32>]`:
292    ///
293    /// ```
294    /// #![feature(coroutines)]
295    /// #[coroutine] static |a| {
296    ///     let x = &vec![3];
297    ///     yield a;
298    ///     yield x[0];
299    /// }
300    /// # ;
301    /// ```
302    CoroutineWitness(I::CoroutineId, I::GenericArgs),
303
304    /// The never type `!`.
305    Never,
306
307    /// A tuple type. For example, `(i32, bool)`.
308    Tuple(I::Tys),
309
310    /// A projection, opaque type, free type alias, or inherent associated type.
311    ///
312    /// All of these types are represented as pairs of def-id and args, and can
313    /// be normalized, so they are grouped conceptually.
314    Alias(IsRigid, AliasTy<I>),
315
316    /// A type parameter; for example, `T` in `fn f<T>(x: T) {}`.
317    Param(I::ParamTy),
318
319    /// Bound type variable, used to represent the `'a` in `for<'a> fn(&'a ())`.
320    ///
321    /// For canonical queries, we replace inference variables with bound variables,
322    /// so e.g. when checking whether `&'_ (): Trait<_>` holds, we canonicalize that to
323    /// `for<'a, T> &'a (): Trait<T>` and then convert the introduced bound variables
324    /// back to inference variables in a new inference context when inside of the query.
325    ///
326    /// It is conventional to render anonymous bound types like `^N` or `^D_N`,
327    /// where `N` is the bound variable's anonymous index into the binder, and
328    /// `D` is the debruijn index, or totally omitted if the debruijn index is zero.
329    ///
330    /// See the `rustc-dev-guide` for more details about
331    /// [higher-ranked trait bounds][1] and [canonical queries][2].
332    ///
333    /// [1]: https://rustc-dev-guide.rust-lang.org/traits/hrtb.html
334    /// [2]: https://rustc-dev-guide.rust-lang.org/traits/canonical-queries.html
335    Bound(BoundVarIndexKind, ty::BoundTy<I>),
336
337    /// A placeholder type, used during higher ranked subtyping to instantiate
338    /// bound variables.
339    ///
340    /// It is conventional to render anonymous placeholder types like `!N` or `!U_N`,
341    /// where `N` is the placeholder variable's anonymous index (which corresponds
342    /// to the bound variable's index from the binder from which it was instantiated),
343    /// and `U` is the universe index in which it is instantiated, or totally omitted
344    /// if the universe index is zero.
345    Placeholder(ty::PlaceholderType<I>),
346
347    /// A type variable used during type checking.
348    ///
349    /// Similar to placeholders, inference variables also live in a universe to
350    /// correctly deal with higher ranked types. Though unlike placeholders,
351    /// that universe is stored in the `InferCtxt` instead of directly
352    /// inside of the type.
353    Infer(InferTy),
354
355    /// A placeholder for a type which could not be computed.
356    ///
357    /// This is propagated to avoid useless error messages.
358    Error(I::ErrorGuaranteed),
359}
360
361impl<I: Interner> Eq for TyKind<I> {}
362
363impl<I: Interner> TyKind<I> {
364    pub fn fn_sig(self, interner: I) -> ty::Binder<I, ty::FnSig<I>> {
365        self.unnormalized_fn_sig(interner).skip_normalization()
366    }
367
368    pub fn unnormalized_fn_sig(self, interner: I) -> Unnormalized<I, ty::Binder<I, ty::FnSig<I>>> {
369        match self {
370            ty::FnPtr(sig_tys, hdr) => Unnormalized::new_wip(sig_tys.with(hdr)),
371            ty::FnDef(def_id, args) => {
372                interner.fn_sig(def_id).instantiate(interner, args.no_bound_vars().unwrap())
373            }
374            ty::Error(_) => {
375                // ignore errors (#54954)
376                Unnormalized::dummy(ty::Binder::dummy(ty::FnSig::dummy()))
377            }
378            ty::Closure(..) => {
    ::core::panicking::panic_fmt(format_args!("to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`"));
}panic!(
379                "to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`",
380            ),
381            _ => {
    ::core::panicking::panic_fmt(format_args!("Ty::fn_sig() called on non-fn type: {0:?}",
            self));
}panic!("Ty::fn_sig() called on non-fn type: {:?}", self),
382        }
383    }
384
385    /// Returns `true` when the outermost type cannot be further normalized,
386    /// resolved, or instantiated.
387    ///
388    /// This includes all primitive types, but also
389    /// things like ADTs and trait objects, since even if their arguments or
390    /// nested types may be further simplified, the outermost [`ty::TyKind`] or
391    /// type constructor remains the same.
392    pub fn is_known_rigid(self) -> bool {
393        match self {
394            ty::Bool
395            | ty::Char
396            | ty::Int(_)
397            | ty::Uint(_)
398            | ty::Float(_)
399            | ty::Adt(_, _)
400            | ty::Foreign(_)
401            | ty::Str
402            | ty::Array(_, _)
403            | ty::Pat(_, _)
404            | ty::Slice(_)
405            | ty::RawPtr(_, _)
406            | ty::Ref(_, _, _)
407            | ty::FnDef(_, _)
408            | ty::FnPtr(..)
409            | ty::UnsafeBinder(_)
410            | ty::Dynamic(_, _)
411            | ty::Closure(_, _)
412            | ty::CoroutineClosure(_, _)
413            | ty::Coroutine(_, _)
414            | ty::CoroutineWitness(..)
415            | ty::Never
416            | ty::Tuple(_) => true,
417
418            ty::Error(_)
419            | ty::Infer(_)
420            | ty::Alias(ty::IsRigid::No | ty::IsRigid::Yes, _)
421            | ty::Param(_)
422            | ty::Bound(_, _)
423            | ty::Placeholder(_) => false,
424        }
425    }
426}
427
428// This is manually implemented because a derive would require `I: Debug`
429impl<I: Interner> fmt::Debug for TyKind<I> {
430    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
431        match self {
432            Bool => f.write_fmt(format_args!("bool"))write!(f, "bool"),
433            Char => f.write_fmt(format_args!("char"))write!(f, "char"),
434            Int(i) => f.write_fmt(format_args!("{0:?}", i))write!(f, "{i:?}"),
435            Uint(u) => f.write_fmt(format_args!("{0:?}", u))write!(f, "{u:?}"),
436            Float(float) => f.write_fmt(format_args!("{0:?}", float))write!(f, "{float:?}"),
437            Adt(d, s) => {
438                f.write_fmt(format_args!("{0:?}", d))write!(f, "{d:?}")?;
439                let mut s = s.iter();
440                let first = s.next();
441                match first {
442                    Some(first) => f.write_fmt(format_args!("<{0:?}", first))write!(f, "<{:?}", first)?,
443                    None => return Ok(()),
444                };
445
446                for arg in s {
447                    f.write_fmt(format_args!(", {0:?}", arg))write!(f, ", {:?}", arg)?;
448                }
449
450                f.write_fmt(format_args!(">"))write!(f, ">")
451            }
452            Foreign(d) => f.debug_tuple("Foreign").field(d).finish(),
453            Str => f.write_fmt(format_args!("str"))write!(f, "str"),
454            Array(t, c) => f.write_fmt(format_args!("[{0:?}; {1:?}]", t, c))write!(f, "[{t:?}; {c:?}]"),
455            Pat(t, p) => f.write_fmt(format_args!("pattern_type!({0:?} is {1:?})", t, p))write!(f, "pattern_type!({t:?} is {p:?})"),
456            Slice(t) => f.write_fmt(format_args!("[{0:?}]", &t))write!(f, "[{:?}]", &t),
457            RawPtr(ty, mutbl) => f.write_fmt(format_args!("*{0} {1:?}", mutbl.ptr_str(), ty))write!(f, "*{} {:?}", mutbl.ptr_str(), ty),
458            Ref(r, t, m) => f.write_fmt(format_args!("&{0:?} {1}{2:?}", r, m.prefix_str(), t))write!(f, "&{:?} {}{:?}", r, m.prefix_str(), t),
459            FnDef(d, s) => f.debug_tuple("FnDef").field(d).field(&s).finish(),
460            FnPtr(sig_tys, hdr) => f.write_fmt(format_args!("{0:?}", sig_tys.with(*hdr)))write!(f, "{:?}", sig_tys.with(*hdr)),
461            // FIXME(unsafe_binder): print this like `unsafe<'a> T<'a>`.
462            UnsafeBinder(binder) => f.write_fmt(format_args!("{0:?}", binder))write!(f, "{:?}", binder),
463            Dynamic(p, r) => f.write_fmt(format_args!("dyn {0:?} + {1:?}", p, r))write!(f, "dyn {p:?} + {r:?}"),
464            Closure(d, s) => f.debug_tuple("Closure").field(d).field(&s).finish(),
465            CoroutineClosure(d, s) => f.debug_tuple("CoroutineClosure").field(d).field(&s).finish(),
466            Coroutine(d, s) => f.debug_tuple("Coroutine").field(d).field(&s).finish(),
467            CoroutineWitness(d, s) => f.debug_tuple("CoroutineWitness").field(d).field(&s).finish(),
468            Never => f.write_fmt(format_args!("!"))write!(f, "!"),
469            Tuple(t) => {
470                f.write_fmt(format_args!("("))write!(f, "(")?;
471                let mut count = 0;
472                for ty in t.iter() {
473                    if count > 0 {
474                        f.write_fmt(format_args!(", "))write!(f, ", ")?;
475                    }
476                    f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
477                    count += 1;
478                }
479                // unary tuples need a trailing comma
480                if count == 1 {
481                    f.write_fmt(format_args!(","))write!(f, ",")?;
482                }
483                f.write_fmt(format_args!(")"))write!(f, ")")
484            }
485            Alias(is_rigid, a) => f.debug_tuple("Alias").field(&is_rigid).field(&a).finish(),
486            Param(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
487            Bound(d, b) => crate::debug_bound_var(f, *d, b),
488            Placeholder(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
489            Infer(t) => f.write_fmt(format_args!("{0:?}", t))write!(f, "{:?}", t),
490            TyKind::Error(_) => f.write_fmt(format_args!("{{type error}}"))write!(f, "{{type error}}"),
491        }
492    }
493}
494
495impl<I: Interner> AliasTy<I> {
496    pub fn new_from_args(interner: I, kind: AliasTyKind<I>, args: I::GenericArgs) -> AliasTy<I> {
497        if truecfg!(debug_assertions) {
498            interner.debug_assert_alias_term_args_compatible(kind.into(), args);
499        }
500        AliasTy { kind, args, _use_alias_new_instead: () }
501    }
502
503    pub fn new(
504        interner: I,
505        kind: AliasTyKind<I>,
506        args: impl IntoIterator<Item: Into<I::GenericArg>>,
507    ) -> AliasTy<I> {
508        let args = interner.mk_args_from_iter(args.into_iter().map(Into::into));
509        Self::new_from_args(interner, kind, args)
510    }
511
512    /// Whether this alias type is an opaque.
513    pub fn is_opaque(self) -> bool {
514        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    AliasTyKind::Opaque { .. } => true,
    _ => false,
}matches!(self.kind, AliasTyKind::Opaque { .. })
515    }
516
517    pub fn to_ty(self, interner: I, is_rigid: ty::IsRigid) -> I::Ty {
518        Ty::new_alias(interner, is_rigid, self)
519    }
520
521    pub fn try_to_projection(self) -> Option<ProjectionAliasTy<I>> {
522        self.kind.try_to_projection().map(|kind| ty::Alias {
523            kind,
524            args: self.args,
525            _use_alias_new_instead: (),
526        })
527    }
528
529    pub fn try_to_inherent(self) -> Option<InherentAliasTy<I>> {
530        self.kind.try_to_inherent().map(|kind| ty::Alias {
531            kind,
532            args: self.args,
533            _use_alias_new_instead: (),
534        })
535    }
536
537    pub fn try_to_opaque(self) -> Option<OpaqueAliasTy<I>> {
538        self.kind.try_to_opaque().map(|kind| ty::Alias {
539            kind,
540            args: self.args,
541            _use_alias_new_instead: (),
542        })
543    }
544
545    pub fn try_to_free(self) -> Option<FreeAliasTy<I>> {
546        self.kind.try_to_free().map(|kind| ty::Alias {
547            kind,
548            args: self.args,
549            _use_alias_new_instead: (),
550        })
551    }
552}
553
554impl<I: Interner> ProjectionAliasTy<I> {
555    pub fn new_projection_from_args(
556        interner: I,
557        kind: I::TraitAssocTyId,
558        args: I::GenericArgs,
559    ) -> Self {
560        interner.debug_assert_alias_term_args_compatible(
561            ty::AliasTermKind::ProjectionTy { def_id: kind },
562            args,
563        );
564        Self { kind, args, _use_alias_new_instead: () }
565    }
566
567    pub fn projection_to_alias_ty(self) -> AliasTy<I> {
568        AliasTy {
569            kind: AliasTyKind::Projection { def_id: self.kind },
570            args: self.args,
571            _use_alias_new_instead: (),
572        }
573    }
574
575    #[track_caller]
576    pub fn projection_self_ty(self) -> I::Ty {
577        self.args.type_at(0)
578    }
579}
580
581/// The following methods work only with (trait) associated type projections.
582// FIXME: Migrate these to the impl on ProjectionAliasTy (by making callers use `try_to_projection`
583// or similar when they guard for projections)
584impl<I: Interner> AliasTy<I> {
585    #[track_caller]
586    pub fn self_ty(self) -> I::Ty {
587        self.args.type_at(0)
588    }
589
590    pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> Self {
591        AliasTy::new(
592            interner,
593            self.kind,
594            [self_ty.into()].into_iter().chain(self.args.iter().skip(1)),
595        )
596    }
597
598    pub fn trait_def_id(self, interner: I) -> I::TraitId {
599        let AliasTyKind::Projection { def_id } = self.kind else { { ::core::panicking::panic_fmt(format_args!("expected a projection")); }panic!("expected a projection") };
600
601        interner.projection_parent(def_id.into())
602    }
603
604    /// Extracts the underlying trait reference and own args from this projection.
605    ///
606    /// For example, if this is a projection of `<T as StreamingIterator>::Item<'a>`,
607    /// then this function would return a `T: StreamingIterator` trait reference and
608    /// `['a]` as the own args.
609    pub fn trait_ref_and_own_args<'a>(
610        &'a self,
611        interner: I,
612    ) -> (ty::TraitRef<I>, I::GenericArgsSlice<'a>)
613    where
614        I: 'a,
615    {
616        let AliasTyKind::Projection { def_id } = self.kind else { { ::core::panicking::panic_fmt(format_args!("expected a projection")); }panic!("expected a projection") };
617
618        interner.trait_ref_and_own_args_for_alias(def_id.into(), &self.args)
619    }
620
621    /// Extracts the underlying trait reference from this projection.
622    ///
623    /// For example, if this is a projection of `<T as Iterator>::Item`,
624    /// then this function would return a `T: Iterator` trait reference.
625    ///
626    /// WARNING: This will drop the args for generic associated types
627    /// consider calling [Self::trait_ref_and_own_args] to get those
628    /// as well.
629    pub fn trait_ref(self, interner: I) -> ty::TraitRef<I> {
630        self.trait_ref_and_own_args(interner).0
631    }
632}
633
634impl<I: Interner> InherentAliasTy<I> {
635    pub fn new_inherent_from_args(
636        interner: I,
637        kind: I::InherentAssocTyId,
638        args: I::GenericArgs,
639    ) -> Self {
640        interner.debug_assert_alias_term_args_compatible(
641            ty::AliasTermKind::InherentTy { def_id: kind },
642            args,
643        );
644        Self { kind, args, _use_alias_new_instead: () }
645    }
646
647    pub fn inherent_to_alias_ty(self) -> AliasTy<I> {
648        AliasTy {
649            kind: AliasTyKind::Inherent { def_id: self.kind },
650            args: self.args,
651            _use_alias_new_instead: (),
652        }
653    }
654}
655
656impl<I: Interner> OpaqueAliasTy<I> {
657    pub fn new_opaque_from_args(interner: I, kind: I::OpaqueTyId, args: I::GenericArgs) -> Self {
658        interner.debug_assert_alias_term_args_compatible(
659            ty::AliasTermKind::OpaqueTy { def_id: kind },
660            args,
661        );
662        Self { kind, args, _use_alias_new_instead: () }
663    }
664
665    pub fn opaque_to_alias_ty(self) -> AliasTy<I> {
666        AliasTy {
667            kind: AliasTyKind::Opaque { def_id: self.kind },
668            args: self.args,
669            _use_alias_new_instead: (),
670        }
671    }
672}
673
674impl<I: Interner> FreeAliasTy<I> {
675    pub fn new_free_from_args(interner: I, kind: I::FreeTyAliasId, args: I::GenericArgs) -> Self {
676        interner.debug_assert_alias_term_args_compatible(
677            ty::AliasTermKind::FreeTy { def_id: kind },
678            args,
679        );
680        Self { kind, args, _use_alias_new_instead: () }
681    }
682
683    pub fn free_to_alias_ty(self) -> AliasTy<I> {
684        AliasTy {
685            kind: AliasTyKind::Free { def_id: self.kind },
686            args: self.args,
687            _use_alias_new_instead: (),
688        }
689    }
690}
691
692#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
    for IntVarValue {
}
#[automatically_derived]impl ::core::clone::Clone for IntVarValue {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<IntTy>;
        let _: ::core::clone::AssertParamIsClone<UintTy>;
        *self
    }
}Clone, #[automatically_derived]impl ::core::marker::Copy for IntVarValue { }Copy, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
    IntVarValue {
}
#[automatically_derived]impl ::core::cmp::PartialEq for IntVarValue {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::IntType(__self_0), Self::IntType(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::UintType(__self_0), Self::UintType(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for IntVarValue {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<IntTy>;
        let _: ::core::cmp::AssertParamIsEq<UintTy>;
    }
}Eq, #[automatically_derived]impl ::core::fmt::Debug for IntVarValue {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Unknown => ::core::fmt::Formatter::write_str(f, "Unknown"),
            Self::IntType(__self_0) =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "IntType", &__self_0),
            Self::UintType(__self_0) =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "UintType", &__self_0),
        }
    }
}Debug)]
693pub enum IntVarValue {
694    Unknown,
695    IntType(IntTy),
696    UintType(UintTy),
697}
698
699impl IntVarValue {
700    pub fn is_known(self) -> bool {
701        match self {
702            IntVarValue::IntType(_) | IntVarValue::UintType(_) => true,
703            IntVarValue::Unknown => false,
704        }
705    }
706
707    pub fn is_unknown(self) -> bool {
708        !self.is_known()
709    }
710}
711
712#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
    for FloatVarValue {
}
#[automatically_derived]impl ::core::clone::Clone for FloatVarValue {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<FloatTy>;
        *self
    }
}Clone, #[automatically_derived]impl ::core::marker::Copy for FloatVarValue { }Copy, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
    FloatVarValue {
}
#[automatically_derived]impl ::core::cmp::PartialEq for FloatVarValue {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Known(__self_0), Self::Known(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for FloatVarValue {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<FloatTy>;
    }
}Eq, #[automatically_derived]impl ::core::fmt::Debug for FloatVarValue {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Unknown => ::core::fmt::Formatter::write_str(f, "Unknown"),
            Self::Known(__self_0) =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Known",
                    &__self_0),
        }
    }
}Debug)]
713pub enum FloatVarValue {
714    Unknown,
715    Known(FloatTy),
716}
717
718impl FloatVarValue {
719    pub fn is_known(self) -> bool {
720        match self {
721            FloatVarValue::Known(_) => true,
722            FloatVarValue::Unknown => false,
723        }
724    }
725
726    pub fn is_unknown(self) -> bool {
727        !self.is_known()
728    }
729}
730
731#[automatically_derived]impl ::core::marker::Copy for TyVid { }
impl TyVid {
    #[doc = r" Maximum value the index can take, as a `u32`."]
    pub const MAX_AS_U32: u32 = 0xFFFF_FF00;
    #[doc = r" Maximum value the index can take."]
    pub const MAX: Self = Self::from_u32(0xFFFF_FF00);
    #[doc = r" Zero value of the index."]
    pub const ZERO: Self = Self::from_u32(0);
    #[doc = r" Creates a new index from a given `usize`."]
    #[doc = r""]
    #[doc = r" # Panics"]
    #[doc = r""]
    #[doc = r" Will panic if `value` exceeds `MAX`."]
    #[inline]
    pub const fn from_usize(value: usize) -> Self {
        if !(value <= (0xFFFF_FF00 as usize)) {
            ::core::panicking::panic("assertion failed: value <= (0xFFFF_FF00 as usize)")
        };
        unsafe { Self::from_u32_unchecked(value as u32) }
    }
    #[doc = r" Creates a new index from a given `u32`."]
    #[doc = r""]
    #[doc = r" # Panics"]
    #[doc = r""]
    #[doc = r" Will panic if `value` exceeds `MAX`."]
    #[inline]
    pub const fn from_u32(value: u32) -> Self {
        if !(value <= 0xFFFF_FF00) {
            ::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
        };
        unsafe { Self::from_u32_unchecked(value) }
    }
    #[doc = r" Creates a new index from a given `u16`."]
    #[doc = r""]
    #[doc = r" # Panics"]
    #[doc = r""]
    #[doc = r" Will panic if `value` exceeds `MAX`."]
    #[inline]
    pub const fn from_u16(value: u16) -> Self {
        let value = value as u32;
        if !(value <= 0xFFFF_FF00) {
            ::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
        };
        unsafe { Self::from_u32_unchecked(value) }
    }
    #[doc = r" Creates a new index from a given `u32`."]
    #[doc = r""]
    #[doc = r" # Safety"]
    #[doc = r""]
    #[doc =
    r" The provided value must be less than or equal to the maximum value for the newtype."]
    #[doc =
    r" Providing a value outside this range is undefined due to layout restrictions."]
    #[doc = r""]
    #[doc = r" Prefer using `from_u32`."]
    #[inline]
    pub const unsafe fn from_u32_unchecked(value: u32) -> Self {
        Self {
            private_use_as_methods_instead: unsafe {
                std::mem::transmute(value)
            },
        }
    }
    #[doc = r" Extracts the value of this index as a `usize`."]
    #[inline]
    pub const fn index(self) -> usize { self.as_usize() }
    #[doc = r" Extracts the value of this index as a `u32`."]
    #[inline]
    pub const fn as_u32(self) -> u32 {
        unsafe { std::mem::transmute(self.private_use_as_methods_instead) }
    }
    #[doc = r" Extracts the value of this index as a `usize`."]
    #[inline]
    pub const fn as_usize(self) -> usize { self.as_u32() as usize }
}
impl std::ops::Add<usize> for TyVid {
    type Output = Self;
    #[inline]
    fn add(self, other: usize) -> Self {
        Self::from_usize(self.index() + other)
    }
}
impl std::ops::AddAssign<usize> for TyVid {
    #[inline]
    fn add_assign(&mut self, other: usize) { *self = *self + other; }
}
impl rustc_index::Idx for TyVid {
    #[inline]
    fn new(value: usize) -> Self { Self::from_usize(value) }
    #[inline]
    fn index(self) -> usize { self.as_usize() }
}
impl ::std::iter::Step for TyVid {
    #[inline]
    fn steps_between(start: &Self, end: &Self) -> (usize, Option<usize>) {
        <usize as
                ::std::iter::Step>::steps_between(&Self::index(*start),
            &Self::index(*end))
    }
    #[inline]
    fn forward_checked(start: Self, u: usize) -> Option<Self> {
        Self::index(start).checked_add(u).map(Self::from_usize)
    }
    #[inline]
    fn backward_checked(start: Self, u: usize) -> Option<Self> {
        Self::index(start).checked_sub(u).map(Self::from_usize)
    }
    #[inline]
    fn forward_overflowing(start: Self, u: usize) -> (Self, bool) {
        let (s, o) = Self::index(start).overflowing_add(u);
        (Self::from_usize(s), o)
    }
    #[inline]
    fn backward_overflowing(start: Self, u: usize) -> (Self, bool) {
        let (s, o) = Self::index(start).overflowing_sub(u);
        (Self::from_usize(s), o)
    }
}
impl ::std::cmp::Ord for TyVid {
    #[inline]
    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
        self.as_u32().cmp(&other.as_u32())
    }
}
impl ::std::cmp::PartialOrd for TyVid {
    #[inline]
    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
        Some(self.cmp(other))
    }
}
impl From<TyVid> for u32 {
    #[inline]
    fn from(v: TyVid) -> u32 { v.as_u32() }
}
impl From<TyVid> for usize {
    #[inline]
    fn from(v: TyVid) -> usize { v.as_usize() }
}
impl From<usize> for TyVid {
    #[inline]
    fn from(value: usize) -> Self { Self::from_usize(value) }
}
impl From<u32> for TyVid {
    #[inline]
    fn from(value: u32) -> Self { Self::from_u32(value) }
}
impl ::std::cmp::Eq for TyVid {}
impl ::std::cmp::PartialEq for TyVid {
    fn eq(&self, other: &Self) -> bool { self.as_u32().eq(&other.as_u32()) }
}
impl ::std::marker::StructuralPartialEq for TyVid { }
impl ::std::hash::Hash for TyVid {
    fn hash<H: ::std::hash::Hasher>(&self, state: &mut H) {
        self.as_u32().hash(state)
    }
}
impl<D: ::rustc_serialize::Decoder> ::rustc_serialize::Decodable<D> for TyVid
    {
    fn decode(d: &mut D) -> Self { Self::from_u32(d.read_u32()) }
}
impl<E: ::rustc_serialize::Encoder> ::rustc_serialize::Encodable<E> for TyVid
    {
    fn encode(&self, e: &mut E) { e.emit_u32(self.as_u32()); }
}
impl ::std::fmt::Debug for TyVid {
    fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        fmt.write_fmt(format_args!("?{0}t", self.as_u32()))
    }
}rustc_index::newtype_index! {
732    /// A **ty**pe **v**ariable **ID**.
733    #[encodable]
734    #[orderable]
735    #[debug_format = "?{}t"]
736    #[gate_rustc_only]
737    pub struct TyVid {}
738}
739
740#[automatically_derived]impl ::core::marker::Copy for IntVid { }
impl IntVid {
    #[doc = r" Maximum value the index can take, as a `u32`."]
    pub const MAX_AS_U32: u32 = 0xFFFF_FF00;
    #[doc = r" Maximum value the index can take."]
    pub const MAX: Self = Self::from_u32(0xFFFF_FF00);
    #[doc = r" Zero value of the index."]
    pub const ZERO: Self = Self::from_u32(0);
    #[doc = r" Creates a new index from a given `usize`."]
    #[doc = r""]
    #[doc = r" # Panics"]
    #[doc = r""]
    #[doc = r" Will panic if `value` exceeds `MAX`."]
    #[inline]
    pub const fn from_usize(value: usize) -> Self {
        if !(value <= (0xFFFF_FF00 as usize)) {
            ::core::panicking::panic("assertion failed: value <= (0xFFFF_FF00 as usize)")
        };
        unsafe { Self::from_u32_unchecked(value as u32) }
    }
    #[doc = r" Creates a new index from a given `u32`."]
    #[doc = r""]
    #[doc = r" # Panics"]
    #[doc = r""]
    #[doc = r" Will panic if `value` exceeds `MAX`."]
    #[inline]
    pub const fn from_u32(value: u32) -> Self {
        if !(value <= 0xFFFF_FF00) {
            ::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
        };
        unsafe { Self::from_u32_unchecked(value) }
    }
    #[doc = r" Creates a new index from a given `u16`."]
    #[doc = r""]
    #[doc = r" # Panics"]
    #[doc = r""]
    #[doc = r" Will panic if `value` exceeds `MAX`."]
    #[inline]
    pub const fn from_u16(value: u16) -> Self {
        let value = value as u32;
        if !(value <= 0xFFFF_FF00) {
            ::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
        };
        unsafe { Self::from_u32_unchecked(value) }
    }
    #[doc = r" Creates a new index from a given `u32`."]
    #[doc = r""]
    #[doc = r" # Safety"]
    #[doc = r""]
    #[doc =
    r" The provided value must be less than or equal to the maximum value for the newtype."]
    #[doc =
    r" Providing a value outside this range is undefined due to layout restrictions."]
    #[doc = r""]
    #[doc = r" Prefer using `from_u32`."]
    #[inline]
    pub const unsafe fn from_u32_unchecked(value: u32) -> Self {
        Self {
            private_use_as_methods_instead: unsafe {
                std::mem::transmute(value)
            },
        }
    }
    #[doc = r" Extracts the value of this index as a `usize`."]
    #[inline]
    pub const fn index(self) -> usize { self.as_usize() }
    #[doc = r" Extracts the value of this index as a `u32`."]
    #[inline]
    pub const fn as_u32(self) -> u32 {
        unsafe { std::mem::transmute(self.private_use_as_methods_instead) }
    }
    #[doc = r" Extracts the value of this index as a `usize`."]
    #[inline]
    pub const fn as_usize(self) -> usize { self.as_u32() as usize }
}
impl std::ops::Add<usize> for IntVid {
    type Output = Self;
    #[inline]
    fn add(self, other: usize) -> Self {
        Self::from_usize(self.index() + other)
    }
}
impl std::ops::AddAssign<usize> for IntVid {
    #[inline]
    fn add_assign(&mut self, other: usize) { *self = *self + other; }
}
impl rustc_index::Idx for IntVid {
    #[inline]
    fn new(value: usize) -> Self { Self::from_usize(value) }
    #[inline]
    fn index(self) -> usize { self.as_usize() }
}
impl ::std::iter::Step for IntVid {
    #[inline]
    fn steps_between(start: &Self, end: &Self) -> (usize, Option<usize>) {
        <usize as
                ::std::iter::Step>::steps_between(&Self::index(*start),
            &Self::index(*end))
    }
    #[inline]
    fn forward_checked(start: Self, u: usize) -> Option<Self> {
        Self::index(start).checked_add(u).map(Self::from_usize)
    }
    #[inline]
    fn backward_checked(start: Self, u: usize) -> Option<Self> {
        Self::index(start).checked_sub(u).map(Self::from_usize)
    }
    #[inline]
    fn forward_overflowing(start: Self, u: usize) -> (Self, bool) {
        let (s, o) = Self::index(start).overflowing_add(u);
        (Self::from_usize(s), o)
    }
    #[inline]
    fn backward_overflowing(start: Self, u: usize) -> (Self, bool) {
        let (s, o) = Self::index(start).overflowing_sub(u);
        (Self::from_usize(s), o)
    }
}
impl ::std::cmp::Ord for IntVid {
    #[inline]
    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
        self.as_u32().cmp(&other.as_u32())
    }
}
impl ::std::cmp::PartialOrd for IntVid {
    #[inline]
    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
        Some(self.cmp(other))
    }
}
impl From<IntVid> for u32 {
    #[inline]
    fn from(v: IntVid) -> u32 { v.as_u32() }
}
impl From<IntVid> for usize {
    #[inline]
    fn from(v: IntVid) -> usize { v.as_usize() }
}
impl From<usize> for IntVid {
    #[inline]
    fn from(value: usize) -> Self { Self::from_usize(value) }
}
impl From<u32> for IntVid {
    #[inline]
    fn from(value: u32) -> Self { Self::from_u32(value) }
}
impl ::std::cmp::Eq for IntVid {}
impl ::std::cmp::PartialEq for IntVid {
    fn eq(&self, other: &Self) -> bool { self.as_u32().eq(&other.as_u32()) }
}
impl ::std::marker::StructuralPartialEq for IntVid { }
impl ::std::hash::Hash for IntVid {
    fn hash<H: ::std::hash::Hasher>(&self, state: &mut H) {
        self.as_u32().hash(state)
    }
}
impl<D: ::rustc_serialize::Decoder> ::rustc_serialize::Decodable<D> for IntVid
    {
    fn decode(d: &mut D) -> Self { Self::from_u32(d.read_u32()) }
}
impl<E: ::rustc_serialize::Encoder> ::rustc_serialize::Encodable<E> for IntVid
    {
    fn encode(&self, e: &mut E) { e.emit_u32(self.as_u32()); }
}
impl ::std::fmt::Debug for IntVid {
    fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        fmt.write_fmt(format_args!("?{0}i", self.as_u32()))
    }
}rustc_index::newtype_index! {
741    /// An **int**egral (`u32`, `i32`, `usize`, etc.) type **v**ariable **ID**.
742    #[encodable]
743    #[orderable]
744    #[debug_format = "?{}i"]
745    #[gate_rustc_only]
746    pub struct IntVid {}
747}
748
749#[automatically_derived]impl ::core::marker::Copy for FloatVid { }
impl FloatVid {
    #[doc = r" Maximum value the index can take, as a `u32`."]
    pub const MAX_AS_U32: u32 = 0xFFFF_FF00;
    #[doc = r" Maximum value the index can take."]
    pub const MAX: Self = Self::from_u32(0xFFFF_FF00);
    #[doc = r" Zero value of the index."]
    pub const ZERO: Self = Self::from_u32(0);
    #[doc = r" Creates a new index from a given `usize`."]
    #[doc = r""]
    #[doc = r" # Panics"]
    #[doc = r""]
    #[doc = r" Will panic if `value` exceeds `MAX`."]
    #[inline]
    pub const fn from_usize(value: usize) -> Self {
        if !(value <= (0xFFFF_FF00 as usize)) {
            ::core::panicking::panic("assertion failed: value <= (0xFFFF_FF00 as usize)")
        };
        unsafe { Self::from_u32_unchecked(value as u32) }
    }
    #[doc = r" Creates a new index from a given `u32`."]
    #[doc = r""]
    #[doc = r" # Panics"]
    #[doc = r""]
    #[doc = r" Will panic if `value` exceeds `MAX`."]
    #[inline]
    pub const fn from_u32(value: u32) -> Self {
        if !(value <= 0xFFFF_FF00) {
            ::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
        };
        unsafe { Self::from_u32_unchecked(value) }
    }
    #[doc = r" Creates a new index from a given `u16`."]
    #[doc = r""]
    #[doc = r" # Panics"]
    #[doc = r""]
    #[doc = r" Will panic if `value` exceeds `MAX`."]
    #[inline]
    pub const fn from_u16(value: u16) -> Self {
        let value = value as u32;
        if !(value <= 0xFFFF_FF00) {
            ::core::panicking::panic("assertion failed: value <= 0xFFFF_FF00")
        };
        unsafe { Self::from_u32_unchecked(value) }
    }
    #[doc = r" Creates a new index from a given `u32`."]
    #[doc = r""]
    #[doc = r" # Safety"]
    #[doc = r""]
    #[doc =
    r" The provided value must be less than or equal to the maximum value for the newtype."]
    #[doc =
    r" Providing a value outside this range is undefined due to layout restrictions."]
    #[doc = r""]
    #[doc = r" Prefer using `from_u32`."]
    #[inline]
    pub const unsafe fn from_u32_unchecked(value: u32) -> Self {
        Self {
            private_use_as_methods_instead: unsafe {
                std::mem::transmute(value)
            },
        }
    }
    #[doc = r" Extracts the value of this index as a `usize`."]
    #[inline]
    pub const fn index(self) -> usize { self.as_usize() }
    #[doc = r" Extracts the value of this index as a `u32`."]
    #[inline]
    pub const fn as_u32(self) -> u32 {
        unsafe { std::mem::transmute(self.private_use_as_methods_instead) }
    }
    #[doc = r" Extracts the value of this index as a `usize`."]
    #[inline]
    pub const fn as_usize(self) -> usize { self.as_u32() as usize }
}
impl std::ops::Add<usize> for FloatVid {
    type Output = Self;
    #[inline]
    fn add(self, other: usize) -> Self {
        Self::from_usize(self.index() + other)
    }
}
impl std::ops::AddAssign<usize> for FloatVid {
    #[inline]
    fn add_assign(&mut self, other: usize) { *self = *self + other; }
}
impl rustc_index::Idx for FloatVid {
    #[inline]
    fn new(value: usize) -> Self { Self::from_usize(value) }
    #[inline]
    fn index(self) -> usize { self.as_usize() }
}
impl ::std::iter::Step for FloatVid {
    #[inline]
    fn steps_between(start: &Self, end: &Self) -> (usize, Option<usize>) {
        <usize as
                ::std::iter::Step>::steps_between(&Self::index(*start),
            &Self::index(*end))
    }
    #[inline]
    fn forward_checked(start: Self, u: usize) -> Option<Self> {
        Self::index(start).checked_add(u).map(Self::from_usize)
    }
    #[inline]
    fn backward_checked(start: Self, u: usize) -> Option<Self> {
        Self::index(start).checked_sub(u).map(Self::from_usize)
    }
    #[inline]
    fn forward_overflowing(start: Self, u: usize) -> (Self, bool) {
        let (s, o) = Self::index(start).overflowing_add(u);
        (Self::from_usize(s), o)
    }
    #[inline]
    fn backward_overflowing(start: Self, u: usize) -> (Self, bool) {
        let (s, o) = Self::index(start).overflowing_sub(u);
        (Self::from_usize(s), o)
    }
}
impl ::std::cmp::Ord for FloatVid {
    #[inline]
    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
        self.as_u32().cmp(&other.as_u32())
    }
}
impl ::std::cmp::PartialOrd for FloatVid {
    #[inline]
    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
        Some(self.cmp(other))
    }
}
impl From<FloatVid> for u32 {
    #[inline]
    fn from(v: FloatVid) -> u32 { v.as_u32() }
}
impl From<FloatVid> for usize {
    #[inline]
    fn from(v: FloatVid) -> usize { v.as_usize() }
}
impl From<usize> for FloatVid {
    #[inline]
    fn from(value: usize) -> Self { Self::from_usize(value) }
}
impl From<u32> for FloatVid {
    #[inline]
    fn from(value: u32) -> Self { Self::from_u32(value) }
}
impl ::std::cmp::Eq for FloatVid {}
impl ::std::cmp::PartialEq for FloatVid {
    fn eq(&self, other: &Self) -> bool { self.as_u32().eq(&other.as_u32()) }
}
impl ::std::marker::StructuralPartialEq for FloatVid { }
impl ::std::hash::Hash for FloatVid {
    fn hash<H: ::std::hash::Hasher>(&self, state: &mut H) {
        self.as_u32().hash(state)
    }
}
impl<D: ::rustc_serialize::Decoder> ::rustc_serialize::Decodable<D> for
    FloatVid {
    fn decode(d: &mut D) -> Self { Self::from_u32(d.read_u32()) }
}
impl<E: ::rustc_serialize::Encoder> ::rustc_serialize::Encodable<E> for
    FloatVid {
    fn encode(&self, e: &mut E) { e.emit_u32(self.as_u32()); }
}
impl ::std::fmt::Debug for FloatVid {
    fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        fmt.write_fmt(format_args!("?{0}f", self.as_u32()))
    }
}rustc_index::newtype_index! {
750    /// A **float**ing-point (`f32` or `f64`) type **v**ariable **ID**.
751    #[encodable]
752    #[orderable]
753    #[debug_format = "?{}f"]
754    #[gate_rustc_only]
755    pub struct FloatVid {}
756}
757
758/// A placeholder for a type that hasn't been inferred yet.
759///
760/// E.g., if we have an empty array (`[]`), then we create a fresh
761/// type variable for the element type since we won't know until it's
762/// used what the element type is supposed to be.
763#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
    for InferTy {
}
#[automatically_derived]impl ::core::clone::Clone for InferTy {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<TyVid>;
        let _: ::core::clone::AssertParamIsClone<IntVid>;
        let _: ::core::clone::AssertParamIsClone<FloatVid>;
        let _: ::core::clone::AssertParamIsClone<u32>;
        *self
    }
}Clone, #[automatically_derived]impl ::core::marker::Copy for InferTy { }Copy, #[automatically_derived]impl ::core::marker::StructuralPartialEq for InferTy {
}
#[automatically_derived]impl ::core::cmp::PartialEq for InferTy {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::TyVar(__self_0), Self::TyVar(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::IntVar(__self_0), Self::IntVar(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::FloatVar(__self_0), Self::FloatVar(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::FreshTy(__self_0), Self::FreshTy(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::FreshIntTy(__self_0), Self::FreshIntTy(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::FreshFloatTy(__self_0), Self::FreshFloatTy(__arg1_0))
                    => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for InferTy {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TyVid>;
        let _: ::core::cmp::AssertParamIsEq<IntVid>;
        let _: ::core::cmp::AssertParamIsEq<FloatVid>;
        let _: ::core::cmp::AssertParamIsEq<u32>;
    }
}Eq, #[automatically_derived]impl ::core::cmp::PartialOrd for InferTy {
    #[inline]
    fn partial_cmp(&self, other: &Self)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]impl ::core::cmp::Ord for InferTy {
    #[inline]
    fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
        match (self, other) {
            (Self::TyVar(__self_0), Self::TyVar(__arg1_0)) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            (Self::IntVar(__self_0), Self::IntVar(__arg1_0)) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            (Self::FloatVar(__self_0), Self::FloatVar(__arg1_0)) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            (Self::FreshTy(__self_0), Self::FreshTy(__arg1_0)) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            (Self::FreshIntTy(__self_0), Self::FreshIntTy(__arg1_0)) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            (Self::FreshFloatTy(__self_0), Self::FreshFloatTy(__arg1_0)) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            _ =>
                ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
                    &::core::intrinsics::discriminant_value(other)),
        }
    }
}Ord, #[automatically_derived]impl ::core::hash::Hash for InferTy {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::TyVar(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::IntVar(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::FloatVar(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::FreshTy(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::FreshIntTy(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::FreshFloatTy(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
        }
    }
}Hash)]
764#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<__E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for InferTy {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        InferTy::TyVar(ref __binding_0) => { 0usize }
                        InferTy::IntVar(ref __binding_0) => { 1usize }
                        InferTy::FloatVar(ref __binding_0) => { 2usize }
                        InferTy::FreshTy(ref __binding_0) => { 3usize }
                        InferTy::FreshIntTy(ref __binding_0) => { 4usize }
                        InferTy::FreshFloatTy(ref __binding_0) => { 5usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    InferTy::TyVar(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InferTy::IntVar(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InferTy::FloatVar(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InferTy::FreshTy(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InferTy::FreshIntTy(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InferTy::FreshFloatTy(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<__D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for InferTy {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        InferTy::TyVar(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        InferTy::IntVar(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        InferTy::FloatVar(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        InferTy::FreshTy(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        InferTy::FreshIntTy(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        InferTy::FreshFloatTy(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InferTy`, expected 0..6, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext))]
765pub enum InferTy {
766    /// A type variable.
767    TyVar(TyVid),
768    /// An integral type variable (`{integer}`).
769    ///
770    /// These are created when the compiler sees an integer literal like
771    /// `1` that could be several different types (`u8`, `i32`, `u32`, etc.).
772    /// We don't know until it's used what type it's supposed to be, so
773    /// we create a fresh type variable.
774    IntVar(IntVid),
775    /// A floating-point type variable (`{float}`).
776    ///
777    /// These are created when the compiler sees an float literal like
778    /// `1.0` that could be either an `f32` or an `f64`.
779    /// We don't know until it's used what type it's supposed to be, so
780    /// we create a fresh type variable.
781    FloatVar(FloatVid),
782
783    /// A [`FreshTy`][Self::FreshTy] is one that is generated as a replacement
784    /// for an unbound type variable.
785    ///
786    /// This is convenient for caching etc. See `TypeFreshener` for more details.
787    ///
788    /// Compare with [`TyVar`][Self::TyVar].
789    FreshTy(u32),
790    /// Like [`FreshTy`][Self::FreshTy], but as a replacement for [`IntVar`][Self::IntVar].
791    FreshIntTy(u32),
792    /// Like [`FreshTy`][Self::FreshTy], but as a replacement for [`FloatVar`][Self::FloatVar].
793    FreshFloatTy(u32),
794}
795
796impl UnifyValue for IntVarValue {
797    type Error = NoError;
798
799    fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
800        match (*value1, *value2) {
801            (IntVarValue::Unknown, IntVarValue::Unknown) => Ok(IntVarValue::Unknown),
802            (
803                IntVarValue::Unknown,
804                known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
805            )
806            | (
807                known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
808                IntVarValue::Unknown,
809            ) => Ok(known),
810            _ => {
    ::core::panicking::panic_fmt(format_args!("differing ints should have been resolved first"));
}panic!("differing ints should have been resolved first"),
811        }
812    }
813}
814
815impl UnifyKey for IntVid {
816    type Value = IntVarValue;
817    #[inline] // make this function eligible for inlining - it is quite hot.
818    fn index(&self) -> u32 {
819        self.as_u32()
820    }
821    #[inline]
822    fn from_index(i: u32) -> IntVid {
823        IntVid::from_u32(i)
824    }
825    fn tag() -> &'static str {
826        "IntVid"
827    }
828}
829
830impl UnifyValue for FloatVarValue {
831    type Error = NoError;
832
833    fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
834        match (*value1, *value2) {
835            (FloatVarValue::Unknown, FloatVarValue::Unknown) => Ok(FloatVarValue::Unknown),
836            (FloatVarValue::Unknown, FloatVarValue::Known(known))
837            | (FloatVarValue::Known(known), FloatVarValue::Unknown) => {
838                Ok(FloatVarValue::Known(known))
839            }
840            (FloatVarValue::Known(_), FloatVarValue::Known(_)) => {
841                {
    ::core::panicking::panic_fmt(format_args!("differing floats should have been resolved first"));
}panic!("differing floats should have been resolved first")
842            }
843        }
844    }
845}
846
847impl UnifyKey for FloatVid {
848    type Value = FloatVarValue;
849    #[inline]
850    fn index(&self) -> u32 {
851        self.as_u32()
852    }
853    #[inline]
854    fn from_index(i: u32) -> FloatVid {
855        FloatVid::from_u32(i)
856    }
857    fn tag() -> &'static str {
858        "FloatVid"
859    }
860}
861
862#[cfg(feature = "nightly")]
863impl StableHash for InferTy {
864    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
865        use InferTy::*;
866
867        #[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Tag {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    Tag::FreshTy => 0u8.stable_hash(__hcx, __hasher),
                    Tag::FreshIntTy => 1u8.stable_hash(__hcx, __hasher),
                    Tag::FreshFloatTy => 2u8.stable_hash(__hcx, __hasher),
                }
                match *self {
                    Tag::FreshTy => {}
                    Tag::FreshIntTy => {}
                    Tag::FreshFloatTy => {}
                }
            }
        }
    };StableHash)]
868        enum Tag {
869            FreshTy,
870            FreshIntTy,
871            FreshFloatTy,
872        }
873
874        match self {
875            TyVar(_) | IntVar(_) | FloatVar(_) => {
876                {
    ::core::panicking::panic_fmt(format_args!("type variables should not be hashed: {0:?}",
            self));
}panic!("type variables should not be hashed: {self:?}")
877            }
878
879            FreshTy(v) => {
880                Tag::FreshTy.stable_hash(hcx, hasher);
881                v.stable_hash(hcx, hasher);
882            }
883            FreshIntTy(v) => {
884                Tag::FreshIntTy.stable_hash(hcx, hasher);
885                v.stable_hash(hcx, hasher);
886            }
887            FreshFloatTy(v) => {
888                Tag::FreshFloatTy.stable_hash(hcx, hasher);
889                v.stable_hash(hcx, hasher);
890            }
891        }
892    }
893}
894
895impl fmt::Display for InferTy {
896    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
897        use InferTy::*;
898        match *self {
899            TyVar(_) => f.write_fmt(format_args!("_"))write!(f, "_"),
900            IntVar(_) => f.write_fmt(format_args!("{0}", "{integer}"))write!(f, "{}", "{integer}"),
901            FloatVar(_) => f.write_fmt(format_args!("{0}", "{float}"))write!(f, "{}", "{float}"),
902            FreshTy(v) => f.write_fmt(format_args!("FreshTy({0})", v))write!(f, "FreshTy({v})"),
903            FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0})", v))write!(f, "FreshIntTy({v})"),
904            FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0})", v))write!(f, "FreshFloatTy({v})"),
905        }
906    }
907}
908
909impl fmt::Debug for InferTy {
910    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
911        use InferTy::*;
912        match *self {
913            TyVar(ref v) => v.fmt(f),
914            IntVar(ref v) => v.fmt(f),
915            FloatVar(ref v) => v.fmt(f),
916            FreshTy(v) => f.write_fmt(format_args!("FreshTy({0:?})", v))write!(f, "FreshTy({v:?})"),
917            FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0:?})", v))write!(f, "FreshIntTy({v:?})"),
918            FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0:?})", v))write!(f, "FreshFloatTy({v:?})"),
919        }
920    }
921}
922
923#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for TypeAndMut<I> where I: Interner {
    #[inline]
    fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for TypeAndMut<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for TypeAndMut<I> where I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (TypeAndMut { ty: ref __field_ty, mutbl: ref __field_mutbl },
                TypeAndMut {
                ty: ref __other_field_ty, mutbl: ref __other_field_mutbl }) =>
                true &&
                        ::core::cmp::PartialEq::eq(__field_ty, __other_field_ty) &&
                    ::core::cmp::PartialEq::eq(__field_mutbl,
                        __other_field_mutbl),
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for TypeAndMut<I> where I: Interner {
    fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
        match self {
            TypeAndMut { ty: ref __field_ty, mutbl: ref __field_mutbl } => {
                ::core::hash::Hash::hash(__field_ty, __state);
                ::core::hash::Hash::hash(__field_mutbl, __state);
            }
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for TypeAndMut<I> where I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            TypeAndMut { ty: ref __field_ty, mutbl: ref __field_mutbl } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "TypeAndMut");
                ::core::fmt::DebugStruct::field(&mut __builder, "ty",
                    __field_ty);
                ::core::fmt::DebugStruct::field(&mut __builder, "mutbl",
                    __field_mutbl);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, PartialEq, Hash, Debug; I: Interner)]
924#[cfg_attr(
925    feature = "nightly",
926    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for TypeAndMut<I> where
            I::Ty: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for TypeAndMut<I> where
            I::Ty: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                TypeAndMut {
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    mutbl: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            TypeAndMut<I> where
            I::Ty: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1 }
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
927)]
928#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for TypeAndMut<I>
            where I: Interner, I::Ty: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1 }
                        => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        unsafe impl<I: Interner, __V>
            ::rustc_type_ir::GenericTypeVisitable<__V> for TypeAndMut<I> where
            I::Ty: ::rustc_type_ir::GenericTypeVisitable<__V>,
            Mutability: ::rustc_type_ir::GenericTypeVisitable<__V> {
            fn generic_visit_with(&self, __visitor: &mut __V) {
                match *self {
                    TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1 }
                        => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                }
            }
        }
    };GenericTypeVisitable, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for TypeAndMut<I>
            where I: Interner, I::Ty: ::rustc_type_ir::TypeFoldable<I> {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        TypeAndMut { ty: __binding_0, mutbl: __binding_1 } => {
                            TypeAndMut {
                                ty: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                mutbl: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    TypeAndMut { ty: __binding_0, mutbl: __binding_1 } => {
                        TypeAndMut {
                            ty: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            mutbl: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic)]
929pub struct TypeAndMut<I: Interner> {
930    pub ty: I::Ty,
931    pub mutbl: Mutability,
932}
933
934impl<I: Interner> Eq for TypeAndMut<I> {}
935
936/// Error type for splatted argument index errors.
937#[derive(#[automatically_derived]impl ::core::fmt::Debug for SplattedArgIndexError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::InvalidIndex { splatted_arg_index: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "InvalidIndex splatted_arg_index", &__self_0),
            Self::OutOfBounds {
                splatted_arg_index: __self_0, args_len: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "OutOfBounds splatted_arg_index args_len", __self_0,
                    &__self_1),
        }
    }
}Debug, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
    for SplattedArgIndexError {
}
#[automatically_derived]impl ::core::clone::Clone for SplattedArgIndexError {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<u8>;
        let _: ::core::clone::AssertParamIsClone<u16>;
        *self
    }
}Clone, #[automatically_derived]impl ::core::marker::Copy for SplattedArgIndexError {
}Copy, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
    SplattedArgIndexError {
}
#[automatically_derived]impl ::core::cmp::PartialEq for SplattedArgIndexError
    {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::InvalidIndex { splatted_arg_index: __self_0 },
                    Self::InvalidIndex { splatted_arg_index: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                (Self::OutOfBounds {
                    splatted_arg_index: __self_0, args_len: __self_1 },
                    Self::OutOfBounds {
                    splatted_arg_index: __arg1_0, args_len: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for SplattedArgIndexError {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u8>;
        let _: ::core::cmp::AssertParamIsEq<u16>;
    }
}Eq)]
938pub enum SplattedArgIndexError {
939    /// The splatted argument index is invalid.
940    /// A `u8::MAX` argument index used to indicate that no argument is splatted.
941    /// Higher values are also not supported, for performance reasons.
942    InvalidIndex { splatted_arg_index: u8 },
943
944    /// The splatted argument index is outside the bounds of the function arguments.
945    OutOfBounds { splatted_arg_index: u8, args_len: u16 },
946}
947
948/// Contains the packed non-type fields of a function signature.
949#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for FnSigKind<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for FnSigKind<I> where I: Interner {
    #[inline]
    fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for FnSigKind<I> where I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (FnSigKind {
                flags: ref __field_flags,
                splatted: ref __field_splatted,
                _marker: ref __field__marker }, FnSigKind {
                flags: ref __other_field_flags,
                splatted: ref __other_field_splatted,
                _marker: ref __other_field__marker }) =>
                true &&
                            ::core::cmp::PartialEq::eq(__field_flags,
                                __other_field_flags) &&
                        ::core::cmp::PartialEq::eq(__field_splatted,
                            __other_field_splatted) &&
                    ::core::cmp::PartialEq::eq(__field__marker,
                        __other_field__marker),
        }
    }
}
const _: () =
    {
        trait DeriveWhereAssertEq {
            fn assert(&self);
        }
        impl<I: Interner> DeriveWhereAssertEq for FnSigKind<I> where
            I: Interner {
            fn assert(&self) {
                struct __AssertEq<__T: ::core::cmp::Eq +
                    ?::core::marker::Sized>(::core::marker::PhantomData<__T>);
                let _: __AssertEq<u8>;
                let _: __AssertEq<u8>;
                let _: __AssertEq<PhantomData<fn() -> I>>;
            }
        }
    };
#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for FnSigKind<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for FnSigKind<I> where I: Interner {
    fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
        match self {
            FnSigKind {
                flags: ref __field_flags,
                splatted: ref __field_splatted,
                _marker: ref __field__marker } => {
                ::core::hash::Hash::hash(__field_flags, __state);
                ::core::hash::Hash::hash(__field_splatted, __state);
                ::core::hash::Hash::hash(__field__marker, __state);
            }
        }
    }
}#[derive_where(Copy, Clone, PartialEq, Eq, Hash; I: Interner)]
950#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for FnSigKind<I>
            where I: Interner {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self { FnSigKind { .. } => {} }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for FnSigKind<I>
            where I: Interner {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        FnSigKind {
                            flags: __binding_0,
                            splatted: __binding_1,
                            _marker: __binding_2 } => {
                            FnSigKind {
                                flags: __binding_0,
                                splatted: __binding_1,
                                _marker: __binding_2,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    FnSigKind {
                        flags: __binding_0,
                        splatted: __binding_1,
                        _marker: __binding_2 } => {
                        FnSigKind {
                            flags: __binding_0,
                            splatted: __binding_1,
                            _marker: __binding_2,
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnSigKind<I>
            where J: Interner, I: ::rustc_type_ir::LiftInto<J> {
            type Lifted = FnSigKind<J>;
            fn lift_to_interner(self, interner: J) -> Self::Lifted {
                match self {
                    FnSigKind {
                        flags: __binding_0,
                        splatted: __binding_1,
                        _marker: __binding_2 } => {
                        FnSigKind {
                            flags: __binding_0,
                            splatted: __binding_1,
                            _marker: PhantomData,
                        }
                    }
                }
            }
        }
    };Lift_Generic)]
951#[cfg_attr(
952    feature = "nightly",
953    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for FnSigKind<I> where
            PhantomData<fn() -> I>: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let FnSigKind {
                        flags: ref __binding_0,
                        splatted: ref __binding_1,
                        _marker: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for FnSigKind<I> where
            PhantomData<fn() -> I>: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                FnSigKind {
                    flags: ::rustc_serialize::Decodable::decode(__decoder),
                    splatted: ::rustc_serialize::Decodable::decode(__decoder),
                    _marker: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            FnSigKind<I> where
            PhantomData<fn()
                -> I>: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    FnSigKind {
                        flags: ref __binding_0,
                        splatted: ref __binding_1,
                        _marker: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
954)]
955pub struct FnSigKind<I: Interner> {
956    /// Holds the c_variadic and safety bitflags, and 6 bits for the `ExternAbi` variant and unwind
957    /// flag.
958    #[lift(identity)]
959    #[type_visitable(ignore)]
960    #[type_foldable(identity)]
961    flags: u8,
962
963    /// Which function argument is splatted into multiple arguments in callers, if any?
964    /// Splatting functions with `>= u8::MAX` arguments is not supported, for performance reasons.
965    /// (And spending an extra byte on an edge case is not worth the perf.)
966    #[lift(identity)]
967    #[type_visitable(ignore)]
968    #[type_foldable(identity)]
969    splatted: u8,
970
971    #[type_visitable(ignore)]
972    #[type_foldable(identity)]
973    _marker: PhantomData<fn() -> I>,
974}
975
976impl<I: Interner> fmt::Debug for FnSigKind<I> {
977    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
978        let mut f = f.debug_tuple("FnSigKind");
979
980        if self.is_safe() {
981            f.field(&"Safe");
982        } else {
983            f.field(&"Unsafe");
984        }
985
986        f.field(&self.abi());
987
988        if self.c_variadic() {
989            f.field(&"CVariadic");
990        }
991
992        if let Some(index) = self.splatted() {
993            f.field(&::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("Splatted({0})", index))
    })format!("Splatted({})", index));
994        }
995
996        f.finish()
997    }
998}
999
1000impl<I: Interner> Default for FnSigKind<I> {
1001    /// Create a new FnSigKind with the "Rust" ABI, "Unsafe" safety, and no C-style variadic or splatted arguments.
1002    /// To modify these flags, use the `set_*` methods, for readability.
1003    fn default() -> Self {
1004        Self { flags: 0, splatted: 0, _marker: PhantomData }
1005            .set_abi(ExternAbi::Rust)
1006            .set_safety(I::Safety::unsafe_mode())
1007            .set_c_variadic(false)
1008            .set_no_splatted_args()
1009    }
1010}
1011
1012impl<I: Interner> FnSigKind<I> {
1013    /// Mask for the `ExternAbi` variant, including the unwind flag.
1014    const EXTERN_ABI_MASK: u8 = 0b111111;
1015
1016    /// Bitflag for `Safety::Safe`. The default is `Unsafe`.
1017    const SAFE_FLAG: u8 = 1 << 6;
1018
1019    /// Bitflag for a trailing C-style variadic argument.
1020    const C_VARIADIC_FLAG: u8 = 1 << 7;
1021
1022    /// The marker index for "no splatted arguments". Higher values are also not supported, for
1023    /// performance reasons.
1024    ///
1025    /// Must have the same value as `FnDeclFlags::NO_SPLATTED_ARG_INDEX` and
1026    /// `rustc_ast::FnDecl::NO_SPLATTED_ARG_INDEX`.
1027    ///
1028    /// This is an implementation detail, which should only be used in low-level encoding.
1029    pub const NO_SPLATTED_ARG_INDEX: u8 = u8::MAX;
1030
1031    /// Create a new FnSigKind with the given ABI, safety, C-style variadic, and splatted argument
1032    /// index.
1033    pub fn new(
1034        abi: ExternAbi,
1035        safety: I::Safety,
1036        c_variadic: bool,
1037        splatted: Option<u8>,
1038        args_len: usize,
1039    ) -> Result<Self, SplattedArgIndexError> {
1040        Self::default()
1041            .set_abi(abi)
1042            .set_safety(safety)
1043            .set_c_variadic(c_variadic)
1044            .set_splatted(splatted, args_len)
1045    }
1046
1047    /// Create a new safe FnSigKind with the `extern "Rust"` ABI, that isn't C-style variadic or splatted.
1048    pub fn dummy() -> Self {
1049        Self::default().set_safety(I::Safety::safe())
1050    }
1051
1052    /// Set the ABI, including the unwind flag.
1053    #[must_use = "this method does not modify the receiver"]
1054    pub fn set_abi(mut self, abi: ExternAbi) -> Self {
1055        let abi_index = abi.as_packed();
1056        if !(abi_index <= Self::EXTERN_ABI_MASK) {
    ::core::panicking::panic("assertion failed: abi_index <= Self::EXTERN_ABI_MASK")
};assert!(abi_index <= Self::EXTERN_ABI_MASK);
1057
1058        self.flags &= !Self::EXTERN_ABI_MASK;
1059        self.flags |= abi_index;
1060
1061        self
1062    }
1063
1064    /// Set the safety flag, `true` is `Safe`.
1065    #[must_use = "this method does not modify the receiver"]
1066    pub fn set_safety(mut self, safety: I::Safety) -> Self {
1067        if safety.is_safe() {
1068            self.flags |= Self::SAFE_FLAG;
1069        } else {
1070            self.flags &= !Self::SAFE_FLAG;
1071        }
1072
1073        self
1074    }
1075
1076    /// Set the C-style variadic argument flag.
1077    #[must_use = "this method does not modify the receiver"]
1078    pub fn set_c_variadic(mut self, c_variadic: bool) -> Self {
1079        if c_variadic {
1080            self.flags |= Self::C_VARIADIC_FLAG;
1081        } else {
1082            self.flags &= !Self::C_VARIADIC_FLAG;
1083        }
1084
1085        self
1086    }
1087
1088    /// Set the splatted argument index.
1089    /// The number of function arguments is used for error checking.
1090    #[must_use = "this method does not modify the receiver"]
1091    pub fn set_splatted(
1092        mut self,
1093        splatted: Option<u8>,
1094        args_len: usize,
1095    ) -> Result<Self, SplattedArgIndexError> {
1096        if let Some(splatted_arg_index) = splatted {
1097            if splatted_arg_index == Self::NO_SPLATTED_ARG_INDEX {
1098                // This index value is used as a marker for "no splatting", so it is unsupported.
1099                // Higher values are also not supported, for performance reasons.
1100                return Err(SplattedArgIndexError::InvalidIndex { splatted_arg_index });
1101            } else if usize::from(splatted_arg_index) >= args_len {
1102                return Err(SplattedArgIndexError::OutOfBounds {
1103                    splatted_arg_index,
1104                    args_len: args_len as u16,
1105                });
1106            }
1107
1108            self.splatted = splatted_arg_index;
1109        } else {
1110            self.splatted = Self::NO_SPLATTED_ARG_INDEX;
1111        }
1112
1113        Ok(self)
1114    }
1115
1116    /// Set the splatted argument index to "no splatted arguments".
1117    #[must_use = "this method does not modify the receiver"]
1118    pub fn set_no_splatted_args(mut self) -> Self {
1119        self.splatted = Self::NO_SPLATTED_ARG_INDEX;
1120        self
1121    }
1122
1123    /// Get the ABI, including the unwind flag.
1124    pub fn abi(self) -> ExternAbi {
1125        let abi_index = self.flags & Self::EXTERN_ABI_MASK;
1126        ExternAbi::from_packed(abi_index)
1127    }
1128
1129    /// Get the safety flag.
1130    pub fn is_safe(self) -> bool {
1131        self.flags & Self::SAFE_FLAG != 0
1132    }
1133
1134    /// Returns the safety mode.
1135    pub fn safety(self) -> I::Safety {
1136        if self.is_safe() { I::Safety::safe() } else { I::Safety::unsafe_mode() }
1137    }
1138
1139    /// Do the function arguments end with a C-style variadic argument?
1140    pub fn c_variadic(self) -> bool {
1141        self.flags & Self::C_VARIADIC_FLAG != 0
1142    }
1143
1144    /// Get the index of the splatted argument, if any.
1145    pub fn splatted(self) -> Option<u8> {
1146        if self.splatted == Self::NO_SPLATTED_ARG_INDEX { None } else { Some(self.splatted) }
1147    }
1148}
1149
1150#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for FnSig<I> where I: Interner {
    #[inline]
    fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for FnSig<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for FnSig<I> where I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (FnSig {
                inputs_and_output: ref __field_inputs_and_output,
                fn_sig_kind: ref __field_fn_sig_kind }, FnSig {
                inputs_and_output: ref __other_field_inputs_and_output,
                fn_sig_kind: ref __other_field_fn_sig_kind }) =>
                true &&
                        ::core::cmp::PartialEq::eq(__field_inputs_and_output,
                            __other_field_inputs_and_output) &&
                    ::core::cmp::PartialEq::eq(__field_fn_sig_kind,
                        __other_field_fn_sig_kind),
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for FnSig<I> where I: Interner {
    fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
        match self {
            FnSig {
                inputs_and_output: ref __field_inputs_and_output,
                fn_sig_kind: ref __field_fn_sig_kind } => {
                ::core::hash::Hash::hash(__field_inputs_and_output, __state);
                ::core::hash::Hash::hash(__field_fn_sig_kind, __state);
            }
        }
    }
}#[derive_where(Clone, Copy, PartialEq, Hash; I: Interner)]
1151#[cfg_attr(
1152    feature = "nightly",
1153    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for FnSig<I> where
            I::Tys: ::rustc_serialize::Encodable<__E>,
            FnSigKind<I>: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let FnSig {
                        inputs_and_output: ref __binding_0,
                        fn_sig_kind: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for FnSig<I> where
            I::Tys: ::rustc_serialize::Decodable<__D>,
            FnSigKind<I>: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                FnSig {
                    inputs_and_output: ::rustc_serialize::Decodable::decode(__decoder),
                    fn_sig_kind: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            FnSig<I> where
            I::Tys: ::rustc_data_structures::stable_hash::StableHash,
            FnSigKind<I>: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    FnSig {
                        inputs_and_output: ref __binding_0,
                        fn_sig_kind: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
1154)]
1155#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for FnSig<I> where
            I: Interner, I::Tys: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnSig { inputs_and_output: ref __binding_0, .. } => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        unsafe impl<I: Interner, __V>
            ::rustc_type_ir::GenericTypeVisitable<__V> for FnSig<I> where
            I::Tys: ::rustc_type_ir::GenericTypeVisitable<__V>,
            FnSigKind<I>: ::rustc_type_ir::GenericTypeVisitable<__V> {
            fn generic_visit_with(&self, __visitor: &mut __V) {
                match *self {
                    FnSig {
                        inputs_and_output: ref __binding_0,
                        fn_sig_kind: ref __binding_1 } => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                }
            }
        }
    };GenericTypeVisitable, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for FnSig<I> where
            I: Interner, I::Tys: ::rustc_type_ir::TypeFoldable<I> {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        FnSig {
                            inputs_and_output: __binding_0, fn_sig_kind: __binding_1 }
                            => {
                            FnSig {
                                inputs_and_output: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                fn_sig_kind: __binding_1,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    FnSig {
                        inputs_and_output: __binding_0, fn_sig_kind: __binding_1 }
                        => {
                        FnSig {
                            inputs_and_output: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            fn_sig_kind: __binding_1,
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnSig<I> where
            J: Interner, I: ::rustc_type_ir::LiftInto<J> {
            type Lifted = FnSig<J>;
            fn lift_to_interner(self, interner: J) -> Self::Lifted {
                match self {
                    FnSig {
                        inputs_and_output: __binding_0, fn_sig_kind: __binding_1 }
                        => {
                        FnSig {
                            inputs_and_output: __binding_0.lift_to_interner(interner),
                            fn_sig_kind: __binding_1.lift_to_interner(interner),
                        }
                    }
                }
            }
        }
    };Lift_Generic)]
1156pub struct FnSig<I: Interner> {
1157    pub inputs_and_output: I::Tys,
1158    #[type_visitable(ignore)]
1159    #[type_foldable(identity)]
1160    pub fn_sig_kind: FnSigKind<I>,
1161}
1162
1163impl<I: Interner> Eq for FnSig<I> {}
1164
1165impl<I: Interner> FnSig<I> {
1166    pub fn inputs(self) -> I::FnInputTys {
1167        self.inputs_and_output.inputs()
1168    }
1169
1170    pub fn output(self) -> I::Ty {
1171        self.inputs_and_output.output()
1172    }
1173
1174    pub fn is_fn_trait_compatible(self) -> bool {
1175        !self.c_variadic() && self.safety().is_safe() && self.abi().is_fn_trait_compatible()
1176    }
1177
1178    /// Set the safety flag.
1179    #[must_use = "this method does not modify the receiver"]
1180    pub fn set_safety(self, safety: I::Safety) -> Self {
1181        Self { fn_sig_kind: self.fn_sig_kind.set_safety(safety), ..self }
1182    }
1183
1184    /// Set the splatted argument index.
1185    /// The number of function arguments is used for error checking.
1186    #[must_use = "this method does not modify the receiver"]
1187    pub fn set_splatted(
1188        self,
1189        splatted: Option<u8>,
1190        args_len: usize,
1191    ) -> Result<Self, SplattedArgIndexError> {
1192        Ok(Self { fn_sig_kind: self.fn_sig_kind.set_splatted(splatted, args_len)?, ..self })
1193    }
1194
1195    pub fn safety(self) -> I::Safety {
1196        self.fn_sig_kind.safety()
1197    }
1198
1199    pub fn abi(self) -> ExternAbi {
1200        self.fn_sig_kind.abi()
1201    }
1202
1203    pub fn c_variadic(self) -> bool {
1204        self.fn_sig_kind.c_variadic()
1205    }
1206
1207    pub fn splatted(self) -> Option<u8> {
1208        self.fn_sig_kind.splatted()
1209    }
1210
1211    /// Create a new safe FnSig with no arguments or return type, using the `extern "Rust"` ABI,
1212    /// that isn't C-style variadic or splatted.
1213    pub fn dummy() -> Self {
1214        Self { inputs_and_output: Default::default(), fn_sig_kind: FnSigKind::dummy() }
1215    }
1216}
1217
1218impl<I: Interner> ty::Binder<I, FnSig<I>> {
1219    #[inline]
1220    pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
1221        self.map_bound(|fn_sig| fn_sig.inputs())
1222    }
1223
1224    #[inline]
1225    #[track_caller]
1226    pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
1227        self.map_bound(|fn_sig| fn_sig.inputs().get(index).unwrap())
1228    }
1229
1230    pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
1231        self.map_bound(|fn_sig| fn_sig.inputs_and_output)
1232    }
1233
1234    #[inline]
1235    pub fn output(self) -> ty::Binder<I, I::Ty> {
1236        self.map_bound(|fn_sig| fn_sig.output())
1237    }
1238
1239    pub fn fn_sig_kind(self) -> FnSigKind<I> {
1240        self.skip_binder().fn_sig_kind
1241    }
1242
1243    pub fn c_variadic(self) -> bool {
1244        self.skip_binder().c_variadic()
1245    }
1246
1247    pub fn splatted(self) -> Option<u8> {
1248        self.skip_binder().splatted()
1249    }
1250
1251    pub fn safety(self) -> I::Safety {
1252        self.skip_binder().safety()
1253    }
1254
1255    pub fn abi(self) -> ExternAbi {
1256        self.skip_binder().abi()
1257    }
1258
1259    pub fn is_fn_trait_compatible(&self) -> bool {
1260        self.skip_binder().is_fn_trait_compatible()
1261    }
1262
1263    // Used to split a single value into the two fields in `TyKind::FnPtr`.
1264    pub fn split(self) -> (ty::Binder<I, FnSigTys<I>>, FnHeader<I>) {
1265        let hdr = FnHeader { fn_sig_kind: self.fn_sig_kind() };
1266        (self.map_bound(|sig| FnSigTys { inputs_and_output: sig.inputs_and_output }), hdr)
1267    }
1268}
1269
1270impl<I: Interner> fmt::Debug for FnSig<I> {
1271    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1272        let sig = self;
1273        let FnSig { inputs_and_output: _, fn_sig_kind } = sig;
1274
1275        f.write_fmt(format_args!("{0}", fn_sig_kind.safety().prefix_str()))write!(f, "{}", fn_sig_kind.safety().prefix_str())?;
1276        if fn_sig_kind.abi() != ExternAbi::Rust {
1277            f.write_fmt(format_args!("extern \"{0:?}\" ", fn_sig_kind.abi()))write!(f, "extern \"{:?}\" ", fn_sig_kind.abi())?;
1278        }
1279
1280        f.write_fmt(format_args!("fn("))write!(f, "fn(")?;
1281        let inputs = sig.inputs();
1282        for (i, ty) in inputs.iter().enumerate() {
1283            if i > 0 {
1284                f.write_fmt(format_args!(", "))write!(f, ", ")?;
1285            }
1286            if Some(i) == fn_sig_kind.splatted().map(usize::from) {
1287                f.write_fmt(format_args!("#[rustc_splat] "))write!(f, "#[rustc_splat] ")?;
1288            }
1289            f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
1290        }
1291        if fn_sig_kind.c_variadic() {
1292            if inputs.is_empty() {
1293                f.write_fmt(format_args!("..."))write!(f, "...")?;
1294            } else {
1295                f.write_fmt(format_args!(", ..."))write!(f, ", ...")?;
1296            }
1297        }
1298        f.write_fmt(format_args!(")"))write!(f, ")")?;
1299
1300        let output = sig.output();
1301        match output.kind() {
1302            Tuple(list) if list.is_empty() => Ok(()),
1303            _ => f.write_fmt(format_args!(" -> {0:?}", sig.output()))write!(f, " -> {:?}", sig.output()),
1304        }
1305    }
1306}
1307
1308// FIXME: this is a distinct type because we need to define `Encode`/`Decode`
1309// impls in this crate for `Binder<I, I::Ty>`.
1310#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for UnsafeBinderInner<I> where
    I: Interner {
    #[inline]
    fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for UnsafeBinderInner<I> where
    I: Interner {
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for UnsafeBinderInner<I> where
    I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (UnsafeBinderInner(ref __field_0),
                UnsafeBinderInner(ref __other_field_0)) =>
                true &&
                    ::core::cmp::PartialEq::eq(__field_0, __other_field_0),
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for UnsafeBinderInner<I> where
    I: Interner {
    fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
        match self {
            UnsafeBinderInner(ref __field_0) => {
                ::core::hash::Hash::hash(__field_0, __state);
            }
        }
    }
}#[derive_where(Clone, Copy, PartialEq, Hash; I: Interner)]
1311#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            UnsafeBinderInner<I> where
            ty::Binder<I,
            I::Ty>: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    UnsafeBinderInner(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext))]
1312#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            UnsafeBinderInner<I> where I: Interner,
            ty::Binder<I, I::Ty>: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnsafeBinderInner(ref __binding_0) => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        unsafe impl<I: Interner, __V>
            ::rustc_type_ir::GenericTypeVisitable<__V> for
            UnsafeBinderInner<I> where
            ty::Binder<I, I::Ty>: ::rustc_type_ir::GenericTypeVisitable<__V> {
            fn generic_visit_with(&self, __visitor: &mut __V) {
                match *self {
                    UnsafeBinderInner(ref __binding_0) => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                }
            }
        }
    };GenericTypeVisitable, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
            UnsafeBinderInner<I> where I: Interner,
            ty::Binder<I, I::Ty>: ::rustc_type_ir::TypeFoldable<I> {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        UnsafeBinderInner(__binding_0) => {
                            UnsafeBinderInner(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    UnsafeBinderInner(__binding_0) => {
                        UnsafeBinderInner(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            UnsafeBinderInner<I> where J: Interner,
            I: ::rustc_type_ir::LiftInto<J> {
            type Lifted = UnsafeBinderInner<J>;
            fn lift_to_interner(self, interner: J) -> Self::Lifted {
                match self {
                    UnsafeBinderInner(__binding_0) => {
                        UnsafeBinderInner(__binding_0.lift_to_interner(interner))
                    }
                }
            }
        }
    };Lift_Generic)]
1313pub struct UnsafeBinderInner<I: Interner>(ty::Binder<I, I::Ty>);
1314
1315impl<I: Interner> Eq for UnsafeBinderInner<I> {}
1316
1317impl<I: Interner> From<ty::Binder<I, I::Ty>> for UnsafeBinderInner<I> {
1318    fn from(value: ty::Binder<I, I::Ty>) -> Self {
1319        UnsafeBinderInner(value)
1320    }
1321}
1322
1323impl<I: Interner> From<UnsafeBinderInner<I>> for ty::Binder<I, I::Ty> {
1324    fn from(value: UnsafeBinderInner<I>) -> Self {
1325        value.0
1326    }
1327}
1328
1329impl<I: Interner> fmt::Debug for UnsafeBinderInner<I> {
1330    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1331        self.0.fmt(f)
1332    }
1333}
1334
1335impl<I: Interner> Deref for UnsafeBinderInner<I> {
1336    type Target = ty::Binder<I, I::Ty>;
1337
1338    fn deref(&self) -> &Self::Target {
1339        &self.0
1340    }
1341}
1342
1343// This is just a `FnSig` without the `FnHeader` fields.
1344#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for FnSigTys<I> where I: Interner {
    #[inline]
    fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for FnSigTys<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for FnSigTys<I> where I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            FnSigTys { inputs_and_output: ref __field_inputs_and_output } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "FnSigTys");
                ::core::fmt::DebugStruct::field(&mut __builder,
                    "inputs_and_output", __field_inputs_and_output);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for FnSigTys<I> where I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (FnSigTys { inputs_and_output: ref __field_inputs_and_output },
                FnSigTys {
                inputs_and_output: ref __other_field_inputs_and_output }) =>
                true &&
                    ::core::cmp::PartialEq::eq(__field_inputs_and_output,
                        __other_field_inputs_and_output),
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for FnSigTys<I> where I: Interner {
    fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
        match self {
            FnSigTys { inputs_and_output: ref __field_inputs_and_output } => {
                ::core::hash::Hash::hash(__field_inputs_and_output, __state);
            }
        }
    }
}#[derive_where(Clone, Copy, Debug, PartialEq, Hash; I: Interner)]
1345#[cfg_attr(
1346    feature = "nightly",
1347    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for FnSigTys<I> where
            I::Tys: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let FnSigTys { inputs_and_output: ref __binding_0 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for FnSigTys<I> where
            I::Tys: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                FnSigTys {
                    inputs_and_output: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            FnSigTys<I> where
            I::Tys: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    FnSigTys { inputs_and_output: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
1348)]
1349#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for FnSigTys<I>
            where I: Interner, I::Tys: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnSigTys { inputs_and_output: ref __binding_0 } => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        unsafe impl<I: Interner, __V>
            ::rustc_type_ir::GenericTypeVisitable<__V> for FnSigTys<I> where
            I::Tys: ::rustc_type_ir::GenericTypeVisitable<__V> {
            fn generic_visit_with(&self, __visitor: &mut __V) {
                match *self {
                    FnSigTys { inputs_and_output: ref __binding_0 } => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                }
            }
        }
    };GenericTypeVisitable, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for FnSigTys<I>
            where I: Interner, I::Tys: ::rustc_type_ir::TypeFoldable<I> {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        FnSigTys { inputs_and_output: __binding_0 } => {
                            FnSigTys {
                                inputs_and_output: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    FnSigTys { inputs_and_output: __binding_0 } => {
                        FnSigTys {
                            inputs_and_output: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnSigTys<I>
            where J: Interner, I: ::rustc_type_ir::LiftInto<J> {
            type Lifted = FnSigTys<J>;
            fn lift_to_interner(self, interner: J) -> Self::Lifted {
                match self {
                    FnSigTys { inputs_and_output: __binding_0 } => {
                        FnSigTys {
                            inputs_and_output: __binding_0.lift_to_interner(interner),
                        }
                    }
                }
            }
        }
    };Lift_Generic)]
1350pub struct FnSigTys<I: Interner> {
1351    pub inputs_and_output: I::Tys,
1352}
1353
1354impl<I: Interner> Eq for FnSigTys<I> {}
1355
1356impl<I: Interner> FnSigTys<I> {
1357    pub fn inputs(self) -> I::FnInputTys {
1358        self.inputs_and_output.inputs()
1359    }
1360
1361    pub fn output(self) -> I::Ty {
1362        self.inputs_and_output.output()
1363    }
1364}
1365
1366impl<I: Interner> ty::Binder<I, FnSigTys<I>> {
1367    // Used to combine the two fields in `TyKind::FnPtr` into a single value.
1368    pub fn with(self, hdr: FnHeader<I>) -> ty::Binder<I, FnSig<I>> {
1369        self.map_bound(|sig_tys| FnSig {
1370            inputs_and_output: sig_tys.inputs_and_output,
1371            fn_sig_kind: hdr.fn_sig_kind,
1372        })
1373    }
1374
1375    #[inline]
1376    pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
1377        self.map_bound(|sig_tys| sig_tys.inputs())
1378    }
1379
1380    #[inline]
1381    #[track_caller]
1382    pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
1383        self.map_bound(|sig_tys| sig_tys.inputs().get(index).unwrap())
1384    }
1385
1386    pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
1387        self.map_bound(|sig_tys| sig_tys.inputs_and_output)
1388    }
1389
1390    #[inline]
1391    pub fn output(self) -> ty::Binder<I, I::Ty> {
1392        self.map_bound(|sig_tys| sig_tys.output())
1393    }
1394}
1395
1396#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for FnHeader<I> where I: Interner {
    #[inline]
    fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for FnHeader<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for FnHeader<I> where I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            FnHeader { fn_sig_kind: ref __field_fn_sig_kind } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "FnHeader");
                ::core::fmt::DebugStruct::field(&mut __builder, "fn_sig_kind",
                    __field_fn_sig_kind);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for FnHeader<I> where I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (FnHeader { fn_sig_kind: ref __field_fn_sig_kind }, FnHeader {
                fn_sig_kind: ref __other_field_fn_sig_kind }) =>
                true &&
                    ::core::cmp::PartialEq::eq(__field_fn_sig_kind,
                        __other_field_fn_sig_kind),
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for FnHeader<I> where I: Interner {
    fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
        match self {
            FnHeader { fn_sig_kind: ref __field_fn_sig_kind } => {
                ::core::hash::Hash::hash(__field_fn_sig_kind, __state);
            }
        }
    }
}#[derive_where(Clone, Copy, Debug, PartialEq, Hash; I: Interner)]
1397#[cfg_attr(
1398    feature = "nightly",
1399    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for FnHeader<I> where
            FnSigKind<I>: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let FnHeader { fn_sig_kind: ref __binding_0 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for FnHeader<I> where
            FnSigKind<I>: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                FnHeader {
                    fn_sig_kind: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            FnHeader<I> where
            FnSigKind<I>: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    FnHeader { fn_sig_kind: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
1400)]
1401#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for FnHeader<I>
            where I: Interner {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self { FnHeader { .. } => {} }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        unsafe impl<I: Interner, __V>
            ::rustc_type_ir::GenericTypeVisitable<__V> for FnHeader<I> where
            FnSigKind<I>: ::rustc_type_ir::GenericTypeVisitable<__V> {
            fn generic_visit_with(&self, __visitor: &mut __V) {
                match *self {
                    FnHeader { fn_sig_kind: ref __binding_0 } => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                    }
                }
            }
        }
    };GenericTypeVisitable, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for FnHeader<I>
            where I: Interner {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        FnHeader { fn_sig_kind: __binding_0 } => {
                            FnHeader { fn_sig_kind: __binding_0 }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    FnHeader { fn_sig_kind: __binding_0 } => {
                        FnHeader { fn_sig_kind: __binding_0 }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnHeader<I>
            where J: Interner, I: ::rustc_type_ir::LiftInto<J> {
            type Lifted = FnHeader<J>;
            fn lift_to_interner(self, interner: J) -> Self::Lifted {
                match self {
                    FnHeader { fn_sig_kind: __binding_0 } => {
                        FnHeader {
                            fn_sig_kind: __binding_0.lift_to_interner(interner),
                        }
                    }
                }
            }
        }
    };Lift_Generic)]
1402pub struct FnHeader<I: Interner> {
1403    #[type_visitable(ignore)]
1404    #[type_foldable(identity)]
1405    pub fn_sig_kind: FnSigKind<I>,
1406}
1407
1408impl<I: Interner> FnHeader<I> {
1409    pub fn c_variadic(self) -> bool {
1410        self.fn_sig_kind.c_variadic()
1411    }
1412
1413    pub fn safety(self) -> I::Safety {
1414        self.fn_sig_kind.safety()
1415    }
1416
1417    pub fn abi(self) -> ExternAbi {
1418        self.fn_sig_kind.abi()
1419    }
1420
1421    pub fn splatted(self) -> Option<u8> {
1422        self.fn_sig_kind.splatted()
1423    }
1424
1425    /// Create a new safe FnHeader with the `extern "Rust"` ABI, that isn't C-style variadic or splatted.
1426    pub fn dummy() -> Self {
1427        Self { fn_sig_kind: FnSigKind::dummy() }
1428    }
1429}
1430
1431impl<I: Interner> Eq for FnHeader<I> {}
1432
1433#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for CoroutineWitnessTypes<I> where
    I: Interner {
    #[inline]
    fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for CoroutineWitnessTypes<I> where
    I: Interner {
}
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for CoroutineWitnessTypes<I> where
    I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            CoroutineWitnessTypes {
                types: ref __field_types, assumptions: ref __field_assumptions
                } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f,
                        "CoroutineWitnessTypes");
                ::core::fmt::DebugStruct::field(&mut __builder, "types",
                    __field_types);
                ::core::fmt::DebugStruct::field(&mut __builder, "assumptions",
                    __field_assumptions);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for CoroutineWitnessTypes<I> where
    I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (CoroutineWitnessTypes {
                types: ref __field_types, assumptions: ref __field_assumptions
                }, CoroutineWitnessTypes {
                types: ref __other_field_types,
                assumptions: ref __other_field_assumptions }) =>
                true &&
                        ::core::cmp::PartialEq::eq(__field_types,
                            __other_field_types) &&
                    ::core::cmp::PartialEq::eq(__field_assumptions,
                        __other_field_assumptions),
        }
    }
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for CoroutineWitnessTypes<I> where
    I: Interner {
    fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
        match self {
            CoroutineWitnessTypes {
                types: ref __field_types, assumptions: ref __field_assumptions
                } => {
                ::core::hash::Hash::hash(__field_types, __state);
                ::core::hash::Hash::hash(__field_assumptions, __state);
            }
        }
    }
}#[derive_where(Clone, Copy, Debug, PartialEq, Hash; I: Interner)]
1434#[cfg_attr(
1435    feature = "nightly",
1436    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for CoroutineWitnessTypes<I>
            where I::Tys: ::rustc_serialize::Encodable<__E>,
            I::RegionAssumptions: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let CoroutineWitnessTypes {
                        types: ref __binding_0, assumptions: ref __binding_1 } =
                    *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for CoroutineWitnessTypes<I>
            where I::Tys: ::rustc_serialize::Decodable<__D>,
            I::RegionAssumptions: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                CoroutineWitnessTypes {
                    types: ::rustc_serialize::Decodable::decode(__decoder),
                    assumptions: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            CoroutineWitnessTypes<I> where
            I::Tys: ::rustc_data_structures::stable_hash::StableHash,
            I::RegionAssumptions: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    CoroutineWitnessTypes {
                        types: ref __binding_0, assumptions: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
1437)]
1438#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            CoroutineWitnessTypes<I> where I: Interner,
            I::Tys: ::rustc_type_ir::TypeVisitable<I>,
            I::RegionAssumptions: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    CoroutineWitnessTypes {
                        types: ref __binding_0, assumptions: ref __binding_1 } => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        unsafe impl<I: Interner, __V>
            ::rustc_type_ir::GenericTypeVisitable<__V> for
            CoroutineWitnessTypes<I> where
            I::Tys: ::rustc_type_ir::GenericTypeVisitable<__V>,
            I::RegionAssumptions: ::rustc_type_ir::GenericTypeVisitable<__V> {
            fn generic_visit_with(&self, __visitor: &mut __V) {
                match *self {
                    CoroutineWitnessTypes {
                        types: ref __binding_0, assumptions: ref __binding_1 } => {
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
                                __visitor);
                        }
                        {
                            ::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
                                __visitor);
                        }
                    }
                }
            }
        }
    };GenericTypeVisitable, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
            CoroutineWitnessTypes<I> where I: Interner,
            I::Tys: ::rustc_type_ir::TypeFoldable<I>,
            I::RegionAssumptions: ::rustc_type_ir::TypeFoldable<I> {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        CoroutineWitnessTypes {
                            types: __binding_0, assumptions: __binding_1 } => {
                            CoroutineWitnessTypes {
                                types: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                assumptions: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    CoroutineWitnessTypes {
                        types: __binding_0, assumptions: __binding_1 } => {
                        CoroutineWitnessTypes {
                            types: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            assumptions: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            CoroutineWitnessTypes<I> where J: Interner,
            I: ::rustc_type_ir::LiftInto<J> {
            type Lifted = CoroutineWitnessTypes<J>;
            fn lift_to_interner(self, interner: J) -> Self::Lifted {
                match self {
                    CoroutineWitnessTypes {
                        types: __binding_0, assumptions: __binding_1 } => {
                        CoroutineWitnessTypes {
                            types: __binding_0.lift_to_interner(interner),
                            assumptions: __binding_1.lift_to_interner(interner),
                        }
                    }
                }
            }
        }
    };Lift_Generic)]
1439pub struct CoroutineWitnessTypes<I: Interner> {
1440    pub types: I::Tys,
1441    pub assumptions: I::RegionAssumptions,
1442}
1443
1444impl<I: Interner> Eq for CoroutineWitnessTypes<I> {}