Skip to main content

rustc_type_ir/
ty_kind.rs

1use std::fmt;
2use std::ops::Deref;
3
4use derive_where::derive_where;
5use rustc_ast_ir::Mutability;
6#[cfg(feature = "nightly")]
7use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
8#[cfg(feature = "nightly")]
9use rustc_macros::{Decodable_NoContext, Encodable_NoContext, HashStable_NoContext};
10use rustc_type_ir::data_structures::{NoError, UnifyKey, UnifyValue};
11use rustc_type_ir_macros::{
12    GenericTypeVisitable, Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic,
13};
14
15use self::TyKind::*;
16pub use self::closure::*;
17use crate::inherent::*;
18#[cfg(feature = "nightly")]
19use crate::visit::TypeVisitable;
20use crate::{self as ty, BoundVarIndexKind, FloatTy, IntTy, Interner, UintTy};
21
22mod closure;
23
24#[derive(#[automatically_derived]
impl ::core::clone::Clone for AliasTyKind {
    #[inline]
    fn clone(&self) -> AliasTyKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AliasTyKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for AliasTyKind {
    #[inline]
    fn eq(&self, other: &AliasTyKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AliasTyKind {
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for AliasTyKind {
    #[inline]
    fn partial_cmp(&self, other: &AliasTyKind)
        -> ::core::option::Option<::core::cmp::Ordering> {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for AliasTyKind {
    #[inline]
    fn cmp(&self, other: &AliasTyKind) -> ::core::cmp::Ordering {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for AliasTyKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for AliasTyKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AliasTyKind::Projection => "Projection",
                AliasTyKind::Inherent => "Inherent",
                AliasTyKind::Opaque => "Opaque",
                AliasTyKind::Free => "Free",
            })
    }
}Debug)]
25#[derive(GenericTypeVisitable)]
26#[cfg_attr(
27    feature = "nightly",
28    derive(const _: () =
    {
        impl<__E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for AliasTyKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AliasTyKind::Projection => { 0usize }
                        AliasTyKind::Inherent => { 1usize }
                        AliasTyKind::Opaque => { 2usize }
                        AliasTyKind::Free => { 3usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AliasTyKind::Projection => {}
                    AliasTyKind::Inherent => {}
                    AliasTyKind::Opaque => {}
                    AliasTyKind::Free => {}
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<__D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for AliasTyKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { AliasTyKind::Projection }
                    1usize => { AliasTyKind::Inherent }
                    2usize => { AliasTyKind::Opaque }
                    3usize => { AliasTyKind::Free }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AliasTyKind`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            for AliasTyKind {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    AliasTyKind::Projection => {}
                    AliasTyKind::Inherent => {}
                    AliasTyKind::Opaque => {}
                    AliasTyKind::Free => {}
                }
            }
        }
    };HashStable_NoContext)
29)]
30pub enum AliasTyKind {
31    /// A projection `<Type as Trait>::AssocType`.
32    ///
33    /// Can get normalized away if monomorphic enough.
34    Projection,
35    /// An associated type in an inherent `impl`
36    Inherent,
37    /// An opaque type (usually from `impl Trait` in type aliases or function return types)
38    ///
39    /// Can only be normalized away in PostAnalysis mode or its defining scope.
40    Opaque,
41    /// A type alias that actually checks its trait bounds.
42    ///
43    /// Currently only used if the type alias references opaque types.
44    /// Can always be normalized away.
45    Free,
46}
47
48impl AliasTyKind {
49    pub fn descr(self) -> &'static str {
50        match self {
51            AliasTyKind::Projection => "associated type",
52            AliasTyKind::Inherent => "inherent associated type",
53            AliasTyKind::Opaque => "opaque type",
54            AliasTyKind::Free => "type alias",
55        }
56    }
57}
58
59/// Defines the kinds of types used by the type system.
60///
61/// Types written by the user start out as `hir::TyKind` and get
62/// converted to this representation using `<dyn HirTyLowerer>::lower_ty`.
63#[cfg_attr(feature = "nightly", rustc_diagnostic_item = "IrTyKind")]
64#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for TyKind<I> where I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> 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)]
65#[derive(GenericTypeVisitable)]
66#[cfg_attr(
67    feature = "nightly",
68    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>,
            I::Const: ::rustc_serialize::Encodable<__E>,
            I::Pat: ::rustc_serialize::Encodable<__E>,
            I::Region: ::rustc_serialize::Encodable<__E>,
            I::FunctionId: ::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>,
            I::Const: ::rustc_serialize::Decodable<__D>,
            I::Pat: ::rustc_serialize::Decodable<__D>,
            I::Region: ::rustc_serialize::Decodable<__D>,
            I::FunctionId: ::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, __CTX>
            ::rustc_data_structures::stable_hasher::HashStable<__CTX> for
            TyKind<I> where
            I::AdtDef: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::GenericArgs: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::ForeignId: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::Ty: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::Const: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::Pat: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::Region: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::FunctionId: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            ty::Binder<I,
            FnSigTys<I>>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            FnHeader<I>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            UnsafeBinderInner<I>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::BoundExistentialPredicates: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::ClosureId: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::CoroutineClosureId: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::CoroutineId: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::Tys: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            AliasTy<I>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::ParamTy: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            ty::BoundTy<I>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            ty::PlaceholderType<I>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::ErrorGuaranteed: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    TyKind::Bool => {}
                    TyKind::Char => {}
                    TyKind::Int(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Uint(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Float(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Adt(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Foreign(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Str => {}
                    TyKind::Array(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Pat(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Slice(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::RawPtr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::FnDef(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::FnPtr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::UnsafeBinder(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Dynamic(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Closure(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::CoroutineClosure(ref __binding_0, ref __binding_1)
                        => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Coroutine(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::CoroutineWitness(ref __binding_0, ref __binding_1)
                        => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Never => {}
                    TyKind::Tuple(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Alias(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Param(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Bound(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Placeholder(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Infer(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    TyKind::Error(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
69)]
70pub enum TyKind<I: Interner> {
71    /// The primitive boolean type. Written as `bool`.
72    Bool,
73
74    /// The primitive character type; holds a Unicode scalar value
75    /// (a non-surrogate code point). Written as `char`.
76    Char,
77
78    /// A primitive signed integer type. For example, `i32`.
79    Int(IntTy),
80
81    /// A primitive unsigned integer type. For example, `u32`.
82    Uint(UintTy),
83
84    /// A primitive floating-point type. For example, `f64`.
85    Float(FloatTy),
86
87    /// Algebraic data types (ADT). For example: structures, enumerations and unions.
88    ///
89    /// For example, the type `List<i32>` would be represented using the `AdtDef`
90    /// for `struct List<T>` and the args `[i32]`.
91    ///
92    /// Note that generic parameters in fields only get lazily instantiated
93    /// by using something like `adt_def.all_fields().map(|field| field.ty(interner, args))`.
94    Adt(I::AdtDef, I::GenericArgs),
95
96    /// An unsized FFI type that is opaque to Rust. Written as `extern type T`.
97    Foreign(I::ForeignId),
98
99    /// The pointee of a string slice. Written as `str`.
100    Str,
101
102    /// An array with the given length. Written as `[T; N]`.
103    Array(I::Ty, I::Const),
104
105    /// A pattern newtype.
106    ///
107    /// Takes any type and restricts its valid values to its pattern.
108    /// This will also change the layout to take advantage of this restriction.
109    /// Only `Copy` and `Clone` will automatically get implemented for pattern types.
110    /// Auto-traits treat this as if it were an aggregate with a single nested type.
111    /// Only supports integer range patterns for now.
112    Pat(I::Ty, I::Pat),
113
114    /// The pointee of an array slice. Written as `[T]`.
115    Slice(I::Ty),
116
117    /// A raw pointer. Written as `*mut T` or `*const T`
118    RawPtr(I::Ty, Mutability),
119
120    /// A reference; a pointer with an associated lifetime. Written as
121    /// `&'a mut T` or `&'a T`.
122    Ref(I::Region, I::Ty, Mutability),
123
124    /// The anonymous type of a function declaration/definition.
125    ///
126    /// Each function has a unique type.
127    ///
128    /// For the function `fn foo() -> i32 { 3 }` this type would be
129    /// shown to the user as `fn() -> i32 {foo}`.
130    ///
131    /// For example the type of `bar` here:
132    /// ```rust
133    /// fn foo() -> i32 { 1 }
134    /// let bar = foo; // bar: fn() -> i32 {foo}
135    /// ```
136    FnDef(I::FunctionId, I::GenericArgs),
137
138    /// A pointer to a function.
139    ///
140    /// Written as `fn() -> i32`.
141    ///
142    /// Note that both functions and closures start out as either
143    /// [FnDef] or [Closure] which can be then be coerced to this variant.
144    ///
145    /// For example the type of `bar` here:
146    ///
147    /// ```rust
148    /// fn foo() -> i32 { 1 }
149    /// let bar: fn() -> i32 = foo;
150    /// ```
151    ///
152    /// These two fields are equivalent to a `ty::Binder<I, FnSig<I>>`. But by
153    /// splitting that into two pieces, we get a more compact data layout that
154    /// reduces the size of `TyKind` by 8 bytes. It is a very hot type, so it's
155    /// worth the mild inconvenience.
156    FnPtr(ty::Binder<I, FnSigTys<I>>, FnHeader<I>),
157
158    /// An unsafe binder type.
159    ///
160    /// A higher-ranked type used to represent a type which has had some of its
161    /// lifetimes erased. This can be used to represent types in positions where
162    /// a lifetime is literally inexpressible, such as self-referential types.
163    UnsafeBinder(UnsafeBinderInner<I>),
164
165    /// A trait object. Written as `dyn for<'b> Trait<'b, Assoc = u32> + Send + 'a`.
166    Dynamic(I::BoundExistentialPredicates, I::Region),
167
168    /// The anonymous type of a closure. Used to represent the type of `|a| a`.
169    ///
170    /// Closure args contain both the - potentially instantiated - generic parameters
171    /// of its parent and some synthetic parameters. See the documentation for
172    /// `ClosureArgs` for more details.
173    Closure(I::ClosureId, I::GenericArgs),
174
175    /// The anonymous type of a closure. Used to represent the type of `async |a| a`.
176    ///
177    /// Coroutine-closure args contain both the - potentially instantiated - generic
178    /// parameters of its parent and some synthetic parameters. See the documentation
179    /// for `CoroutineClosureArgs` for more details.
180    CoroutineClosure(I::CoroutineClosureId, I::GenericArgs),
181
182    /// The anonymous type of a coroutine. Used to represent the type of
183    /// `|a| yield a`.
184    ///
185    /// For more info about coroutine args, visit the documentation for
186    /// `CoroutineArgs`.
187    Coroutine(I::CoroutineId, I::GenericArgs),
188
189    /// A type representing the types stored inside a coroutine.
190    ///
191    /// This should only appear as part of the `CoroutineArgs`.
192    ///
193    /// Unlike upvars, the witness can reference lifetimes from
194    /// inside of the coroutine itself. To deal with them in
195    /// the type of the coroutine, we convert them to higher ranked
196    /// lifetimes bound by the witness itself.
197    ///
198    /// This contains the `DefId` and the `GenericArgsRef` of the coroutine.
199    /// The actual witness types are computed on MIR by the `mir_coroutine_witnesses` query.
200    ///
201    /// Looking at the following example, the witness for this coroutine
202    /// may end up as something like `for<'a> [Vec<i32>, &'a Vec<i32>]`:
203    ///
204    /// ```
205    /// #![feature(coroutines)]
206    /// #[coroutine] static |a| {
207    ///     let x = &vec![3];
208    ///     yield a;
209    ///     yield x[0];
210    /// }
211    /// # ;
212    /// ```
213    CoroutineWitness(I::CoroutineId, I::GenericArgs),
214
215    /// The never type `!`.
216    Never,
217
218    /// A tuple type. For example, `(i32, bool)`.
219    Tuple(I::Tys),
220
221    /// A projection, opaque type, free type alias, or inherent associated type.
222    ///
223    /// All of these types are represented as pairs of def-id and args, and can
224    /// be normalized, so they are grouped conceptually.
225    Alias(AliasTyKind, AliasTy<I>),
226
227    /// A type parameter; for example, `T` in `fn f<T>(x: T) {}`.
228    Param(I::ParamTy),
229
230    /// Bound type variable, used to represent the `'a` in `for<'a> fn(&'a ())`.
231    ///
232    /// For canonical queries, we replace inference variables with bound variables,
233    /// so e.g. when checking whether `&'_ (): Trait<_>` holds, we canonicalize that to
234    /// `for<'a, T> &'a (): Trait<T>` and then convert the introduced bound variables
235    /// back to inference variables in a new inference context when inside of the query.
236    ///
237    /// It is conventional to render anonymous bound types like `^N` or `^D_N`,
238    /// where `N` is the bound variable's anonymous index into the binder, and
239    /// `D` is the debruijn index, or totally omitted if the debruijn index is zero.
240    ///
241    /// See the `rustc-dev-guide` for more details about
242    /// [higher-ranked trait bounds][1] and [canonical queries][2].
243    ///
244    /// [1]: https://rustc-dev-guide.rust-lang.org/traits/hrtb.html
245    /// [2]: https://rustc-dev-guide.rust-lang.org/traits/canonical-queries.html
246    Bound(BoundVarIndexKind, ty::BoundTy<I>),
247
248    /// A placeholder type, used during higher ranked subtyping to instantiate
249    /// bound variables.
250    ///
251    /// It is conventional to render anonymous placeholder types like `!N` or `!U_N`,
252    /// where `N` is the placeholder variable's anonymous index (which corresponds
253    /// to the bound variable's index from the binder from which it was instantiated),
254    /// and `U` is the universe index in which it is instantiated, or totally omitted
255    /// if the universe index is zero.
256    Placeholder(ty::PlaceholderType<I>),
257
258    /// A type variable used during type checking.
259    ///
260    /// Similar to placeholders, inference variables also live in a universe to
261    /// correctly deal with higher ranked types. Though unlike placeholders,
262    /// that universe is stored in the `InferCtxt` instead of directly
263    /// inside of the type.
264    Infer(InferTy),
265
266    /// A placeholder for a type which could not be computed.
267    ///
268    /// This is propagated to avoid useless error messages.
269    Error(I::ErrorGuaranteed),
270}
271
272impl<I: Interner> Eq for TyKind<I> {}
273
274impl<I: Interner> TyKind<I> {
275    pub fn fn_sig(self, interner: I) -> ty::Binder<I, ty::FnSig<I>> {
276        match self {
277            ty::FnPtr(sig_tys, hdr) => sig_tys.with(hdr),
278            ty::FnDef(def_id, args) => interner.fn_sig(def_id).instantiate(interner, args),
279            ty::Error(_) => {
280                // ignore errors (#54954)
281                ty::Binder::dummy(ty::FnSig {
282                    inputs_and_output: Default::default(),
283                    c_variadic: false,
284                    safety: I::Safety::safe(),
285                    abi: I::Abi::rust(),
286                })
287            }
288            ty::Closure(..) => {
    ::core::panicking::panic_fmt(format_args!("to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`"));
}panic!(
289                "to get the signature of a closure, use `args.as_closure().sig()` not `fn_sig()`",
290            ),
291            _ => {
    ::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),
292        }
293    }
294
295    /// Returns `true` when the outermost type cannot be further normalized,
296    /// resolved, or instantiated.
297    ///
298    /// This includes all primitive types, but also
299    /// things like ADTs and trait objects, since even if their arguments or
300    /// nested types may be further simplified, the outermost [`ty::TyKind`] or
301    /// type constructor remains the same.
302    pub fn is_known_rigid(self) -> bool {
303        match self {
304            ty::Bool
305            | ty::Char
306            | ty::Int(_)
307            | ty::Uint(_)
308            | ty::Float(_)
309            | ty::Adt(_, _)
310            | ty::Foreign(_)
311            | ty::Str
312            | ty::Array(_, _)
313            | ty::Pat(_, _)
314            | ty::Slice(_)
315            | ty::RawPtr(_, _)
316            | ty::Ref(_, _, _)
317            | ty::FnDef(_, _)
318            | ty::FnPtr(..)
319            | ty::UnsafeBinder(_)
320            | ty::Dynamic(_, _)
321            | ty::Closure(_, _)
322            | ty::CoroutineClosure(_, _)
323            | ty::Coroutine(_, _)
324            | ty::CoroutineWitness(..)
325            | ty::Never
326            | ty::Tuple(_) => true,
327
328            ty::Error(_)
329            | ty::Infer(_)
330            | ty::Alias(_, _)
331            | ty::Param(_)
332            | ty::Bound(_, _)
333            | ty::Placeholder(_) => false,
334        }
335    }
336}
337
338// This is manually implemented because a derive would require `I: Debug`
339impl<I: Interner> fmt::Debug for TyKind<I> {
340    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
341        match self {
342            Bool => f.write_fmt(format_args!("bool"))write!(f, "bool"),
343            Char => f.write_fmt(format_args!("char"))write!(f, "char"),
344            Int(i) => f.write_fmt(format_args!("{0:?}", i))write!(f, "{i:?}"),
345            Uint(u) => f.write_fmt(format_args!("{0:?}", u))write!(f, "{u:?}"),
346            Float(float) => f.write_fmt(format_args!("{0:?}", float))write!(f, "{float:?}"),
347            Adt(d, s) => {
348                f.write_fmt(format_args!("{0:?}", d))write!(f, "{d:?}")?;
349                let mut s = s.iter();
350                let first = s.next();
351                match first {
352                    Some(first) => f.write_fmt(format_args!("<{0:?}", first))write!(f, "<{:?}", first)?,
353                    None => return Ok(()),
354                };
355
356                for arg in s {
357                    f.write_fmt(format_args!(", {0:?}", arg))write!(f, ", {:?}", arg)?;
358                }
359
360                f.write_fmt(format_args!(">"))write!(f, ">")
361            }
362            Foreign(d) => f.debug_tuple("Foreign").field(d).finish(),
363            Str => f.write_fmt(format_args!("str"))write!(f, "str"),
364            Array(t, c) => f.write_fmt(format_args!("[{0:?}; {1:?}]", t, c))write!(f, "[{t:?}; {c:?}]"),
365            Pat(t, p) => f.write_fmt(format_args!("pattern_type!({0:?} is {1:?})", t, p))write!(f, "pattern_type!({t:?} is {p:?})"),
366            Slice(t) => f.write_fmt(format_args!("[{0:?}]", &t))write!(f, "[{:?}]", &t),
367            RawPtr(ty, mutbl) => f.write_fmt(format_args!("*{0} {1:?}", mutbl.ptr_str(), ty))write!(f, "*{} {:?}", mutbl.ptr_str(), ty),
368            Ref(r, t, m) => f.write_fmt(format_args!("&{0:?} {1}{2:?}", r, m.prefix_str(), t))write!(f, "&{:?} {}{:?}", r, m.prefix_str(), t),
369            FnDef(d, s) => f.debug_tuple("FnDef").field(d).field(&s).finish(),
370            FnPtr(sig_tys, hdr) => f.write_fmt(format_args!("{0:?}", sig_tys.with(*hdr)))write!(f, "{:?}", sig_tys.with(*hdr)),
371            // FIXME(unsafe_binder): print this like `unsafe<'a> T<'a>`.
372            UnsafeBinder(binder) => f.write_fmt(format_args!("{0:?}", binder))write!(f, "{:?}", binder),
373            Dynamic(p, r) => f.write_fmt(format_args!("dyn {0:?} + {1:?}", p, r))write!(f, "dyn {p:?} + {r:?}"),
374            Closure(d, s) => f.debug_tuple("Closure").field(d).field(&s).finish(),
375            CoroutineClosure(d, s) => f.debug_tuple("CoroutineClosure").field(d).field(&s).finish(),
376            Coroutine(d, s) => f.debug_tuple("Coroutine").field(d).field(&s).finish(),
377            CoroutineWitness(d, s) => f.debug_tuple("CoroutineWitness").field(d).field(&s).finish(),
378            Never => f.write_fmt(format_args!("!"))write!(f, "!"),
379            Tuple(t) => {
380                f.write_fmt(format_args!("("))write!(f, "(")?;
381                let mut count = 0;
382                for ty in t.iter() {
383                    if count > 0 {
384                        f.write_fmt(format_args!(", "))write!(f, ", ")?;
385                    }
386                    f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
387                    count += 1;
388                }
389                // unary tuples need a trailing comma
390                if count == 1 {
391                    f.write_fmt(format_args!(","))write!(f, ",")?;
392                }
393                f.write_fmt(format_args!(")"))write!(f, ")")
394            }
395            Alias(i, a) => f.debug_tuple("Alias").field(i).field(&a).finish(),
396            Param(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
397            Bound(d, b) => crate::debug_bound_var(f, *d, b),
398            Placeholder(p) => f.write_fmt(format_args!("{0:?}", p))write!(f, "{p:?}"),
399            Infer(t) => f.write_fmt(format_args!("{0:?}", t))write!(f, "{:?}", t),
400            TyKind::Error(_) => f.write_fmt(format_args!("{{type error}}"))write!(f, "{{type error}}"),
401        }
402    }
403}
404
405/// Represents the projection of an associated, opaque, or lazy-type-alias type.
406///
407/// * For a projection, this would be `<Ty as Trait<...>>::N<...>`.
408/// * For an inherent projection, this would be `Ty::N<...>`.
409/// * For an opaque type, there is no explicit syntax.
410#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for AliasTy<I> where I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            AliasTy {
                args: ref __field_args,
                def_id: ref __field_def_id,
                _use_alias_ty_new_instead: ref __field__use_alias_ty_new_instead
                } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "AliasTy");
                ::core::fmt::DebugStruct::field(&mut __builder, "args",
                    __field_args);
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish_non_exhaustive(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
411#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for AliasTy<I>
            where I: Interner,
            I::GenericArgs: ::rustc_type_ir::TypeVisitable<I>,
            I::DefId: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    AliasTy {
                        args: ref __binding_0,
                        def_id: ref __binding_1,
                        _use_alias_ty_new_instead: ref __binding_2 } => {
                        {
                            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);
                                }
                            }
                        }
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_2,
                                        __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, GenericTypeVisitable, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for AliasTy<I>
            where I: Interner,
            I::GenericArgs: ::rustc_type_ir::TypeFoldable<I>,
            I::DefId: ::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 {
                        AliasTy {
                            args: __binding_0,
                            def_id: __binding_1,
                            _use_alias_ty_new_instead: __binding_2 } => {
                            AliasTy {
                                args: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                _use_alias_ty_new_instead: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    AliasTy {
                        args: __binding_0,
                        def_id: __binding_1,
                        _use_alias_ty_new_instead: __binding_2 } => {
                        AliasTy {
                            args: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            _use_alias_ty_new_instead: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for AliasTy<I>
            where I: Interner, J: Interner,
            I::GenericArgs: ::rustc_type_ir::lift::Lift<J, Lifted =
            J::GenericArgs>,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
            (): ::rustc_type_ir::lift::Lift<J, Lifted = ()> {
            type Lifted = AliasTy<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        AliasTy {
                            args: __binding_0,
                            def_id: __binding_1,
                            _use_alias_ty_new_instead: __binding_2 } => {
                            AliasTy {
                                args: __binding_0.lift_to_interner(interner)?,
                                def_id: __binding_1.lift_to_interner(interner)?,
                                _use_alias_ty_new_instead: __binding_2.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
412#[cfg_attr(
413    feature = "nightly",
414    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for AliasTy<I> where
            I::GenericArgs: ::rustc_serialize::Decodable<__D>,
            I::DefId: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                AliasTy {
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                    def_id: ::rustc_serialize::Decodable::decode(__decoder),
                    _use_alias_ty_new_instead: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for AliasTy<I> where
            I::GenericArgs: ::rustc_serialize::Encodable<__E>,
            I::DefId: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    AliasTy {
                        args: ref __binding_0,
                        def_id: ref __binding_1,
                        _use_alias_ty_new_instead: 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);
                    }
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __CTX>
            ::rustc_data_structures::stable_hasher::HashStable<__CTX> for
            AliasTy<I> where
            I::GenericArgs: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::DefId: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    AliasTy {
                        args: ref __binding_0,
                        def_id: ref __binding_1,
                        _use_alias_ty_new_instead: ref __binding_2 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
415)]
416pub struct AliasTy<I: Interner> {
417    /// The parameters of the associated or opaque type.
418    ///
419    /// For a projection, these are the generic parameters for the trait and the
420    /// GAT parameters, if there are any.
421    ///
422    /// For an inherent projection, they consist of the self type and the GAT parameters,
423    /// if there are any.
424    ///
425    /// For RPIT the generic parameters are for the generics of the function,
426    /// while for TAIT it is used for the generic parameters of the alias.
427    pub args: I::GenericArgs,
428
429    /// The `DefId` of the `TraitItem` or `ImplItem` for the associated type `N` depending on whether
430    /// this is a projection or an inherent projection or the `DefId` of the `OpaqueType` item if
431    /// this is an opaque.
432    ///
433    /// During codegen, `interner.type_of(def_id)` can be used to get the type of the
434    /// underlying type if the type is an opaque.
435    ///
436    /// Note that if this is an associated type, this is not the `DefId` of the
437    /// `TraitRef` containing this associated type, which is in `interner.associated_item(def_id).container`,
438    /// aka. `interner.parent(def_id)`.
439    pub def_id: I::DefId,
440
441    /// This field exists to prevent the creation of `AliasTy` without using [`AliasTy::new_from_args`].
442    #[derive_where(skip(Debug))]
443    pub(crate) _use_alias_ty_new_instead: (),
444}
445
446impl<I: Interner> Eq for AliasTy<I> {}
447
448impl<I: Interner> AliasTy<I> {
449    pub fn new_from_args(interner: I, def_id: I::DefId, args: I::GenericArgs) -> AliasTy<I> {
450        interner.debug_assert_args_compatible(def_id, args);
451        AliasTy { def_id, args, _use_alias_ty_new_instead: () }
452    }
453
454    pub fn new(
455        interner: I,
456        def_id: I::DefId,
457        args: impl IntoIterator<Item: Into<I::GenericArg>>,
458    ) -> AliasTy<I> {
459        let args = interner.mk_args_from_iter(args.into_iter().map(Into::into));
460        Self::new_from_args(interner, def_id, args)
461    }
462
463    pub fn kind(self, interner: I) -> AliasTyKind {
464        interner.alias_ty_kind(self)
465    }
466
467    /// Whether this alias type is an opaque.
468    pub fn is_opaque(self, interner: I) -> bool {
469        #[allow(non_exhaustive_omitted_patterns)] match self.kind(interner) {
    AliasTyKind::Opaque => true,
    _ => false,
}matches!(self.kind(interner), AliasTyKind::Opaque)
470    }
471
472    pub fn to_ty(self, interner: I) -> I::Ty {
473        Ty::new_alias(interner, self.kind(interner), self)
474    }
475}
476
477/// The following methods work only with (trait) associated type projections.
478impl<I: Interner> AliasTy<I> {
479    pub fn self_ty(self) -> I::Ty {
480        self.args.type_at(0)
481    }
482
483    pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> Self {
484        AliasTy::new(
485            interner,
486            self.def_id,
487            [self_ty.into()].into_iter().chain(self.args.iter().skip(1)),
488        )
489    }
490
491    pub fn trait_def_id(self, interner: I) -> I::DefId {
492        match (&self.kind(interner), &AliasTyKind::Projection) {
    (left_val, right_val) => {
        if !(*left_val == *right_val) {
            let kind = ::core::panicking::AssertKind::Eq;
            ::core::panicking::assert_failed(kind, &*left_val, &*right_val,
                ::core::option::Option::Some(format_args!("expected a projection")));
        }
    }
};assert_eq!(self.kind(interner), AliasTyKind::Projection, "expected a projection");
493        interner.parent(self.def_id)
494    }
495
496    /// Extracts the underlying trait reference and own args from this projection.
497    ///
498    /// For example, if this is a projection of `<T as StreamingIterator>::Item<'a>`,
499    /// then this function would return a `T: StreamingIterator` trait reference and
500    /// `['a]` as the own args.
501    pub fn trait_ref_and_own_args(self, interner: I) -> (ty::TraitRef<I>, I::GenericArgsSlice) {
502        if true {
    match (&self.kind(interner), &AliasTyKind::Projection) {
        (left_val, right_val) => {
            if !(*left_val == *right_val) {
                let kind = ::core::panicking::AssertKind::Eq;
                ::core::panicking::assert_failed(kind, &*left_val,
                    &*right_val, ::core::option::Option::None);
            }
        }
    };
};debug_assert_eq!(self.kind(interner), AliasTyKind::Projection);
503        interner.trait_ref_and_own_args_for_alias(self.def_id, self.args)
504    }
505
506    /// Extracts the underlying trait reference from this projection.
507    ///
508    /// For example, if this is a projection of `<T as Iterator>::Item`,
509    /// then this function would return a `T: Iterator` trait reference.
510    ///
511    /// WARNING: This will drop the args for generic associated types
512    /// consider calling [Self::trait_ref_and_own_args] to get those
513    /// as well.
514    pub fn trait_ref(self, interner: I) -> ty::TraitRef<I> {
515        self.trait_ref_and_own_args(interner).0
516    }
517}
518
519#[derive(#[automatically_derived]
impl ::core::clone::Clone for IntVarValue {
    #[inline]
    fn clone(&self) -> IntVarValue {
        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::cmp::PartialEq for IntVarValue {
    #[inline]
    fn eq(&self, other: &IntVarValue) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (IntVarValue::IntType(__self_0),
                    IntVarValue::IntType(__arg1_0)) => __self_0 == __arg1_0,
                (IntVarValue::UintType(__self_0),
                    IntVarValue::UintType(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for IntVarValue {
    #[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 {
            IntVarValue::Unknown =>
                ::core::fmt::Formatter::write_str(f, "Unknown"),
            IntVarValue::IntType(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "IntType", &__self_0),
            IntVarValue::UintType(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "UintType", &__self_0),
        }
    }
}Debug)]
520pub enum IntVarValue {
521    Unknown,
522    IntType(IntTy),
523    UintType(UintTy),
524}
525
526impl IntVarValue {
527    pub fn is_known(self) -> bool {
528        match self {
529            IntVarValue::IntType(_) | IntVarValue::UintType(_) => true,
530            IntVarValue::Unknown => false,
531        }
532    }
533
534    pub fn is_unknown(self) -> bool {
535        !self.is_known()
536    }
537}
538
539#[derive(#[automatically_derived]
impl ::core::clone::Clone for FloatVarValue {
    #[inline]
    fn clone(&self) -> FloatVarValue {
        let _: ::core::clone::AssertParamIsClone<FloatTy>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for FloatVarValue { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for FloatVarValue {
    #[inline]
    fn eq(&self, other: &FloatVarValue) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (FloatVarValue::Known(__self_0),
                    FloatVarValue::Known(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for FloatVarValue {
    #[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 {
            FloatVarValue::Unknown =>
                ::core::fmt::Formatter::write_str(f, "Unknown"),
            FloatVarValue::Known(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Known",
                    &__self_0),
        }
    }
}Debug)]
540pub enum FloatVarValue {
541    Unknown,
542    Known(FloatTy),
543}
544
545impl FloatVarValue {
546    pub fn is_known(self) -> bool {
547        match self {
548            FloatVarValue::Known(_) => true,
549            FloatVarValue::Unknown => false,
550        }
551    }
552
553    pub fn is_unknown(self) -> bool {
554        !self.is_known()
555    }
556}
557
558impl ::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! {
559    /// A **ty**pe **v**ariable **ID**.
560    #[encodable]
561    #[orderable]
562    #[debug_format = "?{}t"]
563    #[gate_rustc_only]
564    pub struct TyVid {}
565}
566
567impl ::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! {
568    /// An **int**egral (`u32`, `i32`, `usize`, etc.) type **v**ariable **ID**.
569    #[encodable]
570    #[orderable]
571    #[debug_format = "?{}i"]
572    #[gate_rustc_only]
573    pub struct IntVid {}
574}
575
576impl ::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! {
577    /// A **float**ing-point (`f32` or `f64`) type **v**ariable **ID**.
578    #[encodable]
579    #[orderable]
580    #[debug_format = "?{}f"]
581    #[gate_rustc_only]
582    pub struct FloatVid {}
583}
584
585/// A placeholder for a type that hasn't been inferred yet.
586///
587/// E.g., if we have an empty array (`[]`), then we create a fresh
588/// type variable for the element type since we won't know until it's
589/// used what the element type is supposed to be.
590#[derive(#[automatically_derived]
impl ::core::clone::Clone for InferTy {
    #[inline]
    fn clone(&self) -> InferTy {
        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::cmp::PartialEq for InferTy {
    #[inline]
    fn eq(&self, other: &InferTy) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (InferTy::TyVar(__self_0), InferTy::TyVar(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (InferTy::IntVar(__self_0), InferTy::IntVar(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (InferTy::FloatVar(__self_0), InferTy::FloatVar(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (InferTy::FreshTy(__self_0), InferTy::FreshTy(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (InferTy::FreshIntTy(__self_0), InferTy::FreshIntTy(__arg1_0))
                    => __self_0 == __arg1_0,
                (InferTy::FreshFloatTy(__self_0),
                    InferTy::FreshFloatTy(__arg1_0)) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for InferTy {
    #[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: &InferTy)
        -> ::core::option::Option<::core::cmp::Ordering> {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        match (self, other) {
            (InferTy::TyVar(__self_0), InferTy::TyVar(__arg1_0)) =>
                ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
            (InferTy::IntVar(__self_0), InferTy::IntVar(__arg1_0)) =>
                ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
            (InferTy::FloatVar(__self_0), InferTy::FloatVar(__arg1_0)) =>
                ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
            (InferTy::FreshTy(__self_0), InferTy::FreshTy(__arg1_0)) =>
                ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
            (InferTy::FreshIntTy(__self_0), InferTy::FreshIntTy(__arg1_0)) =>
                ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
            (InferTy::FreshFloatTy(__self_0), InferTy::FreshFloatTy(__arg1_0))
                => ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
            _ =>
                ::core::cmp::PartialOrd::partial_cmp(&__self_discr,
                    &__arg1_discr),
        }
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for InferTy {
    #[inline]
    fn cmp(&self, other: &InferTy) -> ::core::cmp::Ordering {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
            ::core::cmp::Ordering::Equal =>
                match (self, other) {
                    (InferTy::TyVar(__self_0), InferTy::TyVar(__arg1_0)) =>
                        ::core::cmp::Ord::cmp(__self_0, __arg1_0),
                    (InferTy::IntVar(__self_0), InferTy::IntVar(__arg1_0)) =>
                        ::core::cmp::Ord::cmp(__self_0, __arg1_0),
                    (InferTy::FloatVar(__self_0), InferTy::FloatVar(__arg1_0))
                        => ::core::cmp::Ord::cmp(__self_0, __arg1_0),
                    (InferTy::FreshTy(__self_0), InferTy::FreshTy(__arg1_0)) =>
                        ::core::cmp::Ord::cmp(__self_0, __arg1_0),
                    (InferTy::FreshIntTy(__self_0),
                        InferTy::FreshIntTy(__arg1_0)) =>
                        ::core::cmp::Ord::cmp(__self_0, __arg1_0),
                    (InferTy::FreshFloatTy(__self_0),
                        InferTy::FreshFloatTy(__arg1_0)) =>
                        ::core::cmp::Ord::cmp(__self_0, __arg1_0),
                    _ => unsafe { ::core::intrinsics::unreachable() }
                },
            cmp => cmp,
        }
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for InferTy {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            InferTy::TyVar(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            InferTy::IntVar(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            InferTy::FloatVar(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            InferTy::FreshTy(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            InferTy::FreshIntTy(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            InferTy::FreshFloatTy(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
        }
    }
}Hash)]
591#[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))]
592pub enum InferTy {
593    /// A type variable.
594    TyVar(TyVid),
595    /// An integral type variable (`{integer}`).
596    ///
597    /// These are created when the compiler sees an integer literal like
598    /// `1` that could be several different types (`u8`, `i32`, `u32`, etc.).
599    /// We don't know until it's used what type it's supposed to be, so
600    /// we create a fresh type variable.
601    IntVar(IntVid),
602    /// A floating-point type variable (`{float}`).
603    ///
604    /// These are created when the compiler sees an float literal like
605    /// `1.0` that could be either an `f32` or an `f64`.
606    /// We don't know until it's used what type it's supposed to be, so
607    /// we create a fresh type variable.
608    FloatVar(FloatVid),
609
610    /// A [`FreshTy`][Self::FreshTy] is one that is generated as a replacement
611    /// for an unbound type variable.
612    ///
613    /// This is convenient for caching etc. See `TypeFreshener` for more details.
614    ///
615    /// Compare with [`TyVar`][Self::TyVar].
616    FreshTy(u32),
617    /// Like [`FreshTy`][Self::FreshTy], but as a replacement for [`IntVar`][Self::IntVar].
618    FreshIntTy(u32),
619    /// Like [`FreshTy`][Self::FreshTy], but as a replacement for [`FloatVar`][Self::FloatVar].
620    FreshFloatTy(u32),
621}
622
623impl UnifyValue for IntVarValue {
624    type Error = NoError;
625
626    fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
627        match (*value1, *value2) {
628            (IntVarValue::Unknown, IntVarValue::Unknown) => Ok(IntVarValue::Unknown),
629            (
630                IntVarValue::Unknown,
631                known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
632            )
633            | (
634                known @ (IntVarValue::UintType(_) | IntVarValue::IntType(_)),
635                IntVarValue::Unknown,
636            ) => Ok(known),
637            _ => {
    ::core::panicking::panic_fmt(format_args!("differing ints should have been resolved first"));
}panic!("differing ints should have been resolved first"),
638        }
639    }
640}
641
642impl UnifyKey for IntVid {
643    type Value = IntVarValue;
644    #[inline] // make this function eligible for inlining - it is quite hot.
645    fn index(&self) -> u32 {
646        self.as_u32()
647    }
648    #[inline]
649    fn from_index(i: u32) -> IntVid {
650        IntVid::from_u32(i)
651    }
652    fn tag() -> &'static str {
653        "IntVid"
654    }
655}
656
657impl UnifyValue for FloatVarValue {
658    type Error = NoError;
659
660    fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
661        match (*value1, *value2) {
662            (FloatVarValue::Unknown, FloatVarValue::Unknown) => Ok(FloatVarValue::Unknown),
663            (FloatVarValue::Unknown, FloatVarValue::Known(known))
664            | (FloatVarValue::Known(known), FloatVarValue::Unknown) => {
665                Ok(FloatVarValue::Known(known))
666            }
667            (FloatVarValue::Known(_), FloatVarValue::Known(_)) => {
668                {
    ::core::panicking::panic_fmt(format_args!("differing floats should have been resolved first"));
}panic!("differing floats should have been resolved first")
669            }
670        }
671    }
672}
673
674impl UnifyKey for FloatVid {
675    type Value = FloatVarValue;
676    #[inline]
677    fn index(&self) -> u32 {
678        self.as_u32()
679    }
680    #[inline]
681    fn from_index(i: u32) -> FloatVid {
682        FloatVid::from_u32(i)
683    }
684    fn tag() -> &'static str {
685        "FloatVid"
686    }
687}
688
689#[cfg(feature = "nightly")]
690impl<CTX> HashStable<CTX> for InferTy {
691    fn hash_stable(&self, ctx: &mut CTX, hasher: &mut StableHasher) {
692        use InferTy::*;
693        std::mem::discriminant(self).hash_stable(ctx, hasher);
694        match self {
695            TyVar(_) | IntVar(_) | FloatVar(_) => {
696                {
    ::core::panicking::panic_fmt(format_args!("type variables should not be hashed: {0:?}",
            self));
}panic!("type variables should not be hashed: {self:?}")
697            }
698            FreshTy(v) | FreshIntTy(v) | FreshFloatTy(v) => v.hash_stable(ctx, hasher),
699        }
700    }
701}
702
703impl fmt::Display for InferTy {
704    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
705        use InferTy::*;
706        match *self {
707            TyVar(_) => f.write_fmt(format_args!("_"))write!(f, "_"),
708            IntVar(_) => f.write_fmt(format_args!("{0}", "{integer}"))write!(f, "{}", "{integer}"),
709            FloatVar(_) => f.write_fmt(format_args!("{0}", "{float}"))write!(f, "{}", "{float}"),
710            FreshTy(v) => f.write_fmt(format_args!("FreshTy({0})", v))write!(f, "FreshTy({v})"),
711            FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0})", v))write!(f, "FreshIntTy({v})"),
712            FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0})", v))write!(f, "FreshFloatTy({v})"),
713        }
714    }
715}
716
717impl fmt::Debug for InferTy {
718    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
719        use InferTy::*;
720        match *self {
721            TyVar(ref v) => v.fmt(f),
722            IntVar(ref v) => v.fmt(f),
723            FloatVar(ref v) => v.fmt(f),
724            FreshTy(v) => f.write_fmt(format_args!("FreshTy({0:?})", v))write!(f, "FreshTy({v:?})"),
725            FreshIntTy(v) => f.write_fmt(format_args!("FreshIntTy({0:?})", v))write!(f, "FreshIntTy({v:?})"),
726            FreshFloatTy(v) => f.write_fmt(format_args!("FreshFloatTy({0:?})", v))write!(f, "FreshFloatTy({v:?})"),
727        }
728    }
729}
730
731#[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)]
732#[cfg_attr(
733    feature = "nightly",
734    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) {
                match *self {
                    TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1 }
                        => {
                        ::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, __CTX>
            ::rustc_data_structures::stable_hasher::HashStable<__CTX> for
            TypeAndMut<I> where
            I::Ty: ::rustc_data_structures::stable_hasher::HashStable<__CTX> {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    TypeAndMut { ty: ref __binding_0, mutbl: ref __binding_1 }
                        => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
735)]
736#[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, 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)]
737pub struct TypeAndMut<I: Interner> {
738    pub ty: I::Ty,
739    pub mutbl: Mutability,
740}
741
742impl<I: Interner> Eq for TypeAndMut<I> {}
743
744#[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,
                c_variadic: ref __field_c_variadic,
                safety: ref __field_safety,
                abi: ref __field_abi } => {
                ::core::hash::Hash::hash(__field_inputs_and_output, __state);
                ::core::hash::Hash::hash(__field_c_variadic, __state);
                ::core::hash::Hash::hash(__field_safety, __state);
                ::core::hash::Hash::hash(__field_abi, __state);
            }
        }
    }
}#[derive_where(Clone, Copy, PartialEq, Hash; I: Interner)]
745#[cfg_attr(
746    feature = "nightly",
747    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for FnSig<I> where
            I::Tys: ::rustc_serialize::Encodable<__E>,
            I::Safety: ::rustc_serialize::Encodable<__E>,
            I::Abi: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    FnSig {
                        inputs_and_output: ref __binding_0,
                        c_variadic: ref __binding_1,
                        safety: ref __binding_2,
                        abi: ref __binding_3 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                            __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>,
            I::Safety: ::rustc_serialize::Decodable<__D>,
            I::Abi: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                FnSig {
                    inputs_and_output: ::rustc_serialize::Decodable::decode(__decoder),
                    c_variadic: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    abi: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __CTX>
            ::rustc_data_structures::stable_hasher::HashStable<__CTX> for
            FnSig<I> where
            I::Tys: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::Safety: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::Abi: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    FnSig {
                        inputs_and_output: ref __binding_0,
                        c_variadic: ref __binding_1,
                        safety: ref __binding_2,
                        abi: ref __binding_3 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                        { __binding_3.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
748)]
749#[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,
                        c_variadic: 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, 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,
                            c_variadic: __binding_1,
                            safety: __binding_2,
                            abi: __binding_3 } => {
                            FnSig {
                                inputs_and_output: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                c_variadic: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                safety: __binding_2,
                                abi: __binding_3,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    FnSig {
                        inputs_and_output: __binding_0,
                        c_variadic: __binding_1,
                        safety: __binding_2,
                        abi: __binding_3 } => {
                        FnSig {
                            inputs_and_output: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            c_variadic: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            safety: __binding_2,
                            abi: __binding_3,
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnSig<I> where
            I: Interner, J: Interner,
            I::Tys: ::rustc_type_ir::lift::Lift<J, Lifted = J::Tys>,
            bool: ::rustc_type_ir::lift::Lift<J, Lifted = bool>,
            I::Safety: ::rustc_type_ir::lift::Lift<J, Lifted = J::Safety>,
            I::Abi: ::rustc_type_ir::lift::Lift<J, Lifted = J::Abi> {
            type Lifted = FnSig<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        FnSig {
                            inputs_and_output: __binding_0,
                            c_variadic: __binding_1,
                            safety: __binding_2,
                            abi: __binding_3 } => {
                            FnSig {
                                inputs_and_output: __binding_0.lift_to_interner(interner)?,
                                c_variadic: __binding_1.lift_to_interner(interner)?,
                                safety: __binding_2.lift_to_interner(interner)?,
                                abi: __binding_3.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
750pub struct FnSig<I: Interner> {
751    pub inputs_and_output: I::Tys,
752    pub c_variadic: bool,
753    #[type_visitable(ignore)]
754    #[type_foldable(identity)]
755    pub safety: I::Safety,
756    #[type_visitable(ignore)]
757    #[type_foldable(identity)]
758    pub abi: I::Abi,
759}
760
761impl<I: Interner> Eq for FnSig<I> {}
762
763impl<I: Interner> FnSig<I> {
764    pub fn inputs(self) -> I::FnInputTys {
765        self.inputs_and_output.inputs()
766    }
767
768    pub fn output(self) -> I::Ty {
769        self.inputs_and_output.output()
770    }
771
772    pub fn is_fn_trait_compatible(self) -> bool {
773        let FnSig { safety, abi, c_variadic, .. } = self;
774        !c_variadic && safety.is_safe() && abi.is_rust()
775    }
776}
777
778impl<I: Interner> ty::Binder<I, FnSig<I>> {
779    #[inline]
780    pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
781        self.map_bound(|fn_sig| fn_sig.inputs())
782    }
783
784    #[inline]
785    #[track_caller]
786    pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
787        self.map_bound(|fn_sig| fn_sig.inputs().get(index).unwrap())
788    }
789
790    pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
791        self.map_bound(|fn_sig| fn_sig.inputs_and_output)
792    }
793
794    #[inline]
795    pub fn output(self) -> ty::Binder<I, I::Ty> {
796        self.map_bound(|fn_sig| fn_sig.output())
797    }
798
799    pub fn c_variadic(self) -> bool {
800        self.skip_binder().c_variadic
801    }
802
803    pub fn safety(self) -> I::Safety {
804        self.skip_binder().safety
805    }
806
807    pub fn abi(self) -> I::Abi {
808        self.skip_binder().abi
809    }
810
811    pub fn is_fn_trait_compatible(&self) -> bool {
812        self.skip_binder().is_fn_trait_compatible()
813    }
814
815    // Used to split a single value into the two fields in `TyKind::FnPtr`.
816    pub fn split(self) -> (ty::Binder<I, FnSigTys<I>>, FnHeader<I>) {
817        let hdr =
818            FnHeader { c_variadic: self.c_variadic(), safety: self.safety(), abi: self.abi() };
819        (self.map_bound(|sig| FnSigTys { inputs_and_output: sig.inputs_and_output }), hdr)
820    }
821}
822
823impl<I: Interner> fmt::Debug for FnSig<I> {
824    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
825        let sig = self;
826        let FnSig { inputs_and_output: _, c_variadic, safety, abi } = sig;
827
828        f.write_fmt(format_args!("{0}", safety.prefix_str()))write!(f, "{}", safety.prefix_str())?;
829        if !abi.is_rust() {
830            f.write_fmt(format_args!("extern \"{0:?}\" ", abi))write!(f, "extern \"{abi:?}\" ")?;
831        }
832
833        f.write_fmt(format_args!("fn("))write!(f, "fn(")?;
834        let inputs = sig.inputs();
835        for (i, ty) in inputs.iter().enumerate() {
836            if i > 0 {
837                f.write_fmt(format_args!(", "))write!(f, ", ")?;
838            }
839            f.write_fmt(format_args!("{0:?}", ty))write!(f, "{ty:?}")?;
840        }
841        if *c_variadic {
842            if inputs.is_empty() {
843                f.write_fmt(format_args!("..."))write!(f, "...")?;
844            } else {
845                f.write_fmt(format_args!(", ..."))write!(f, ", ...")?;
846            }
847        }
848        f.write_fmt(format_args!(")"))write!(f, ")")?;
849
850        let output = sig.output();
851        match output.kind() {
852            Tuple(list) if list.is_empty() => Ok(()),
853            _ => f.write_fmt(format_args!(" -> {0:?}", sig.output()))write!(f, " -> {:?}", sig.output()),
854        }
855    }
856}
857
858// FIXME: this is a distinct type because we need to define `Encode`/`Decode`
859// impls in this crate for `Binder<I, I::Ty>`.
860#[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)]
861#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<I: Interner, __CTX>
            ::rustc_data_structures::stable_hasher::HashStable<__CTX> for
            UnsafeBinderInner<I> where
            ty::Binder<I,
            I::Ty>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    UnsafeBinderInner(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext))]
862#[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, 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 I: Interner, J: Interner,
            ty::Binder<I,
            I::Ty>: ::rustc_type_ir::lift::Lift<J, Lifted =
            ty::Binder<J, J::Ty>> {
            type Lifted = UnsafeBinderInner<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        UnsafeBinderInner(__binding_0) => {
                            UnsafeBinderInner(__binding_0.lift_to_interner(interner)?)
                        }
                    })
            }
        }
    };Lift_Generic)]
863pub struct UnsafeBinderInner<I: Interner>(ty::Binder<I, I::Ty>);
864
865impl<I: Interner> Eq for UnsafeBinderInner<I> {}
866
867impl<I: Interner> From<ty::Binder<I, I::Ty>> for UnsafeBinderInner<I> {
868    fn from(value: ty::Binder<I, I::Ty>) -> Self {
869        UnsafeBinderInner(value)
870    }
871}
872
873impl<I: Interner> From<UnsafeBinderInner<I>> for ty::Binder<I, I::Ty> {
874    fn from(value: UnsafeBinderInner<I>) -> Self {
875        value.0
876    }
877}
878
879impl<I: Interner> fmt::Debug for UnsafeBinderInner<I> {
880    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
881        self.0.fmt(f)
882    }
883}
884
885impl<I: Interner> Deref for UnsafeBinderInner<I> {
886    type Target = ty::Binder<I, I::Ty>;
887
888    fn deref(&self) -> &Self::Target {
889        &self.0
890    }
891}
892
893#[cfg(feature = "nightly")]
894impl<I: Interner, E: rustc_serialize::Encoder> rustc_serialize::Encodable<E>
895    for UnsafeBinderInner<I>
896where
897    I::Ty: rustc_serialize::Encodable<E>,
898    I::BoundVarKinds: rustc_serialize::Encodable<E>,
899{
900    fn encode(&self, e: &mut E) {
901        self.bound_vars().encode(e);
902        self.as_ref().skip_binder().encode(e);
903    }
904}
905
906#[cfg(feature = "nightly")]
907impl<I: Interner, D: rustc_serialize::Decoder> rustc_serialize::Decodable<D>
908    for UnsafeBinderInner<I>
909where
910    I::Ty: TypeVisitable<I> + rustc_serialize::Decodable<D>,
911    I::BoundVarKinds: rustc_serialize::Decodable<D>,
912{
913    fn decode(decoder: &mut D) -> Self {
914        let bound_vars = rustc_serialize::Decodable::decode(decoder);
915        UnsafeBinderInner(ty::Binder::bind_with_vars(
916            rustc_serialize::Decodable::decode(decoder),
917            bound_vars,
918        ))
919    }
920}
921
922// This is just a `FnSig` without the `FnHeader` fields.
923#[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)]
924#[cfg_attr(
925    feature = "nightly",
926    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) {
                match *self {
                    FnSigTys { inputs_and_output: 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 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, __CTX>
            ::rustc_data_structures::stable_hasher::HashStable<__CTX> for
            FnSigTys<I> where
            I::Tys: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    FnSigTys { inputs_and_output: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
927)]
928#[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, 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 I: Interner, J: Interner,
            I::Tys: ::rustc_type_ir::lift::Lift<J, Lifted = J::Tys> {
            type Lifted = FnSigTys<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        FnSigTys { inputs_and_output: __binding_0 } => {
                            FnSigTys {
                                inputs_and_output: __binding_0.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
929pub struct FnSigTys<I: Interner> {
930    pub inputs_and_output: I::Tys,
931}
932
933impl<I: Interner> Eq for FnSigTys<I> {}
934
935impl<I: Interner> FnSigTys<I> {
936    pub fn inputs(self) -> I::FnInputTys {
937        self.inputs_and_output.inputs()
938    }
939
940    pub fn output(self) -> I::Ty {
941        self.inputs_and_output.output()
942    }
943}
944
945impl<I: Interner> ty::Binder<I, FnSigTys<I>> {
946    // Used to combine the two fields in `TyKind::FnPtr` into a single value.
947    pub fn with(self, hdr: FnHeader<I>) -> ty::Binder<I, FnSig<I>> {
948        self.map_bound(|sig_tys| FnSig {
949            inputs_and_output: sig_tys.inputs_and_output,
950            c_variadic: hdr.c_variadic,
951            safety: hdr.safety,
952            abi: hdr.abi,
953        })
954    }
955
956    #[inline]
957    pub fn inputs(self) -> ty::Binder<I, I::FnInputTys> {
958        self.map_bound(|sig_tys| sig_tys.inputs())
959    }
960
961    #[inline]
962    #[track_caller]
963    pub fn input(self, index: usize) -> ty::Binder<I, I::Ty> {
964        self.map_bound(|sig_tys| sig_tys.inputs().get(index).unwrap())
965    }
966
967    pub fn inputs_and_output(self) -> ty::Binder<I, I::Tys> {
968        self.map_bound(|sig_tys| sig_tys.inputs_and_output)
969    }
970
971    #[inline]
972    pub fn output(self) -> ty::Binder<I, I::Ty> {
973        self.map_bound(|sig_tys| sig_tys.output())
974    }
975}
976
977#[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 {
                c_variadic: ref __field_c_variadic,
                safety: ref __field_safety,
                abi: ref __field_abi } => {
                ::core::hash::Hash::hash(__field_c_variadic, __state);
                ::core::hash::Hash::hash(__field_safety, __state);
                ::core::hash::Hash::hash(__field_abi, __state);
            }
        }
    }
}#[derive_where(Clone, Copy, Debug, PartialEq, Hash; I: Interner)]
978#[cfg_attr(
979    feature = "nightly",
980    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for FnHeader<I> where
            I::Safety: ::rustc_serialize::Encodable<__E>,
            I::Abi: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    FnHeader {
                        c_variadic: ref __binding_0,
                        safety: ref __binding_1,
                        abi: 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);
                    }
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for FnHeader<I> where
            I::Safety: ::rustc_serialize::Decodable<__D>,
            I::Abi: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                FnHeader {
                    c_variadic: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    abi: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __CTX>
            ::rustc_data_structures::stable_hasher::HashStable<__CTX> for
            FnHeader<I> where
            I::Safety: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::Abi: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    FnHeader {
                        c_variadic: ref __binding_0,
                        safety: ref __binding_1,
                        abi: ref __binding_2 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
981)]
982#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for FnHeader<I>
            where I: Interner, I::Safety: ::rustc_type_ir::TypeVisitable<I>,
            I::Abi: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnHeader {
                        c_variadic: ref __binding_0,
                        safety: ref __binding_1,
                        abi: ref __binding_2 } => {
                        {
                            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);
                                }
                            }
                        }
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_2,
                                        __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, GenericTypeVisitable, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for FnHeader<I>
            where I: Interner, I::Safety: ::rustc_type_ir::TypeFoldable<I>,
            I::Abi: ::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 {
                        FnHeader {
                            c_variadic: __binding_0,
                            safety: __binding_1,
                            abi: __binding_2 } => {
                            FnHeader {
                                c_variadic: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                safety: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                abi: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    FnHeader {
                        c_variadic: __binding_0,
                        safety: __binding_1,
                        abi: __binding_2 } => {
                        FnHeader {
                            c_variadic: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            safety: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            abi: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for FnHeader<I>
            where I: Interner, J: Interner,
            bool: ::rustc_type_ir::lift::Lift<J, Lifted = bool>,
            I::Safety: ::rustc_type_ir::lift::Lift<J, Lifted = J::Safety>,
            I::Abi: ::rustc_type_ir::lift::Lift<J, Lifted = J::Abi> {
            type Lifted = FnHeader<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        FnHeader {
                            c_variadic: __binding_0,
                            safety: __binding_1,
                            abi: __binding_2 } => {
                            FnHeader {
                                c_variadic: __binding_0.lift_to_interner(interner)?,
                                safety: __binding_1.lift_to_interner(interner)?,
                                abi: __binding_2.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
983pub struct FnHeader<I: Interner> {
984    pub c_variadic: bool,
985    pub safety: I::Safety,
986    pub abi: I::Abi,
987}
988
989impl<I: Interner> Eq for FnHeader<I> {}
990
991#[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)]
992#[cfg_attr(
993    feature = "nightly",
994    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) {
                match *self {
                    CoroutineWitnessTypes {
                        types: ref __binding_0, assumptions: ref __binding_1 } => {
                        ::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, __CTX>
            ::rustc_data_structures::stable_hasher::HashStable<__CTX> for
            CoroutineWitnessTypes<I> where
            I::Tys: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
            I::RegionAssumptions: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    CoroutineWitnessTypes {
                        types: ref __binding_0, assumptions: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
995)]
996#[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, 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 I: Interner, J: Interner,
            I::Tys: ::rustc_type_ir::lift::Lift<J, Lifted = J::Tys>,
            I::RegionAssumptions: ::rustc_type_ir::lift::Lift<J, Lifted =
            J::RegionAssumptions> {
            type Lifted = CoroutineWitnessTypes<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(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)]
997pub struct CoroutineWitnessTypes<I: Interner> {
998    pub types: I::Tys,
999    pub assumptions: I::RegionAssumptions,
1000}
1001
1002impl<I: Interner> Eq for CoroutineWitnessTypes<I> {}