Skip to main content

rustc_type_ir/
predicate.rs

1use std::hash::Hash;
2use std::{fmt, iter};
3
4use derive_where::derive_where;
5#[cfg(feature = "nightly")]
6use rustc_macros::{Decodable_NoContext, Encodable_NoContext, HashStable, HashStable_NoContext};
7use rustc_type_ir_macros::{
8    GenericTypeVisitable, Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic,
9};
10
11use crate::inherent::*;
12use crate::lift::Lift;
13use crate::upcast::{Upcast, UpcastFrom};
14use crate::visit::TypeVisitableExt as _;
15use crate::{self as ty, AliasTyKind, Interner};
16
17/// `A: 'region`
18#[automatically_derived]
impl<I: Interner, A> ::core::marker::Copy for OutlivesPredicate<I, A> where
    I: Interner, A: Copy {
}#[derive_where(Clone, Hash, PartialEq, Debug; I: Interner, A)]
19#[derive_where(Copy; I: Interner, A: Copy)]
20#[derive(const _: () =
    {
        impl<I: Interner, A> ::rustc_type_ir::TypeVisitable<I> for
            OutlivesPredicate<I, A> where I: Interner,
            A: ::rustc_type_ir::TypeVisitable<I>,
            I::Region: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    OutlivesPredicate(ref __binding_0, 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, A> ::rustc_type_ir::TypeFoldable<I> for
            OutlivesPredicate<I, A> where I: Interner,
            A: ::rustc_type_ir::TypeFoldable<I>,
            I::Region: ::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 {
                        OutlivesPredicate(__binding_0, __binding_1) => {
                            OutlivesPredicate(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::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 {
                    OutlivesPredicate(__binding_0, __binding_1) => {
                        OutlivesPredicate(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable_Generic)]
21#[cfg_attr(
22    feature = "nightly",
23    derive(const _: () =
    {
        impl<I: Interner, A, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for OutlivesPredicate<I, A>
            where A: ::rustc_serialize::Decodable<__D>,
            I::Region: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                OutlivesPredicate(::rustc_serialize::Decodable::decode(__decoder),
                    ::rustc_serialize::Decodable::decode(__decoder))
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, A, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for OutlivesPredicate<I, A>
            where A: ::rustc_serialize::Encodable<__E>,
            I::Region: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    OutlivesPredicate(ref __binding_0, 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, A>
            ::rustc_data_structures::stable_hasher::HashStable for
            OutlivesPredicate<I, A> where
            A: ::rustc_data_structures::stable_hasher::HashStable,
            I::Region: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    OutlivesPredicate(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
24)]
25pub struct OutlivesPredicate<I: Interner, A>(pub A, pub I::Region);
26
27impl<I: Interner, A: Eq> Eq for OutlivesPredicate<I, A> {}
28
29// FIXME: We manually derive `Lift` because the `derive(Lift_Generic)` doesn't
30// understand how to turn `A` to `A::Lifted` in the output `type Lifted`.
31impl<I: Interner, U: Interner, A> Lift<U> for OutlivesPredicate<I, A>
32where
33    A: Lift<U>,
34    I::Region: Lift<U, Lifted = U::Region>,
35{
36    type Lifted = OutlivesPredicate<U, A::Lifted>;
37
38    fn lift_to_interner(self, cx: U) -> Option<Self::Lifted> {
39        Some(OutlivesPredicate(self.0.lift_to_interner(cx)?, self.1.lift_to_interner(cx)?))
40    }
41}
42
43/// `'a == 'b`.
44/// For the rationale behind having this instead of a pair of bidirectional
45/// `'a: 'b` and `'b: 'a`, see
46/// [this discusstion on Zulip](https://rust-lang.zulipchat.com/#narrow/channel/364551-t-types.2Ftrait-system-refactor/topic/A.20question.20on.20.23251/near/584167074).
47#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for RegionEqPredicate<I> where
    I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            RegionEqPredicate(ref __field_0, ref __field_1) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f,
                        "RegionEqPredicate");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::field(&mut __builder, __field_1);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Eq, Debug; I: Interner)]
48#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            RegionEqPredicate<I> where I: Interner,
            I::Region: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    RegionEqPredicate(ref __binding_0, 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
            RegionEqPredicate<I> where I: Interner,
            I::Region: ::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 {
                        RegionEqPredicate(__binding_0, __binding_1) => {
                            RegionEqPredicate(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::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 {
                    RegionEqPredicate(__binding_0, __binding_1) => {
                        RegionEqPredicate(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            RegionEqPredicate<I> where I: Interner, J: Interner,
            I::Region: ::rustc_type_ir::lift::Lift<J, Lifted = J::Region>,
            I::Region: ::rustc_type_ir::lift::Lift<J, Lifted = J::Region> {
            type Lifted = RegionEqPredicate<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        RegionEqPredicate(__binding_0, __binding_1) => {
                            RegionEqPredicate(__binding_0.lift_to_interner(interner)?,
                                __binding_1.lift_to_interner(interner)?)
                        }
                    })
            }
        }
    };Lift_Generic)]
49#[cfg_attr(
50    feature = "nightly",
51    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for RegionEqPredicate<I> where
            I::Region: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                RegionEqPredicate(::rustc_serialize::Decodable::decode(__decoder),
                    ::rustc_serialize::Decodable::decode(__decoder))
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for RegionEqPredicate<I> where
            I::Region: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    RegionEqPredicate(ref __binding_0, 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> ::rustc_data_structures::stable_hasher::HashStable
            for RegionEqPredicate<I> where
            I::Region: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    RegionEqPredicate(ref __binding_0, ref __binding_1) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
52)]
53pub struct RegionEqPredicate<I: Interner>(pub I::Region, pub I::Region);
54
55impl<I: Interner> RegionEqPredicate<I> {
56    /// Decompose `'a == 'b` into `['a: 'b, 'b: 'a]`
57    pub fn into_bidirectional_outlives(self) -> [OutlivesPredicate<I, I::GenericArg>; 2] {
58        [OutlivesPredicate(self.0.into(), self.1), OutlivesPredicate(self.1.into(), self.0)]
59    }
60}
61
62#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for RegionConstraint<I> where I: Interner
    {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            RegionConstraint::Outlives(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "Outlives");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            RegionConstraint::Eq(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "Eq");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Eq, Debug; I: Interner)]
63#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            RegionConstraint<I> where I: Interner,
            OutlivesPredicate<I,
            I::GenericArg>: ::rustc_type_ir::TypeVisitable<I>,
            RegionEqPredicate<I>: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    RegionConstraint::Outlives(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);
                                }
                            }
                        }
                    }
                    RegionConstraint::Eq(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
            RegionConstraint<I> where I: Interner,
            OutlivesPredicate<I,
            I::GenericArg>: ::rustc_type_ir::TypeFoldable<I>,
            RegionEqPredicate<I>: ::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 {
                        RegionConstraint::Outlives(__binding_0) => {
                            RegionConstraint::Outlives(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        RegionConstraint::Eq(__binding_0) => {
                            RegionConstraint::Eq(::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 {
                    RegionConstraint::Outlives(__binding_0) => {
                        RegionConstraint::Outlives(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    RegionConstraint::Eq(__binding_0) => {
                        RegionConstraint::Eq(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            RegionConstraint<I> where I: Interner, J: Interner,
            OutlivesPredicate<I,
            I::GenericArg>: ::rustc_type_ir::lift::Lift<J, Lifted =
            OutlivesPredicate<J, J::GenericArg>>,
            RegionEqPredicate<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
            RegionEqPredicate<J>> {
            type Lifted = RegionConstraint<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        RegionConstraint::Outlives(__binding_0) => {
                            RegionConstraint::Outlives(__binding_0.lift_to_interner(interner)?)
                        }
                        RegionConstraint::Eq(__binding_0) => {
                            RegionConstraint::Eq(__binding_0.lift_to_interner(interner)?)
                        }
                    })
            }
        }
    };Lift_Generic)]
64#[cfg_attr(
65    feature = "nightly",
66    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for RegionConstraint<I> where
            OutlivesPredicate<I,
            I::GenericArg>: ::rustc_serialize::Decodable<__D>,
            RegionEqPredicate<I>: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        RegionConstraint::Outlives(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        RegionConstraint::Eq(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RegionConstraint`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for RegionConstraint<I> where
            OutlivesPredicate<I,
            I::GenericArg>: ::rustc_serialize::Encodable<__E>,
            RegionEqPredicate<I>: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RegionConstraint::Outlives(ref __binding_0) => { 0usize }
                        RegionConstraint::Eq(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    RegionConstraint::Outlives(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    RegionConstraint::Eq(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hasher::HashStable
            for RegionConstraint<I> where
            OutlivesPredicate<I,
            I::GenericArg>: ::rustc_data_structures::stable_hasher::HashStable,
            RegionEqPredicate<I>: ::rustc_data_structures::stable_hasher::HashStable
            {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    RegionConstraint::Outlives(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    RegionConstraint::Eq(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
67)]
68pub enum RegionConstraint<I: Interner> {
69    Outlives(OutlivesPredicate<I, I::GenericArg>),
70    Eq(RegionEqPredicate<I>),
71}
72
73impl<I: Interner> From<OutlivesPredicate<I, I::GenericArg>> for RegionConstraint<I> {
74    fn from(value: OutlivesPredicate<I, I::GenericArg>) -> Self {
75        RegionConstraint::Outlives(value)
76    }
77}
78
79impl<I: Interner> From<RegionEqPredicate<I>> for RegionConstraint<I> {
80    fn from(value: RegionEqPredicate<I>) -> Self {
81        RegionConstraint::Eq(value)
82    }
83}
84
85impl<I: Interner> RegionConstraint<I> {
86    /// Whether the given constraint is either `'a: 'a` or `'a == 'a`.
87    pub fn is_trivial(self) -> bool {
88        match self {
89            RegionConstraint::Outlives(outlives) => {
90                outlives.0.as_region().is_some_and(|re| re == outlives.1)
91            }
92            RegionConstraint::Eq(eq) => eq.0 == eq.1,
93        }
94    }
95
96    /// If `self` is an eq constraint, iterate through its decomposed bidirectional outlives
97    /// bounds and if not, just iterate once for the outlives bound itself.
98    pub fn iter_outlives(self) -> impl Iterator<Item = OutlivesPredicate<I, I::GenericArg>> {
99        match self {
100            RegionConstraint::Outlives(outlives) => iter::once(outlives).chain(None),
101            RegionConstraint::Eq(eq) => {
102                let [outlives1, outlives2] = eq.into_bidirectional_outlives();
103                iter::once(outlives1).chain(Some(outlives2))
104            }
105        }
106    }
107}
108
109/// A complete reference to a trait.
110///
111/// These take numerous guises in syntax,
112/// but perhaps the most recognizable form is in a where-clause:
113/// ```ignore (illustrative)
114/// T: Foo<U>
115/// ```
116/// This would be represented by a trait-reference where the `DefId` is the
117/// `DefId` for the trait `Foo` and the args define `T` as parameter 0,
118/// and `U` as parameter 1.
119///
120/// Trait references also appear in object types like `Foo<U>`, but in
121/// that case the `Self` parameter is absent from the generic parameters.
122#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for TraitRef<I> where I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (TraitRef {
                def_id: ref __field_def_id,
                args: ref __field_args,
                _use_trait_ref_new_instead: ref __field__use_trait_ref_new_instead
                }, TraitRef {
                def_id: ref __other_field_def_id,
                args: ref __other_field_args,
                _use_trait_ref_new_instead: ref __other_field__use_trait_ref_new_instead
                }) =>
                true &&
                            ::core::cmp::PartialEq::eq(__field_def_id,
                                __other_field_def_id) &&
                        ::core::cmp::PartialEq::eq(__field_args, __other_field_args)
                    &&
                    ::core::cmp::PartialEq::eq(__field__use_trait_ref_new_instead,
                        __other_field__use_trait_ref_new_instead),
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq; I: Interner)]
123#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for TraitRef<I>
            where I: Interner, I::TraitId: ::rustc_type_ir::TypeVisitable<I>,
            I::GenericArgs: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitRef {
                        def_id: ref __binding_0,
                        args: ref __binding_1,
                        _use_trait_ref_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 TraitRef<I>
            where I: Interner, I::TraitId: ::rustc_type_ir::TypeFoldable<I>,
            I::GenericArgs: ::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 {
                        TraitRef {
                            def_id: __binding_0,
                            args: __binding_1,
                            _use_trait_ref_new_instead: __binding_2 } => {
                            TraitRef {
                                def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                args: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                _use_trait_ref_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 {
                    TraitRef {
                        def_id: __binding_0,
                        args: __binding_1,
                        _use_trait_ref_new_instead: __binding_2 } => {
                        TraitRef {
                            def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            args: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            _use_trait_ref_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 TraitRef<I>
            where I: Interner, J: Interner,
            I::TraitId: ::rustc_type_ir::lift::Lift<J, Lifted = J::TraitId>,
            I::GenericArgs: ::rustc_type_ir::lift::Lift<J, Lifted =
            J::GenericArgs>, (): ::rustc_type_ir::lift::Lift<J, Lifted = ()> {
            type Lifted = TraitRef<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        TraitRef {
                            def_id: __binding_0,
                            args: __binding_1,
                            _use_trait_ref_new_instead: __binding_2 } => {
                            TraitRef {
                                def_id: __binding_0.lift_to_interner(interner)?,
                                args: __binding_1.lift_to_interner(interner)?,
                                _use_trait_ref_new_instead: __binding_2.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
124#[cfg_attr(
125    feature = "nightly",
126    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for TraitRef<I> where
            I::TraitId: ::rustc_serialize::Decodable<__D>,
            I::GenericArgs: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                TraitRef {
                    def_id: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                    _use_trait_ref_new_instead: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for TraitRef<I> where
            I::TraitId: ::rustc_serialize::Encodable<__E>,
            I::GenericArgs: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    TraitRef {
                        def_id: ref __binding_0,
                        args: ref __binding_1,
                        _use_trait_ref_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> ::rustc_data_structures::stable_hasher::HashStable
            for TraitRef<I> where
            I::TraitId: ::rustc_data_structures::stable_hasher::HashStable,
            I::GenericArgs: ::rustc_data_structures::stable_hasher::HashStable
            {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    TraitRef {
                        def_id: ref __binding_0,
                        args: ref __binding_1,
                        _use_trait_ref_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)
127)]
128pub struct TraitRef<I: Interner> {
129    pub def_id: I::TraitId,
130    pub args: I::GenericArgs,
131    /// This field exists to prevent the creation of `TraitRef` without
132    /// calling [`TraitRef::new_from_args`].
133    _use_trait_ref_new_instead: (),
134}
135
136impl<I: Interner> Eq for TraitRef<I> {}
137
138impl<I: Interner> TraitRef<I> {
139    pub fn new_from_args(interner: I, trait_def_id: I::TraitId, args: I::GenericArgs) -> Self {
140        interner.debug_assert_args_compatible(trait_def_id.into(), args);
141        Self { def_id: trait_def_id, args, _use_trait_ref_new_instead: () }
142    }
143
144    pub fn new(
145        interner: I,
146        trait_def_id: I::TraitId,
147        args: impl IntoIterator<Item: Into<I::GenericArg>>,
148    ) -> Self {
149        let args = interner.mk_args_from_iter(args.into_iter().map(Into::into));
150        Self::new_from_args(interner, trait_def_id, args)
151    }
152
153    pub fn from_assoc(interner: I, trait_id: I::TraitId, args: I::GenericArgs) -> TraitRef<I> {
154        let generics = interner.generics_of(trait_id.into());
155        TraitRef::new(interner, trait_id, args.iter().take(generics.count()))
156    }
157
158    /// Returns a `TraitRef` of the form `P0: Foo<P1..Pn>` where `Pi`
159    /// are the parameters defined on trait.
160    pub fn identity(interner: I, def_id: I::TraitId) -> TraitRef<I> {
161        TraitRef::new_from_args(
162            interner,
163            def_id,
164            I::GenericArgs::identity_for_item(interner, def_id.into()),
165        )
166    }
167
168    pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> Self {
169        TraitRef::new(
170            interner,
171            self.def_id,
172            [self_ty.into()].into_iter().chain(self.args.iter().skip(1)),
173        )
174    }
175
176    #[inline]
177    pub fn self_ty(&self) -> I::Ty {
178        self.args.type_at(0)
179    }
180}
181
182impl<I: Interner> ty::Binder<I, TraitRef<I>> {
183    pub fn self_ty(&self) -> ty::Binder<I, I::Ty> {
184        self.map_bound_ref(|tr| tr.self_ty())
185    }
186
187    pub fn def_id(&self) -> I::TraitId {
188        self.skip_binder().def_id
189    }
190
191    pub fn to_host_effect_clause(self, cx: I, constness: BoundConstness) -> I::Clause {
192        self.map_bound(|trait_ref| {
193            ty::ClauseKind::HostEffect(HostEffectPredicate { trait_ref, constness })
194        })
195        .upcast(cx)
196    }
197}
198
199#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for TraitPredicate<I> where
    I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (TraitPredicate {
                trait_ref: ref __field_trait_ref,
                polarity: ref __field_polarity }, TraitPredicate {
                trait_ref: ref __other_field_trait_ref,
                polarity: ref __other_field_polarity }) =>
                true &&
                        ::core::cmp::PartialEq::eq(__field_trait_ref,
                            __other_field_trait_ref) &&
                    ::core::cmp::PartialEq::eq(__field_polarity,
                        __other_field_polarity),
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq; I: Interner)]
200#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            TraitPredicate<I> where I: Interner,
            TraitRef<I>: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitPredicate {
                        trait_ref: ref __binding_0, polarity: 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
            TraitPredicate<I> where I: Interner,
            TraitRef<I>: ::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 {
                        TraitPredicate {
                            trait_ref: __binding_0, polarity: __binding_1 } => {
                            TraitPredicate {
                                trait_ref: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                polarity: ::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 {
                    TraitPredicate {
                        trait_ref: __binding_0, polarity: __binding_1 } => {
                        TraitPredicate {
                            trait_ref: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            polarity: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            TraitPredicate<I> where I: Interner, J: Interner,
            TraitRef<I>: ::rustc_type_ir::lift::Lift<J, Lifted = TraitRef<J>>,
            PredicatePolarity: ::rustc_type_ir::lift::Lift<J, Lifted =
            PredicatePolarity> {
            type Lifted = TraitPredicate<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        TraitPredicate {
                            trait_ref: __binding_0, polarity: __binding_1 } => {
                            TraitPredicate {
                                trait_ref: __binding_0.lift_to_interner(interner)?,
                                polarity: __binding_1.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
201#[cfg_attr(
202    feature = "nightly",
203    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for TraitPredicate<I> where
            TraitRef<I>: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                TraitPredicate {
                    trait_ref: ::rustc_serialize::Decodable::decode(__decoder),
                    polarity: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for TraitPredicate<I> where
            TraitRef<I>: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    TraitPredicate {
                        trait_ref: ref __binding_0, polarity: 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> ::rustc_data_structures::stable_hasher::HashStable
            for TraitPredicate<I> where
            TraitRef<I>: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    TraitPredicate {
                        trait_ref: ref __binding_0, polarity: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
204)]
205pub struct TraitPredicate<I: Interner> {
206    pub trait_ref: TraitRef<I>,
207
208    /// If polarity is Positive: we are proving that the trait is implemented.
209    ///
210    /// If polarity is Negative: we are proving that a negative impl of this trait
211    /// exists. (Note that coherence also checks whether negative impls of supertraits
212    /// exist via a series of predicates.)
213    pub polarity: PredicatePolarity,
214}
215
216impl<I: Interner> Eq for TraitPredicate<I> {}
217
218impl<I: Interner> TraitPredicate<I> {
219    pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> Self {
220        Self {
221            trait_ref: self.trait_ref.with_replaced_self_ty(interner, self_ty),
222            polarity: self.polarity,
223        }
224    }
225
226    pub fn def_id(self) -> I::TraitId {
227        self.trait_ref.def_id
228    }
229
230    pub fn self_ty(self) -> I::Ty {
231        self.trait_ref.self_ty()
232    }
233}
234
235impl<I: Interner> ty::Binder<I, TraitPredicate<I>> {
236    pub fn def_id(self) -> I::TraitId {
237        // Ok to skip binder since trait `DefId` does not care about regions.
238        self.skip_binder().def_id()
239    }
240
241    pub fn self_ty(self) -> ty::Binder<I, I::Ty> {
242        self.map_bound(|trait_ref| trait_ref.self_ty())
243    }
244
245    #[inline]
246    pub fn polarity(self) -> PredicatePolarity {
247        self.skip_binder().polarity
248    }
249}
250
251impl<I: Interner> UpcastFrom<I, TraitRef<I>> for TraitPredicate<I> {
252    fn upcast_from(from: TraitRef<I>, _tcx: I) -> Self {
253        TraitPredicate { trait_ref: from, polarity: PredicatePolarity::Positive }
254    }
255}
256
257impl<I: Interner> UpcastFrom<I, ty::Binder<I, TraitRef<I>>> for ty::Binder<I, TraitPredicate<I>> {
258    fn upcast_from(from: ty::Binder<I, TraitRef<I>>, _tcx: I) -> Self {
259        from.map_bound(|trait_ref| TraitPredicate {
260            trait_ref,
261            polarity: PredicatePolarity::Positive,
262        })
263    }
264}
265
266impl<I: Interner> fmt::Debug for TraitPredicate<I> {
267    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
268        f.write_fmt(format_args!("TraitPredicate({0:?}, polarity:{1:?})",
        self.trait_ref, self.polarity))write!(f, "TraitPredicate({:?}, polarity:{:?})", self.trait_ref, self.polarity)
269    }
270}
271
272#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImplPolarity {
    #[inline]
    fn clone(&self) -> ImplPolarity { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ImplPolarity { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplPolarity {
    #[inline]
    fn eq(&self, other: &ImplPolarity) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplPolarity {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for ImplPolarity {
    #[inline]
    fn partial_cmp(&self, other: &ImplPolarity)
        -> ::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 ImplPolarity {
    #[inline]
    fn cmp(&self, other: &ImplPolarity) -> ::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 ImplPolarity {
    #[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 ImplPolarity {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                ImplPolarity::Positive => "Positive",
                ImplPolarity::Negative => "Negative",
                ImplPolarity::Reservation => "Reservation",
            })
    }
}Debug)]
273#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<__D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for ImplPolarity {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { ImplPolarity::Positive }
                    1usize => { ImplPolarity::Negative }
                    2usize => { ImplPolarity::Reservation }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ImplPolarity`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<__E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for ImplPolarity {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ImplPolarity::Positive => { 0usize }
                        ImplPolarity::Negative => { 1usize }
                        ImplPolarity::Reservation => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative => {}
                    ImplPolarity::Reservation => {}
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            ImplPolarity {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative => {}
                    ImplPolarity::Reservation => {}
                }
            }
        }
    };HashStable))]
274pub enum ImplPolarity {
275    /// `impl Trait for Type`
276    Positive,
277    /// `impl !Trait for Type`
278    Negative,
279    /// `#[rustc_reservation_impl] impl Trait for Type`
280    ///
281    /// This is a "stability hack", not a real Rust feature.
282    /// See #64631 for details.
283    Reservation,
284}
285
286impl fmt::Display for ImplPolarity {
287    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
288        match self {
289            Self::Positive => f.write_str("positive"),
290            Self::Negative => f.write_str("negative"),
291            Self::Reservation => f.write_str("reservation"),
292        }
293    }
294}
295
296impl ImplPolarity {
297    /// The polarity marker in front of the impl trait ref if applicable.
298    pub fn as_str(self) -> &'static str {
299        match self {
300            Self::Positive => "",
301            Self::Negative => "!",
302            Self::Reservation => "",
303        }
304    }
305}
306
307/// Polarity for a trait predicate.
308///
309/// May either be negative or positive.
310/// Distinguished from [`ImplPolarity`] since we never compute goals with
311/// "reservation" level.
312#[derive(#[automatically_derived]
impl ::core::clone::Clone for PredicatePolarity {
    #[inline]
    fn clone(&self) -> PredicatePolarity { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for PredicatePolarity { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for PredicatePolarity {
    #[inline]
    fn eq(&self, other: &PredicatePolarity) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for PredicatePolarity {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for PredicatePolarity {
    #[inline]
    fn partial_cmp(&self, other: &PredicatePolarity)
        -> ::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 PredicatePolarity {
    #[inline]
    fn cmp(&self, other: &PredicatePolarity) -> ::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 PredicatePolarity {
    #[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 PredicatePolarity {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                PredicatePolarity::Positive => "Positive",
                PredicatePolarity::Negative => "Negative",
            })
    }
}Debug)]
313#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<__D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for PredicatePolarity {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { PredicatePolarity::Positive }
                    1usize => { PredicatePolarity::Negative }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PredicatePolarity`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<__E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for PredicatePolarity {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        PredicatePolarity::Positive => { 0usize }
                        PredicatePolarity::Negative => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    PredicatePolarity::Positive => {}
                    PredicatePolarity::Negative => {}
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            PredicatePolarity {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    PredicatePolarity::Positive => {}
                    PredicatePolarity::Negative => {}
                }
            }
        }
    };HashStable))]
314pub enum PredicatePolarity {
315    /// `Type: Trait`
316    Positive,
317    /// `Type: !Trait`
318    Negative,
319}
320
321impl PredicatePolarity {
322    /// Flips polarity by turning `Positive` into `Negative` and `Negative` into `Positive`.
323    pub fn flip(&self) -> PredicatePolarity {
324        match self {
325            PredicatePolarity::Positive => PredicatePolarity::Negative,
326            PredicatePolarity::Negative => PredicatePolarity::Positive,
327        }
328    }
329}
330
331impl fmt::Display for PredicatePolarity {
332    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
333        match self {
334            Self::Positive => f.write_str("positive"),
335            Self::Negative => f.write_str("negative"),
336        }
337    }
338}
339
340#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for ExistentialPredicate<I> where
    I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            ExistentialPredicate::Trait(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "Trait");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            ExistentialPredicate::Projection(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "Projection");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            ExistentialPredicate::AutoTrait(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "AutoTrait");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
341#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            ExistentialPredicate<I> where I: Interner,
            ExistentialTraitRef<I>: ::rustc_type_ir::TypeVisitable<I>,
            ExistentialProjection<I>: ::rustc_type_ir::TypeVisitable<I>,
            I::TraitId: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ExistentialPredicate::Trait(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);
                                }
                            }
                        }
                    }
                    ExistentialPredicate::Projection(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);
                                }
                            }
                        }
                    }
                    ExistentialPredicate::AutoTrait(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
            ExistentialPredicate<I> where I: Interner,
            ExistentialTraitRef<I>: ::rustc_type_ir::TypeFoldable<I>,
            ExistentialProjection<I>: ::rustc_type_ir::TypeFoldable<I>,
            I::TraitId: ::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 {
                        ExistentialPredicate::Trait(__binding_0) => {
                            ExistentialPredicate::Trait(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        ExistentialPredicate::Projection(__binding_0) => {
                            ExistentialPredicate::Projection(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        ExistentialPredicate::AutoTrait(__binding_0) => {
                            ExistentialPredicate::AutoTrait(::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 {
                    ExistentialPredicate::Trait(__binding_0) => {
                        ExistentialPredicate::Trait(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    ExistentialPredicate::Projection(__binding_0) => {
                        ExistentialPredicate::Projection(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    ExistentialPredicate::AutoTrait(__binding_0) => {
                        ExistentialPredicate::AutoTrait(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            ExistentialPredicate<I> where I: Interner, J: Interner,
            ExistentialTraitRef<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
            ExistentialTraitRef<J>>,
            ExistentialProjection<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
            ExistentialProjection<J>>,
            I::TraitId: ::rustc_type_ir::lift::Lift<J, Lifted = J::TraitId> {
            type Lifted = ExistentialPredicate<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        ExistentialPredicate::Trait(__binding_0) => {
                            ExistentialPredicate::Trait(__binding_0.lift_to_interner(interner)?)
                        }
                        ExistentialPredicate::Projection(__binding_0) => {
                            ExistentialPredicate::Projection(__binding_0.lift_to_interner(interner)?)
                        }
                        ExistentialPredicate::AutoTrait(__binding_0) => {
                            ExistentialPredicate::AutoTrait(__binding_0.lift_to_interner(interner)?)
                        }
                    })
            }
        }
    };Lift_Generic)]
342#[cfg_attr(
343    feature = "nightly",
344    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for ExistentialPredicate<I>
            where ExistentialTraitRef<I>: ::rustc_serialize::Decodable<__D>,
            ExistentialProjection<I>: ::rustc_serialize::Decodable<__D>,
            I::TraitId: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        ExistentialPredicate::Trait(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        ExistentialPredicate::Projection(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        ExistentialPredicate::AutoTrait(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ExistentialPredicate`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for ExistentialPredicate<I>
            where ExistentialTraitRef<I>: ::rustc_serialize::Encodable<__E>,
            ExistentialProjection<I>: ::rustc_serialize::Encodable<__E>,
            I::TraitId: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ExistentialPredicate::Trait(ref __binding_0) => { 0usize }
                        ExistentialPredicate::Projection(ref __binding_0) => {
                            1usize
                        }
                        ExistentialPredicate::AutoTrait(ref __binding_0) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ExistentialPredicate::Trait(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExistentialPredicate::Projection(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExistentialPredicate::AutoTrait(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hasher::HashStable
            for ExistentialPredicate<I> where
            ExistentialTraitRef<I>: ::rustc_data_structures::stable_hasher::HashStable,
            ExistentialProjection<I>: ::rustc_data_structures::stable_hasher::HashStable,
            I::TraitId: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    ExistentialPredicate::Trait(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    ExistentialPredicate::Projection(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    ExistentialPredicate::AutoTrait(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
345)]
346pub enum ExistentialPredicate<I: Interner> {
347    /// E.g., `Iterator`.
348    Trait(ExistentialTraitRef<I>),
349    /// E.g., `Iterator::Item = T`.
350    Projection(ExistentialProjection<I>),
351    /// E.g., `Send`.
352    AutoTrait(I::TraitId),
353}
354
355impl<I: Interner> Eq for ExistentialPredicate<I> {}
356
357impl<I: Interner> ty::Binder<I, ExistentialPredicate<I>> {
358    pub fn def_id(&self) -> I::DefId {
359        match self.skip_binder() {
360            ExistentialPredicate::Trait(tr) => tr.def_id.into(),
361            ExistentialPredicate::Projection(p) => p.def_id.into(),
362            ExistentialPredicate::AutoTrait(did) => did.into(),
363        }
364    }
365    /// Given an existential predicate like `?Self: PartialEq<u32>` (e.g., derived from `dyn PartialEq<u32>`),
366    /// and a concrete type `self_ty`, returns a full predicate where the existentially quantified variable `?Self`
367    /// has been replaced with `self_ty` (e.g., `self_ty: PartialEq<u32>`, in our example).
368    pub fn with_self_ty(&self, cx: I, self_ty: I::Ty) -> I::Clause {
369        match self.skip_binder() {
370            ExistentialPredicate::Trait(tr) => self.rebind(tr).with_self_ty(cx, self_ty).upcast(cx),
371            ExistentialPredicate::Projection(p) => {
372                self.rebind(p.with_self_ty(cx, self_ty)).upcast(cx)
373            }
374            ExistentialPredicate::AutoTrait(did) => {
375                let generics = cx.generics_of(did.into());
376                let trait_ref = if generics.count() == 1 {
377                    ty::TraitRef::new(cx, did, [self_ty])
378                } else {
379                    // If this is an ill-formed auto trait, then synthesize
380                    // new error args for the missing generics.
381                    let err_args =
382                        GenericArgs::extend_with_error(cx, did.into(), &[self_ty.into()]);
383                    ty::TraitRef::new_from_args(cx, did, err_args)
384                };
385                self.rebind(trait_ref).upcast(cx)
386            }
387        }
388    }
389}
390
391/// An existential reference to a trait, where `Self` is erased.
392///
393/// For example, the trait object `Trait<'a, 'b, X, Y>` is:
394/// ```ignore (illustrative)
395/// exists T. T: Trait<'a, 'b, X, Y>
396/// ```
397/// The generic parameters don't include the erased `Self`, only trait
398/// type and lifetime parameters (`[X, Y]` and `['a, 'b]` above).
399#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for ExistentialTraitRef<I> where
    I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (ExistentialTraitRef {
                def_id: ref __field_def_id,
                args: ref __field_args,
                _use_existential_trait_ref_new_instead: ref __field__use_existential_trait_ref_new_instead
                }, ExistentialTraitRef {
                def_id: ref __other_field_def_id,
                args: ref __other_field_args,
                _use_existential_trait_ref_new_instead: ref __other_field__use_existential_trait_ref_new_instead
                }) =>
                true &&
                            ::core::cmp::PartialEq::eq(__field_def_id,
                                __other_field_def_id) &&
                        ::core::cmp::PartialEq::eq(__field_args, __other_field_args)
                    &&
                    ::core::cmp::PartialEq::eq(__field__use_existential_trait_ref_new_instead,
                        __other_field__use_existential_trait_ref_new_instead),
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq; I: Interner)]
400#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            ExistentialTraitRef<I> where I: Interner,
            I::TraitId: ::rustc_type_ir::TypeVisitable<I>,
            I::GenericArgs: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ExistentialTraitRef {
                        def_id: ref __binding_0,
                        args: ref __binding_1,
                        _use_existential_trait_ref_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
            ExistentialTraitRef<I> where I: Interner,
            I::TraitId: ::rustc_type_ir::TypeFoldable<I>,
            I::GenericArgs: ::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 {
                        ExistentialTraitRef {
                            def_id: __binding_0,
                            args: __binding_1,
                            _use_existential_trait_ref_new_instead: __binding_2 } => {
                            ExistentialTraitRef {
                                def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                args: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                _use_existential_trait_ref_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 {
                    ExistentialTraitRef {
                        def_id: __binding_0,
                        args: __binding_1,
                        _use_existential_trait_ref_new_instead: __binding_2 } => {
                        ExistentialTraitRef {
                            def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            args: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            _use_existential_trait_ref_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
            ExistentialTraitRef<I> where I: Interner, J: Interner,
            I::TraitId: ::rustc_type_ir::lift::Lift<J, Lifted = J::TraitId>,
            I::GenericArgs: ::rustc_type_ir::lift::Lift<J, Lifted =
            J::GenericArgs>, (): ::rustc_type_ir::lift::Lift<J, Lifted = ()> {
            type Lifted = ExistentialTraitRef<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        ExistentialTraitRef {
                            def_id: __binding_0,
                            args: __binding_1,
                            _use_existential_trait_ref_new_instead: __binding_2 } => {
                            ExistentialTraitRef {
                                def_id: __binding_0.lift_to_interner(interner)?,
                                args: __binding_1.lift_to_interner(interner)?,
                                _use_existential_trait_ref_new_instead: __binding_2.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
401#[cfg_attr(
402    feature = "nightly",
403    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for ExistentialTraitRef<I> where
            I::TraitId: ::rustc_serialize::Decodable<__D>,
            I::GenericArgs: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                ExistentialTraitRef {
                    def_id: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                    _use_existential_trait_ref_new_instead: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for ExistentialTraitRef<I> where
            I::TraitId: ::rustc_serialize::Encodable<__E>,
            I::GenericArgs: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    ExistentialTraitRef {
                        def_id: ref __binding_0,
                        args: ref __binding_1,
                        _use_existential_trait_ref_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> ::rustc_data_structures::stable_hasher::HashStable
            for ExistentialTraitRef<I> where
            I::TraitId: ::rustc_data_structures::stable_hasher::HashStable,
            I::GenericArgs: ::rustc_data_structures::stable_hasher::HashStable
            {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    ExistentialTraitRef {
                        def_id: ref __binding_0,
                        args: ref __binding_1,
                        _use_existential_trait_ref_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)
404)]
405pub struct ExistentialTraitRef<I: Interner> {
406    pub def_id: I::TraitId,
407    pub args: I::GenericArgs,
408    /// This field exists to prevent the creation of `ExistentialTraitRef` without
409    /// calling [`ExistentialTraitRef::new_from_args`].
410    _use_existential_trait_ref_new_instead: (),
411}
412
413impl<I: Interner> Eq for ExistentialTraitRef<I> {}
414
415impl<I: Interner> ExistentialTraitRef<I> {
416    pub fn new_from_args(interner: I, trait_def_id: I::TraitId, args: I::GenericArgs) -> Self {
417        interner.debug_assert_existential_args_compatible(trait_def_id.into(), args);
418        Self { def_id: trait_def_id, args, _use_existential_trait_ref_new_instead: () }
419    }
420
421    pub fn new(
422        interner: I,
423        trait_def_id: I::TraitId,
424        args: impl IntoIterator<Item: Into<I::GenericArg>>,
425    ) -> Self {
426        let args = interner.mk_args_from_iter(args.into_iter().map(Into::into));
427        Self::new_from_args(interner, trait_def_id, args)
428    }
429
430    pub fn erase_self_ty(interner: I, trait_ref: TraitRef<I>) -> ExistentialTraitRef<I> {
431        // Assert there is a Self.
432        trait_ref.args.type_at(0);
433
434        ExistentialTraitRef {
435            def_id: trait_ref.def_id,
436            args: interner.mk_args(&trait_ref.args.as_slice()[1..]),
437            _use_existential_trait_ref_new_instead: (),
438        }
439    }
440
441    /// Object types don't have a self type specified. Therefore, when
442    /// we convert the principal trait-ref into a normal trait-ref,
443    /// you must give *some* self type. A common choice is `mk_err()`
444    /// or some placeholder type.
445    pub fn with_self_ty(self, interner: I, self_ty: I::Ty) -> TraitRef<I> {
446        // otherwise the escaping vars would be captured by the binder
447        // debug_assert!(!self_ty.has_escaping_bound_vars());
448
449        TraitRef::new(interner, self.def_id, [self_ty.into()].into_iter().chain(self.args.iter()))
450    }
451}
452
453impl<I: Interner> ty::Binder<I, ExistentialTraitRef<I>> {
454    pub fn def_id(&self) -> I::TraitId {
455        self.skip_binder().def_id
456    }
457
458    /// Object types don't have a self type specified. Therefore, when
459    /// we convert the principal trait-ref into a normal trait-ref,
460    /// you must give *some* self type. A common choice is `mk_err()`
461    /// or some placeholder type.
462    pub fn with_self_ty(&self, cx: I, self_ty: I::Ty) -> ty::Binder<I, TraitRef<I>> {
463        self.map_bound(|trait_ref| trait_ref.with_self_ty(cx, self_ty))
464    }
465}
466
467/// A `ProjectionPredicate` for an `ExistentialTraitRef`.
468#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for ExistentialProjection<I> where
    I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            ExistentialProjection {
                def_id: ref __field_def_id,
                args: ref __field_args,
                term: ref __field_term,
                use_existential_projection_new_instead: ref __field_use_existential_projection_new_instead
                } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f,
                        "ExistentialProjection");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::field(&mut __builder, "args",
                    __field_args);
                ::core::fmt::DebugStruct::field(&mut __builder, "term",
                    __field_term);
                ::core::fmt::DebugStruct::finish_non_exhaustive(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
469#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            ExistentialProjection<I> where I: Interner,
            I::DefId: ::rustc_type_ir::TypeVisitable<I>,
            I::GenericArgs: ::rustc_type_ir::TypeVisitable<I>,
            I::Term: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ExistentialProjection {
                        def_id: ref __binding_0,
                        args: ref __binding_1,
                        term: ref __binding_2,
                        use_existential_projection_new_instead: ref __binding_3 } =>
                        {
                        {
                            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);
                                }
                            }
                        }
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_3,
                                        __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
            ExistentialProjection<I> where I: Interner,
            I::DefId: ::rustc_type_ir::TypeFoldable<I>,
            I::GenericArgs: ::rustc_type_ir::TypeFoldable<I>,
            I::Term: ::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 {
                        ExistentialProjection {
                            def_id: __binding_0,
                            args: __binding_1,
                            term: __binding_2,
                            use_existential_projection_new_instead: __binding_3 } => {
                            ExistentialProjection {
                                def_id: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                args: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                term: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                                use_existential_projection_new_instead: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_3,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    ExistentialProjection {
                        def_id: __binding_0,
                        args: __binding_1,
                        term: __binding_2,
                        use_existential_projection_new_instead: __binding_3 } => {
                        ExistentialProjection {
                            def_id: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            args: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            term: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
                                __folder),
                            use_existential_projection_new_instead: ::rustc_type_ir::TypeFoldable::fold_with(__binding_3,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            ExistentialProjection<I> where I: Interner, J: Interner,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
            I::GenericArgs: ::rustc_type_ir::lift::Lift<J, Lifted =
            J::GenericArgs>,
            I::Term: ::rustc_type_ir::lift::Lift<J, Lifted = J::Term>,
            (): ::rustc_type_ir::lift::Lift<J, Lifted = ()> {
            type Lifted = ExistentialProjection<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        ExistentialProjection {
                            def_id: __binding_0,
                            args: __binding_1,
                            term: __binding_2,
                            use_existential_projection_new_instead: __binding_3 } => {
                            ExistentialProjection {
                                def_id: __binding_0.lift_to_interner(interner)?,
                                args: __binding_1.lift_to_interner(interner)?,
                                term: __binding_2.lift_to_interner(interner)?,
                                use_existential_projection_new_instead: __binding_3.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
470#[cfg_attr(
471    feature = "nightly",
472    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for ExistentialProjection<I>
            where I::DefId: ::rustc_serialize::Decodable<__D>,
            I::GenericArgs: ::rustc_serialize::Decodable<__D>,
            I::Term: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                ExistentialProjection {
                    def_id: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                    term: ::rustc_serialize::Decodable::decode(__decoder),
                    use_existential_projection_new_instead: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for ExistentialProjection<I>
            where I::DefId: ::rustc_serialize::Encodable<__E>,
            I::GenericArgs: ::rustc_serialize::Encodable<__E>,
            I::Term: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    ExistentialProjection {
                        def_id: ref __binding_0,
                        args: ref __binding_1,
                        term: ref __binding_2,
                        use_existential_projection_new_instead: 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> ::rustc_data_structures::stable_hasher::HashStable
            for ExistentialProjection<I> where
            I::DefId: ::rustc_data_structures::stable_hasher::HashStable,
            I::GenericArgs: ::rustc_data_structures::stable_hasher::HashStable,
            I::Term: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    ExistentialProjection {
                        def_id: ref __binding_0,
                        args: ref __binding_1,
                        term: ref __binding_2,
                        use_existential_projection_new_instead: 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)
473)]
474pub struct ExistentialProjection<I: Interner> {
475    pub def_id: I::DefId,
476    pub args: I::GenericArgs,
477    pub term: I::Term,
478
479    /// This field exists to prevent the creation of `ExistentialProjection`
480    /// without using [`ExistentialProjection::new_from_args`].
481    #[derive_where(skip(Debug))]
482    use_existential_projection_new_instead: (),
483}
484
485impl<I: Interner> Eq for ExistentialProjection<I> {}
486
487impl<I: Interner> ExistentialProjection<I> {
488    pub fn new_from_args(
489        interner: I,
490        def_id: I::DefId,
491        args: I::GenericArgs,
492        term: I::Term,
493    ) -> ExistentialProjection<I> {
494        interner.debug_assert_existential_args_compatible(def_id, args);
495        Self { def_id, args, term, use_existential_projection_new_instead: () }
496    }
497
498    pub fn new(
499        interner: I,
500        def_id: I::DefId,
501        args: impl IntoIterator<Item: Into<I::GenericArg>>,
502        term: I::Term,
503    ) -> ExistentialProjection<I> {
504        let args = interner.mk_args_from_iter(args.into_iter().map(Into::into));
505        Self::new_from_args(interner, def_id, args, term)
506    }
507
508    /// Extracts the underlying existential trait reference from this projection.
509    ///
510    /// For example, if this is a projection of `exists T. <T as Iterator>::Item == X`,
511    /// then this function would return an `exists T. T: Iterator` existential trait
512    /// reference.
513    pub fn trait_ref(&self, interner: I) -> ExistentialTraitRef<I> {
514        let def_id = interner.parent(self.def_id);
515        let args_count = interner.generics_of(def_id).count() - 1;
516        let args = interner.mk_args(&self.args.as_slice()[..args_count]);
517        ExistentialTraitRef::new_from_args(interner, def_id.try_into().unwrap(), args)
518    }
519
520    pub fn with_self_ty(&self, interner: I, self_ty: I::Ty) -> ProjectionPredicate<I> {
521        // otherwise the escaping regions would be captured by the binders
522        if true {
    if !!self_ty.has_escaping_bound_vars() {
        ::core::panicking::panic("assertion failed: !self_ty.has_escaping_bound_vars()")
    };
};debug_assert!(!self_ty.has_escaping_bound_vars());
523
524        ProjectionPredicate {
525            projection_term: AliasTerm::new(
526                interner,
527                interner.alias_term_kind_from_def_id(self.def_id),
528                [self_ty.into()].iter().chain(self.args.iter()),
529            ),
530            term: self.term,
531        }
532    }
533
534    pub fn erase_self_ty(interner: I, projection_predicate: ProjectionPredicate<I>) -> Self {
535        // Assert there is a Self.
536        projection_predicate.projection_term.args.type_at(0);
537
538        Self {
539            def_id: projection_predicate.projection_term.def_id(),
540            args: interner.mk_args(&projection_predicate.projection_term.args.as_slice()[1..]),
541            term: projection_predicate.term,
542            use_existential_projection_new_instead: (),
543        }
544    }
545}
546
547impl<I: Interner> ty::Binder<I, ExistentialProjection<I>> {
548    pub fn with_self_ty(&self, cx: I, self_ty: I::Ty) -> ty::Binder<I, ProjectionPredicate<I>> {
549        self.map_bound(|p| p.with_self_ty(cx, self_ty))
550    }
551
552    pub fn item_def_id(&self) -> I::DefId {
553        self.skip_binder().def_id
554    }
555}
556
557#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for AliasTermKind<I> where I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            AliasTermKind::ProjectionTy { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "ProjectionTy");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTermKind::InherentTy { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "InherentTy");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTermKind::OpaqueTy { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "OpaqueTy");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTermKind::FreeTy { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "FreeTy");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTermKind::UnevaluatedConst { def_id: ref __field_def_id } =>
                {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f,
                        "UnevaluatedConst");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTermKind::ProjectionConst { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f,
                        "ProjectionConst");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTermKind::FreeConst { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "FreeConst");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
            AliasTermKind::InherentConst { def_id: ref __field_def_id } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "InherentConst");
                ::core::fmt::DebugStruct::field(&mut __builder, "def_id",
                    __field_def_id);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, PartialEq, Eq, Hash, Debug; I: Interner)]
558#[derive(const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            AliasTermKind<I> where I: Interner, J: Interner,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId>,
            I::DefId: ::rustc_type_ir::lift::Lift<J, Lifted = J::DefId> {
            type Lifted = AliasTermKind<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        AliasTermKind::ProjectionTy { def_id: __binding_0 } => {
                            AliasTermKind::ProjectionTy {
                                def_id: __binding_0.lift_to_interner(interner)?,
                            }
                        }
                        AliasTermKind::InherentTy { def_id: __binding_0 } => {
                            AliasTermKind::InherentTy {
                                def_id: __binding_0.lift_to_interner(interner)?,
                            }
                        }
                        AliasTermKind::OpaqueTy { def_id: __binding_0 } => {
                            AliasTermKind::OpaqueTy {
                                def_id: __binding_0.lift_to_interner(interner)?,
                            }
                        }
                        AliasTermKind::FreeTy { def_id: __binding_0 } => {
                            AliasTermKind::FreeTy {
                                def_id: __binding_0.lift_to_interner(interner)?,
                            }
                        }
                        AliasTermKind::UnevaluatedConst { def_id: __binding_0 } => {
                            AliasTermKind::UnevaluatedConst {
                                def_id: __binding_0.lift_to_interner(interner)?,
                            }
                        }
                        AliasTermKind::ProjectionConst { def_id: __binding_0 } => {
                            AliasTermKind::ProjectionConst {
                                def_id: __binding_0.lift_to_interner(interner)?,
                            }
                        }
                        AliasTermKind::FreeConst { def_id: __binding_0 } => {
                            AliasTermKind::FreeConst {
                                def_id: __binding_0.lift_to_interner(interner)?,
                            }
                        }
                        AliasTermKind::InherentConst { def_id: __binding_0 } => {
                            AliasTermKind::InherentConst {
                                def_id: __binding_0.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
559#[cfg_attr(
560    feature = "nightly",
561    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for AliasTermKind<I> where
            I::DefId: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AliasTermKind::ProjectionTy { def_id: ref __binding_0 } => {
                            0usize
                        }
                        AliasTermKind::InherentTy { def_id: ref __binding_0 } => {
                            1usize
                        }
                        AliasTermKind::OpaqueTy { def_id: ref __binding_0 } => {
                            2usize
                        }
                        AliasTermKind::FreeTy { def_id: ref __binding_0 } => {
                            3usize
                        }
                        AliasTermKind::UnevaluatedConst { def_id: ref __binding_0 }
                            => {
                            4usize
                        }
                        AliasTermKind::ProjectionConst { def_id: ref __binding_0 }
                            => {
                            5usize
                        }
                        AliasTermKind::FreeConst { def_id: ref __binding_0 } => {
                            6usize
                        }
                        AliasTermKind::InherentConst { def_id: ref __binding_0 } =>
                            {
                            7usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AliasTermKind::ProjectionTy { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTermKind::InherentTy { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTermKind::OpaqueTy { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTermKind::FreeTy { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTermKind::UnevaluatedConst { def_id: ref __binding_0 }
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTermKind::ProjectionConst { def_id: ref __binding_0 }
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTermKind::FreeConst { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AliasTermKind::InherentConst { def_id: ref __binding_0 } =>
                        {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for AliasTermKind<I> where
            I::DefId: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AliasTermKind::ProjectionTy {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        AliasTermKind::InherentTy {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        AliasTermKind::OpaqueTy {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    3usize => {
                        AliasTermKind::FreeTy {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    4usize => {
                        AliasTermKind::UnevaluatedConst {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    5usize => {
                        AliasTermKind::ProjectionConst {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    6usize => {
                        AliasTermKind::FreeConst {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    7usize => {
                        AliasTermKind::InherentConst {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AliasTermKind`, expected 0..8, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hasher::HashStable
            for AliasTermKind<I> where
            I::DefId: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    AliasTermKind::ProjectionTy { def_id: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    AliasTermKind::InherentTy { def_id: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    AliasTermKind::OpaqueTy { def_id: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    AliasTermKind::FreeTy { def_id: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    AliasTermKind::UnevaluatedConst { def_id: ref __binding_0 }
                        => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    AliasTermKind::ProjectionConst { def_id: ref __binding_0 }
                        => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    AliasTermKind::FreeConst { def_id: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    AliasTermKind::InherentConst { def_id: ref __binding_0 } =>
                        {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
562)]
563pub enum AliasTermKind<I: Interner> {
564    /// A projection `<Type as Trait>::AssocType`.
565    ///
566    /// Can get normalized away if monomorphic enough.
567    ///
568    /// The `def_id` is the `DefId` of the `TraitItem` for the associated type.
569    ///
570    /// Note that the `def_id` is not the `DefId` of the `TraitRef` containing this
571    /// associated type, which is in `interner.associated_item(def_id).container`,
572    /// aka. `interner.parent(def_id)`.
573    ProjectionTy { def_id: I::DefId },
574
575    /// An associated type in an inherent `impl`
576    ///
577    /// The `def_id` is the `DefId` of the `ImplItem` for the associated type.
578    InherentTy { def_id: I::DefId },
579
580    /// An opaque type (usually from `impl Trait` in type aliases or function return types)
581    ///
582    /// `def_id` is the `DefId` of the `OpaqueType` item.
583    ///
584    /// Can only be normalized away in `PostAnalysis` mode or its defining scope.
585    ///
586    /// During codegen, `interner.type_of(def_id)` can be used to get the type of the
587    /// underlying type if the type is an opaque.
588    OpaqueTy { def_id: I::DefId },
589
590    /// A type alias that actually checks its trait bounds.
591    ///
592    /// Currently only used if the type alias references opaque types.
593    /// Can always be normalized away.
594    FreeTy { def_id: I::DefId },
595
596    /// An unevaluated anonymous constants.
597    UnevaluatedConst { def_id: I::DefId },
598    /// An unevaluated const coming from an associated const.
599    ProjectionConst { def_id: I::DefId },
600    /// A top level const item not part of a trait or impl.
601    FreeConst { def_id: I::DefId },
602    /// An associated const in an inherent `impl`
603    InherentConst { def_id: I::DefId },
604}
605
606impl<I: Interner> AliasTermKind<I> {
607    pub fn descr(self) -> &'static str {
608        match self {
609            AliasTermKind::ProjectionTy { .. } => "associated type",
610            AliasTermKind::ProjectionConst { .. } => "associated const",
611            AliasTermKind::InherentTy { .. } => "inherent associated type",
612            AliasTermKind::InherentConst { .. } => "inherent associated const",
613            AliasTermKind::OpaqueTy { .. } => "opaque type",
614            AliasTermKind::FreeTy { .. } => "type alias",
615            AliasTermKind::FreeConst { .. } => "unevaluated constant",
616            AliasTermKind::UnevaluatedConst { .. } => "unevaluated constant",
617        }
618    }
619
620    pub fn is_type(self) -> bool {
621        match self {
622            AliasTermKind::ProjectionTy { .. }
623            | AliasTermKind::InherentTy { .. }
624            | AliasTermKind::OpaqueTy { .. }
625            | AliasTermKind::FreeTy { .. } => true,
626
627            AliasTermKind::UnevaluatedConst { .. }
628            | AliasTermKind::ProjectionConst { .. }
629            | AliasTermKind::InherentConst { .. }
630            | AliasTermKind::FreeConst { .. } => false,
631        }
632    }
633
634    // FIXME: replace with explicit matches
635    pub fn def_id(self) -> I::DefId {
636        let (AliasTermKind::ProjectionTy { def_id }
637        | AliasTermKind::InherentTy { def_id }
638        | AliasTermKind::OpaqueTy { def_id }
639        | AliasTermKind::FreeTy { def_id }
640        | AliasTermKind::UnevaluatedConst { def_id }
641        | AliasTermKind::ProjectionConst { def_id }
642        | AliasTermKind::FreeConst { def_id }
643        | AliasTermKind::InherentConst { def_id }) = self;
644        def_id
645    }
646}
647
648impl<I: Interner> From<ty::AliasTyKind<I>> for AliasTermKind<I> {
649    fn from(value: ty::AliasTyKind<I>) -> Self {
650        match value {
651            ty::Projection { def_id } => AliasTermKind::ProjectionTy { def_id },
652            ty::Opaque { def_id } => AliasTermKind::OpaqueTy { def_id },
653            ty::Free { def_id } => AliasTermKind::FreeTy { def_id },
654            ty::Inherent { def_id } => AliasTermKind::InherentTy { def_id },
655        }
656    }
657}
658
659/// Represents the unprojected term of a projection goal.
660///
661/// * For a projection, this would be `<Ty as Trait<...>>::N<...>`.
662/// * For an inherent projection, this would be `Ty::N<...>`.
663/// * For an opaque type, there is no explicit syntax.
664#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for AliasTerm<I> where I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            AliasTerm {
                args: ref __field_args,
                kind: ref __field_kind,
                _use_alias_term_new_instead: ref __field__use_alias_term_new_instead
                } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "AliasTerm");
                ::core::fmt::DebugStruct::field(&mut __builder, "args",
                    __field_args);
                ::core::fmt::DebugStruct::field(&mut __builder, "kind",
                    __field_kind);
                ::core::fmt::DebugStruct::finish_non_exhaustive(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
665#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for AliasTerm<I>
            where I: Interner,
            I::GenericArgs: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    AliasTerm {
                        args: ref __binding_0,
                        _use_alias_term_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_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 AliasTerm<I>
            where I: Interner,
            I::GenericArgs: ::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 {
                        AliasTerm {
                            args: __binding_0,
                            kind: __binding_1,
                            _use_alias_term_new_instead: __binding_2 } => {
                            AliasTerm {
                                args: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                kind: __binding_1,
                                _use_alias_term_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 {
                    AliasTerm {
                        args: __binding_0,
                        kind: __binding_1,
                        _use_alias_term_new_instead: __binding_2 } => {
                        AliasTerm {
                            args: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            kind: __binding_1,
                            _use_alias_term_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 AliasTerm<I>
            where I: Interner, J: Interner,
            I::GenericArgs: ::rustc_type_ir::lift::Lift<J, Lifted =
            J::GenericArgs>,
            AliasTermKind<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
            AliasTermKind<J>>, (): ::rustc_type_ir::lift::Lift<J, Lifted = ()>
            {
            type Lifted = AliasTerm<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        AliasTerm {
                            args: __binding_0,
                            kind: __binding_1,
                            _use_alias_term_new_instead: __binding_2 } => {
                            AliasTerm {
                                args: __binding_0.lift_to_interner(interner)?,
                                kind: __binding_1.lift_to_interner(interner)?,
                                _use_alias_term_new_instead: __binding_2.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
666#[cfg_attr(
667    feature = "nightly",
668    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for AliasTerm<I> where
            I::GenericArgs: ::rustc_serialize::Decodable<__D>,
            AliasTermKind<I>: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                AliasTerm {
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    _use_alias_term_new_instead: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for AliasTerm<I> where
            I::GenericArgs: ::rustc_serialize::Encodable<__E>,
            AliasTermKind<I>: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    AliasTerm {
                        args: ref __binding_0,
                        kind: ref __binding_1,
                        _use_alias_term_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> ::rustc_data_structures::stable_hasher::HashStable
            for AliasTerm<I> where
            I::GenericArgs: ::rustc_data_structures::stable_hasher::HashStable,
            AliasTermKind<I>: ::rustc_data_structures::stable_hasher::HashStable
            {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    AliasTerm {
                        args: ref __binding_0,
                        kind: ref __binding_1,
                        _use_alias_term_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)
669)]
670pub struct AliasTerm<I: Interner> {
671    /// The parameters of the associated or opaque item.
672    ///
673    /// For a projection, these are the generic parameters for the trait and the
674    /// GAT parameters, if there are any.
675    ///
676    /// For an inherent projection, they consist of the self type and the GAT parameters,
677    /// if there are any.
678    ///
679    /// For RPIT the generic parameters are for the generics of the function,
680    /// while for TAIT it is used for the generic parameters of the alias.
681    pub args: I::GenericArgs,
682
683    #[type_foldable(identity)]
684    #[type_visitable(ignore)]
685    pub kind: AliasTermKind<I>,
686
687    /// This field exists to prevent the creation of `AliasTerm` without using [`AliasTerm::new_from_args`].
688    #[derive_where(skip(Debug))]
689    _use_alias_term_new_instead: (),
690}
691
692impl<I: Interner> Eq for AliasTerm<I> {}
693
694impl<I: Interner> AliasTerm<I> {
695    pub fn new_from_args(
696        interner: I,
697        kind: AliasTermKind<I>,
698        args: I::GenericArgs,
699    ) -> AliasTerm<I> {
700        interner.debug_assert_args_compatible(kind.def_id(), args);
701        AliasTerm { kind, args, _use_alias_term_new_instead: () }
702    }
703
704    pub fn new(
705        interner: I,
706        kind: AliasTermKind<I>,
707        args: impl IntoIterator<Item: Into<I::GenericArg>>,
708    ) -> AliasTerm<I> {
709        let args = interner.mk_args_from_iter(args.into_iter().map(Into::into));
710        Self::new_from_args(interner, kind, args)
711    }
712
713    pub fn new_from_def_id(interner: I, def_id: I::DefId, args: I::GenericArgs) -> AliasTerm<I> {
714        let kind = interner.alias_term_kind_from_def_id(def_id);
715        Self::new_from_args(interner, kind, args)
716    }
717
718    pub fn from_unevaluated_const(interner: I, ct: ty::UnevaluatedConst<I>) -> Self {
719        let kind = interner.alias_term_kind_from_def_id(ct.def.into());
720        AliasTerm::new_from_args(interner, kind, ct.args)
721    }
722
723    pub fn expect_ty(self, interner: I) -> ty::AliasTy<I> {
724        let kind = match self.kind(interner) {
725            AliasTermKind::ProjectionTy { def_id } => AliasTyKind::Projection { def_id },
726            AliasTermKind::InherentTy { def_id } => AliasTyKind::Inherent { def_id },
727            AliasTermKind::OpaqueTy { def_id } => AliasTyKind::Opaque { def_id },
728            AliasTermKind::FreeTy { def_id } => AliasTyKind::Free { def_id },
729            AliasTermKind::InherentConst { .. }
730            | AliasTermKind::FreeConst { .. }
731            | AliasTermKind::UnevaluatedConst { .. }
732            | AliasTermKind::ProjectionConst { .. } => {
733                {
    ::core::panicking::panic_fmt(format_args!("Cannot turn `UnevaluatedConst` into `AliasTy`"));
}panic!("Cannot turn `UnevaluatedConst` into `AliasTy`")
734            }
735        };
736        ty::AliasTy { kind, args: self.args, _use_alias_ty_new_instead: () }
737    }
738
739    // FIXME: remove this function (access the field instead)
740    pub fn kind(self, _interner: I) -> AliasTermKind<I> {
741        self.kind
742    }
743
744    // FIXME: replace with explicit matches
745    pub fn def_id(self) -> I::DefId {
746        self.kind.def_id()
747    }
748
749    pub fn to_term(self, interner: I) -> I::Term {
750        let alias_ty_kind = match self.kind(interner) {
751            AliasTermKind::FreeConst { def_id }
752            | AliasTermKind::InherentConst { def_id }
753            | AliasTermKind::UnevaluatedConst { def_id }
754            | AliasTermKind::ProjectionConst { def_id } => {
755                return I::Const::new_unevaluated(
756                    interner,
757                    ty::UnevaluatedConst::new(def_id.try_into().unwrap(), self.args),
758                )
759                .into();
760            }
761
762            AliasTermKind::ProjectionTy { def_id } => ty::Projection { def_id },
763            AliasTermKind::InherentTy { def_id } => ty::Inherent { def_id },
764            AliasTermKind::OpaqueTy { def_id } => ty::Opaque { def_id },
765            AliasTermKind::FreeTy { def_id } => ty::Free { def_id },
766        };
767
768        Ty::new_alias(interner, ty::AliasTy::new_from_args(interner, alias_ty_kind, self.args))
769            .into()
770    }
771
772    pub fn with_args(self, interner: I, args: I::GenericArgs) -> Self {
773        Self::new_from_args(interner, self.kind, args)
774    }
775}
776
777/// The following methods work only with (trait) associated term projections.
778impl<I: Interner> AliasTerm<I> {
779    pub fn self_ty(self) -> I::Ty {
780        self.args.type_at(0)
781    }
782
783    pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> Self {
784        AliasTerm::new(
785            interner,
786            self.kind,
787            [self_ty.into()].into_iter().chain(self.args.iter().skip(1)),
788        )
789    }
790
791    pub fn trait_def_id(self, interner: I) -> I::TraitId {
792        if !#[allow(non_exhaustive_omitted_patterns)] match self.kind(interner) {
            AliasTermKind::ProjectionTy { .. } |
                AliasTermKind::ProjectionConst { .. } => true,
            _ => false,
        } {
    { ::core::panicking::panic_fmt(format_args!("expected a projection")); }
};assert!(
793            matches!(
794                self.kind(interner),
795                AliasTermKind::ProjectionTy { .. } | AliasTermKind::ProjectionConst { .. }
796            ),
797            "expected a projection"
798        );
799        interner.parent(self.def_id()).try_into().unwrap()
800    }
801
802    /// Extracts the underlying trait reference and own args from this projection.
803    /// For example, if this is a projection of `<T as StreamingIterator>::Item<'a>`,
804    /// then this function would return a `T: StreamingIterator` trait reference and
805    /// `['a]` as the own args.
806    pub fn trait_ref_and_own_args(self, interner: I) -> (TraitRef<I>, I::GenericArgsSlice) {
807        interner.trait_ref_and_own_args_for_alias(self.def_id(), self.args)
808    }
809
810    /// Extracts the underlying trait reference from this projection.
811    /// For example, if this is a projection of `<T as Iterator>::Item`,
812    /// then this function would return a `T: Iterator` trait reference.
813    ///
814    /// WARNING: This will drop the args for generic associated types
815    /// consider calling [Self::trait_ref_and_own_args] to get those
816    /// as well.
817    pub fn trait_ref(self, interner: I) -> TraitRef<I> {
818        self.trait_ref_and_own_args(interner).0
819    }
820
821    /// Extract the own args from this projection.
822    /// For example, if this is a projection of `<T as StreamingIterator>::Item<'a>`,
823    /// then this function would return the slice `['a]` as the own args.
824    pub fn own_args(self, interner: I) -> I::GenericArgsSlice {
825        self.trait_ref_and_own_args(interner).1
826    }
827}
828
829/// The following methods work only with inherent associated term projections.
830impl<I: Interner> AliasTerm<I> {
831    /// Transform the generic parameters to have the given `impl` args as the base and the GAT args on top of that.
832    ///
833    /// Does the following transformation:
834    ///
835    /// ```text
836    /// [Self, P_0...P_m] -> [I_0...I_n, P_0...P_m]
837    ///
838    ///     I_i impl args
839    ///     P_j GAT args
840    /// ```
841    pub fn rebase_inherent_args_onto_impl(
842        self,
843        impl_args: I::GenericArgs,
844        interner: I,
845    ) -> I::GenericArgs {
846        if true {
    if !#[allow(non_exhaustive_omitted_patterns)] match self.kind(interner) {
                AliasTermKind::InherentTy { .. } |
                    AliasTermKind::InherentConst { .. } => true,
                _ => false,
            } {
        ::core::panicking::panic("assertion failed: matches!(self.kind(interner), AliasTermKind::InherentTy { .. } |\n    AliasTermKind::InherentConst { .. })")
    };
};debug_assert!(matches!(
847            self.kind(interner),
848            AliasTermKind::InherentTy { .. } | AliasTermKind::InherentConst { .. }
849        ));
850        interner.mk_args_from_iter(impl_args.iter().chain(self.args.iter().skip(1)))
851    }
852}
853
854impl<I: Interner> From<ty::AliasTy<I>> for AliasTerm<I> {
855    fn from(ty: ty::AliasTy<I>) -> Self {
856        AliasTerm {
857            args: ty.args,
858            kind: AliasTermKind::from(ty.kind),
859            _use_alias_term_new_instead: (),
860        }
861    }
862}
863
864/// This kind of predicate has no *direct* correspondent in the
865/// syntax, but it roughly corresponds to the syntactic forms:
866///
867/// 1. `T: TraitRef<..., Item = Type>`
868/// 2. `<T as TraitRef<...>>::Item == Type` (NYI)
869///
870/// In particular, form #1 is "desugared" to the combination of a
871/// normal trait predicate (`T: TraitRef<...>`) and one of these
872/// predicates. Form #2 is a broader form in that it also permits
873/// equality between arbitrary types. Processing an instance of
874/// Form #2 eventually yields one of these `ProjectionPredicate`
875/// instances to normalize the LHS.
876#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for ProjectionPredicate<I> where
    I: Interner {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (ProjectionPredicate {
                projection_term: ref __field_projection_term,
                term: ref __field_term }, ProjectionPredicate {
                projection_term: ref __other_field_projection_term,
                term: ref __other_field_term }) =>
                true &&
                        ::core::cmp::PartialEq::eq(__field_projection_term,
                            __other_field_projection_term) &&
                    ::core::cmp::PartialEq::eq(__field_term,
                        __other_field_term),
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq; I: Interner)]
877#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            ProjectionPredicate<I> where I: Interner,
            AliasTerm<I>: ::rustc_type_ir::TypeVisitable<I>,
            I::Term: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ProjectionPredicate {
                        projection_term: ref __binding_0, term: 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
            ProjectionPredicate<I> where I: Interner,
            AliasTerm<I>: ::rustc_type_ir::TypeFoldable<I>,
            I::Term: ::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 {
                        ProjectionPredicate {
                            projection_term: __binding_0, term: __binding_1 } => {
                            ProjectionPredicate {
                                projection_term: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                term: ::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 {
                    ProjectionPredicate {
                        projection_term: __binding_0, term: __binding_1 } => {
                        ProjectionPredicate {
                            projection_term: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            term: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            ProjectionPredicate<I> where I: Interner, J: Interner,
            AliasTerm<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
            AliasTerm<J>>,
            I::Term: ::rustc_type_ir::lift::Lift<J, Lifted = J::Term> {
            type Lifted = ProjectionPredicate<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        ProjectionPredicate {
                            projection_term: __binding_0, term: __binding_1 } => {
                            ProjectionPredicate {
                                projection_term: __binding_0.lift_to_interner(interner)?,
                                term: __binding_1.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
878#[cfg_attr(
879    feature = "nightly",
880    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for ProjectionPredicate<I> where
            AliasTerm<I>: ::rustc_serialize::Decodable<__D>,
            I::Term: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                ProjectionPredicate {
                    projection_term: ::rustc_serialize::Decodable::decode(__decoder),
                    term: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for ProjectionPredicate<I> where
            AliasTerm<I>: ::rustc_serialize::Encodable<__E>,
            I::Term: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    ProjectionPredicate {
                        projection_term: ref __binding_0, term: 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> ::rustc_data_structures::stable_hasher::HashStable
            for ProjectionPredicate<I> where
            AliasTerm<I>: ::rustc_data_structures::stable_hasher::HashStable,
            I::Term: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    ProjectionPredicate {
                        projection_term: ref __binding_0, term: ref __binding_1 } =>
                        {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
881)]
882pub struct ProjectionPredicate<I: Interner> {
883    pub projection_term: AliasTerm<I>,
884    pub term: I::Term,
885}
886
887impl<I: Interner> Eq for ProjectionPredicate<I> {}
888
889impl<I: Interner> ProjectionPredicate<I> {
890    pub fn self_ty(self) -> I::Ty {
891        self.projection_term.self_ty()
892    }
893
894    pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> ProjectionPredicate<I> {
895        Self {
896            projection_term: self.projection_term.with_replaced_self_ty(interner, self_ty),
897            ..self
898        }
899    }
900
901    pub fn trait_def_id(self, interner: I) -> I::TraitId {
902        self.projection_term.trait_def_id(interner)
903    }
904
905    pub fn def_id(self) -> I::DefId {
906        self.projection_term.def_id()
907    }
908}
909
910impl<I: Interner> ty::Binder<I, ProjectionPredicate<I>> {
911    /// Returns the `DefId` of the trait of the associated item being projected.
912    #[inline]
913    pub fn trait_def_id(&self, cx: I) -> I::TraitId {
914        self.skip_binder().projection_term.trait_def_id(cx)
915    }
916
917    pub fn term(&self) -> ty::Binder<I, I::Term> {
918        self.map_bound(|predicate| predicate.term)
919    }
920
921    /// The `DefId` of the `TraitItem` for the associated type.
922    ///
923    /// Note that this is not the `DefId` of the `TraitRef` containing this
924    /// associated type, which is in `tcx.associated_item(projection_def_id()).container`.
925    pub fn item_def_id(&self) -> I::DefId {
926        // Ok to skip binder since trait `DefId` does not care about regions.
927        self.skip_binder().projection_term.def_id()
928    }
929}
930
931impl<I: Interner> fmt::Debug for ProjectionPredicate<I> {
932    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
933        f.write_fmt(format_args!("ProjectionPredicate({0:?}, {1:?})",
        self.projection_term, self.term))write!(f, "ProjectionPredicate({:?}, {:?})", self.projection_term, self.term)
934    }
935}
936
937/// Used by the new solver to normalize an alias. This always expects the `term` to
938/// be an unconstrained inference variable which is used as the output.
939#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for NormalizesTo<I> where I: Interner
    {
    #[inline]
    fn eq(&self, __other: &Self) -> ::core::primitive::bool {
        match (self, __other) {
            (NormalizesTo { alias: ref __field_alias, term: ref __field_term
                }, NormalizesTo {
                alias: ref __other_field_alias, term: ref __other_field_term
                }) =>
                true &&
                        ::core::cmp::PartialEq::eq(__field_alias,
                            __other_field_alias) &&
                    ::core::cmp::PartialEq::eq(__field_term,
                        __other_field_term),
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq; I: Interner)]
940#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            NormalizesTo<I> where I: Interner,
            AliasTerm<I>: ::rustc_type_ir::TypeVisitable<I>,
            I::Term: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    NormalizesTo { alias: ref __binding_0, term: 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 NormalizesTo<I>
            where I: Interner, AliasTerm<I>: ::rustc_type_ir::TypeFoldable<I>,
            I::Term: ::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 {
                        NormalizesTo { alias: __binding_0, term: __binding_1 } => {
                            NormalizesTo {
                                alias: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                term: ::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 {
                    NormalizesTo { alias: __binding_0, term: __binding_1 } => {
                        NormalizesTo {
                            alias: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            term: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            NormalizesTo<I> where I: Interner, J: Interner,
            AliasTerm<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
            AliasTerm<J>>,
            I::Term: ::rustc_type_ir::lift::Lift<J, Lifted = J::Term> {
            type Lifted = NormalizesTo<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        NormalizesTo { alias: __binding_0, term: __binding_1 } => {
                            NormalizesTo {
                                alias: __binding_0.lift_to_interner(interner)?,
                                term: __binding_1.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
941#[cfg_attr(
942    feature = "nightly",
943    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for NormalizesTo<I> where
            AliasTerm<I>: ::rustc_serialize::Decodable<__D>,
            I::Term: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                NormalizesTo {
                    alias: ::rustc_serialize::Decodable::decode(__decoder),
                    term: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for NormalizesTo<I> where
            AliasTerm<I>: ::rustc_serialize::Encodable<__E>,
            I::Term: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    NormalizesTo { alias: ref __binding_0, term: 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> ::rustc_data_structures::stable_hasher::HashStable
            for NormalizesTo<I> where
            AliasTerm<I>: ::rustc_data_structures::stable_hasher::HashStable,
            I::Term: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    NormalizesTo { alias: ref __binding_0, term: ref __binding_1
                        } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
944)]
945pub struct NormalizesTo<I: Interner> {
946    pub alias: AliasTerm<I>,
947    pub term: I::Term,
948}
949
950impl<I: Interner> Eq for NormalizesTo<I> {}
951
952impl<I: Interner> NormalizesTo<I> {
953    pub fn self_ty(self) -> I::Ty {
954        self.alias.self_ty()
955    }
956
957    pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> NormalizesTo<I> {
958        Self { alias: self.alias.with_replaced_self_ty(interner, self_ty), ..self }
959    }
960
961    pub fn trait_def_id(self, interner: I) -> I::TraitId {
962        self.alias.trait_def_id(interner)
963    }
964
965    pub fn def_id(self) -> I::DefId {
966        self.alias.def_id()
967    }
968}
969
970impl<I: Interner> fmt::Debug for NormalizesTo<I> {
971    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
972        f.write_fmt(format_args!("NormalizesTo({0:?}, {1:?})", self.alias, self.term))write!(f, "NormalizesTo({:?}, {:?})", self.alias, self.term)
973    }
974}
975
976#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for HostEffectPredicate<I> where
    I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            HostEffectPredicate {
                trait_ref: ref __field_trait_ref,
                constness: ref __field_constness } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f,
                        "HostEffectPredicate");
                ::core::fmt::DebugStruct::field(&mut __builder, "trait_ref",
                    __field_trait_ref);
                ::core::fmt::DebugStruct::field(&mut __builder, "constness",
                    __field_constness);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
977#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            HostEffectPredicate<I> where I: Interner,
            ty::TraitRef<I>: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    HostEffectPredicate {
                        trait_ref: ref __binding_0, constness: 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
            HostEffectPredicate<I> where I: Interner,
            ty::TraitRef<I>: ::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 {
                        HostEffectPredicate {
                            trait_ref: __binding_0, constness: __binding_1 } => {
                            HostEffectPredicate {
                                trait_ref: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                constness: ::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 {
                    HostEffectPredicate {
                        trait_ref: __binding_0, constness: __binding_1 } => {
                        HostEffectPredicate {
                            trait_ref: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            constness: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            HostEffectPredicate<I> where I: Interner, J: Interner,
            ty::TraitRef<I>: ::rustc_type_ir::lift::Lift<J, Lifted =
            ty::TraitRef<J>>,
            BoundConstness: ::rustc_type_ir::lift::Lift<J, Lifted =
            BoundConstness> {
            type Lifted = HostEffectPredicate<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        HostEffectPredicate {
                            trait_ref: __binding_0, constness: __binding_1 } => {
                            HostEffectPredicate {
                                trait_ref: __binding_0.lift_to_interner(interner)?,
                                constness: __binding_1.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
978#[cfg_attr(
979    feature = "nightly",
980    derive(const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for HostEffectPredicate<I> where
            ty::TraitRef<I>: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    HostEffectPredicate {
                        trait_ref: ref __binding_0, constness: 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 HostEffectPredicate<I> where
            ty::TraitRef<I>: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                HostEffectPredicate {
                    trait_ref: ::rustc_serialize::Decodable::decode(__decoder),
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hasher::HashStable
            for HostEffectPredicate<I> where
            ty::TraitRef<I>: ::rustc_data_structures::stable_hasher::HashStable
            {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    HostEffectPredicate {
                        trait_ref: ref __binding_0, constness: ref __binding_1 } =>
                        {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
981)]
982pub struct HostEffectPredicate<I: Interner> {
983    pub trait_ref: ty::TraitRef<I>,
984    pub constness: BoundConstness,
985}
986
987impl<I: Interner> Eq for HostEffectPredicate<I> {}
988
989impl<I: Interner> HostEffectPredicate<I> {
990    pub fn self_ty(self) -> I::Ty {
991        self.trait_ref.self_ty()
992    }
993
994    pub fn with_replaced_self_ty(self, interner: I, self_ty: I::Ty) -> Self {
995        Self { trait_ref: self.trait_ref.with_replaced_self_ty(interner, self_ty), ..self }
996    }
997
998    pub fn def_id(self) -> I::TraitId {
999        self.trait_ref.def_id
1000    }
1001}
1002
1003impl<I: Interner> ty::Binder<I, HostEffectPredicate<I>> {
1004    pub fn def_id(self) -> I::TraitId {
1005        // Ok to skip binder since trait `DefId` does not care about regions.
1006        self.skip_binder().def_id()
1007    }
1008
1009    pub fn self_ty(self) -> ty::Binder<I, I::Ty> {
1010        self.map_bound(|trait_ref| trait_ref.self_ty())
1011    }
1012
1013    #[inline]
1014    pub fn constness(self) -> BoundConstness {
1015        self.skip_binder().constness
1016    }
1017}
1018
1019/// Encodes that `a` must be a subtype of `b`. The `a_is_expected` flag indicates
1020/// whether the `a` type is the type that we should label as "expected" when
1021/// presenting user diagnostics.
1022#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for SubtypePredicate<I> where I: Interner
    {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            SubtypePredicate {
                a_is_expected: ref __field_a_is_expected,
                a: ref __field_a,
                b: ref __field_b } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f,
                        "SubtypePredicate");
                ::core::fmt::DebugStruct::field(&mut __builder,
                    "a_is_expected", __field_a_is_expected);
                ::core::fmt::DebugStruct::field(&mut __builder, "a",
                    __field_a);
                ::core::fmt::DebugStruct::field(&mut __builder, "b",
                    __field_b);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
1023#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            SubtypePredicate<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 {
                    SubtypePredicate {
                        a_is_expected: ref __binding_0,
                        a: ref __binding_1,
                        b: 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
            SubtypePredicate<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 {
                        SubtypePredicate {
                            a_is_expected: __binding_0, a: __binding_1, b: __binding_2 }
                            => {
                            SubtypePredicate {
                                a_is_expected: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                a: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                b: ::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 {
                    SubtypePredicate {
                        a_is_expected: __binding_0, a: __binding_1, b: __binding_2 }
                        => {
                        SubtypePredicate {
                            a_is_expected: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            a: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            b: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            SubtypePredicate<I> where I: Interner, J: Interner,
            bool: ::rustc_type_ir::lift::Lift<J, Lifted = bool>,
            I::Ty: ::rustc_type_ir::lift::Lift<J, Lifted = J::Ty>,
            I::Ty: ::rustc_type_ir::lift::Lift<J, Lifted = J::Ty> {
            type Lifted = SubtypePredicate<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        SubtypePredicate {
                            a_is_expected: __binding_0, a: __binding_1, b: __binding_2 }
                            => {
                            SubtypePredicate {
                                a_is_expected: __binding_0.lift_to_interner(interner)?,
                                a: __binding_1.lift_to_interner(interner)?,
                                b: __binding_2.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
1024#[cfg_attr(
1025    feature = "nightly",
1026    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for SubtypePredicate<I> where
            I::Ty: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                SubtypePredicate {
                    a_is_expected: ::rustc_serialize::Decodable::decode(__decoder),
                    a: ::rustc_serialize::Decodable::decode(__decoder),
                    b: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for SubtypePredicate<I> where
            I::Ty: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    SubtypePredicate {
                        a_is_expected: ref __binding_0,
                        a: ref __binding_1,
                        b: 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> ::rustc_data_structures::stable_hasher::HashStable
            for SubtypePredicate<I> where
            I::Ty: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    SubtypePredicate {
                        a_is_expected: ref __binding_0,
                        a: ref __binding_1,
                        b: ref __binding_2 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
1027)]
1028pub struct SubtypePredicate<I: Interner> {
1029    pub a_is_expected: bool,
1030    pub a: I::Ty,
1031    pub b: I::Ty,
1032}
1033
1034impl<I: Interner> Eq for SubtypePredicate<I> {}
1035
1036/// Encodes that we have to coerce *from* the `a` type to the `b` type.
1037#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for CoercePredicate<I> where I: Interner
    {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            CoercePredicate { a: ref __field_a, b: ref __field_b } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f,
                        "CoercePredicate");
                ::core::fmt::DebugStruct::field(&mut __builder, "a",
                    __field_a);
                ::core::fmt::DebugStruct::field(&mut __builder, "b",
                    __field_b);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
1038#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            CoercePredicate<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 {
                    CoercePredicate { a: ref __binding_0, b: 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
            CoercePredicate<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 {
                        CoercePredicate { a: __binding_0, b: __binding_1 } => {
                            CoercePredicate {
                                a: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                b: ::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 {
                    CoercePredicate { a: __binding_0, b: __binding_1 } => {
                        CoercePredicate {
                            a: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            b: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
            CoercePredicate<I> where I: Interner, J: Interner,
            I::Ty: ::rustc_type_ir::lift::Lift<J, Lifted = J::Ty>,
            I::Ty: ::rustc_type_ir::lift::Lift<J, Lifted = J::Ty> {
            type Lifted = CoercePredicate<J>;
            fn lift_to_interner(self, interner: J) -> Option<Self::Lifted> {
                Some(match self {
                        CoercePredicate { a: __binding_0, b: __binding_1 } => {
                            CoercePredicate {
                                a: __binding_0.lift_to_interner(interner)?,
                                b: __binding_1.lift_to_interner(interner)?,
                            }
                        }
                    })
            }
        }
    };Lift_Generic)]
1039#[cfg_attr(
1040    feature = "nightly",
1041    derive(const _: () =
    {
        impl<I: Interner, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for CoercePredicate<I> where
            I::Ty: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                CoercePredicate {
                    a: ::rustc_serialize::Decodable::decode(__decoder),
                    b: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for CoercePredicate<I> where
            I::Ty: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    CoercePredicate { a: ref __binding_0, b: 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> ::rustc_data_structures::stable_hasher::HashStable
            for CoercePredicate<I> where
            I::Ty: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    CoercePredicate { a: ref __binding_0, b: ref __binding_1 }
                        => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_NoContext)
1042)]
1043pub struct CoercePredicate<I: Interner> {
1044    pub a: I::Ty,
1045    pub b: I::Ty,
1046}
1047
1048impl<I: Interner> Eq for CoercePredicate<I> {}
1049
1050#[derive(#[automatically_derived]
impl ::core::clone::Clone for BoundConstness {
    #[inline]
    fn clone(&self) -> BoundConstness { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BoundConstness { }Copy, #[automatically_derived]
impl ::core::hash::Hash for BoundConstness {
    #[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::cmp::PartialEq for BoundConstness {
    #[inline]
    fn eq(&self, other: &BoundConstness) -> 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 BoundConstness {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for BoundConstness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                BoundConstness::Const => "Const",
                BoundConstness::Maybe => "Maybe",
            })
    }
}Debug)]
1051#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<__E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for BoundConstness {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BoundConstness::Const => { 0usize }
                        BoundConstness::Maybe => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BoundConstness::Const => {}
                    BoundConstness::Maybe => {}
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<__D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for BoundConstness {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BoundConstness::Const }
                    1usize => { BoundConstness::Maybe }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundConstness`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            BoundConstness {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    BoundConstness::Const => {}
                    BoundConstness::Maybe => {}
                }
            }
        }
    };HashStable))]
1052pub enum BoundConstness {
1053    /// `Type: const Trait`
1054    ///
1055    /// A bound is required to be unconditionally const, even in a runtime function.
1056    Const,
1057    /// `Type: [const] Trait`
1058    ///
1059    /// Requires resolving to const only when we are in a const context.
1060    Maybe,
1061}
1062
1063impl BoundConstness {
1064    pub fn satisfies(self, goal: BoundConstness) -> bool {
1065        match (self, goal) {
1066            (BoundConstness::Const, BoundConstness::Const | BoundConstness::Maybe) => true,
1067            (BoundConstness::Maybe, BoundConstness::Maybe) => true,
1068            (BoundConstness::Maybe, BoundConstness::Const) => false,
1069        }
1070    }
1071
1072    pub fn as_str(self) -> &'static str {
1073        match self {
1074            Self::Const => "const",
1075            Self::Maybe => "[const]",
1076        }
1077    }
1078}
1079
1080impl fmt::Display for BoundConstness {
1081    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1082        match self {
1083            Self::Const => f.write_str("const"),
1084            Self::Maybe => f.write_str("[const]"),
1085        }
1086    }
1087}