Skip to main content

rustc_type_ir/solve/
mod.rs

1pub mod inspect;
2
3use std::convert::Infallible;
4use std::fmt::Debug;
5use std::hash::Hash;
6
7use derive_where::derive_where;
8#[cfg(feature = "nightly")]
9use rustc_macros::{Decodable_NoContext, Encodable_NoContext, StableHash, StableHash_NoContext};
10use rustc_type_ir_macros::{
11    GenericTypeVisitable, Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic,
12};
13use tracing::debug;
14
15use crate::lang_items::SolverTraitLangItem;
16use crate::region_constraint::RegionConstraint;
17use crate::search_graph::PathKind;
18use crate::{
19    self as ty, Canonical, CanonicalVarValues, CantBeErased, Interner, TypingMode, Upcast,
20};
21
22pub type CanonicalInput<I, T = <I as Interner>::Predicate> =
23    ty::CanonicalQueryInput<I, QueryInput<I, T>>;
24pub type CanonicalResponse<I> = Canonical<I, Response<I>>;
25/// The result of evaluating a canonical query.
26///
27/// FIXME: We use a different type than the existing canonical queries. This is because
28/// we need to add a `Certainty` for `overflow` and may want to restructure this code without
29/// having to worry about changes to currently used code. Once we've made progress on this
30/// solver, merge the two responses again.
31pub type QueryResult<I> = Result<CanonicalResponse<I>, NoSolution>;
32pub type QueryResultOrRerunNonErased<I> = Result<CanonicalResponse<I>, NoSolutionOrRerunNonErased>;
33
34#[derive(#[automatically_derived]
impl ::core::marker::Copy for NoSolution { }Copy, #[automatically_derived]
impl ::core::clone::Clone for NoSolution {
    #[inline]
    fn clone(&self) -> NoSolution { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for NoSolution {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "NoSolution")
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for NoSolution {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for NoSolution {
    #[inline]
    fn eq(&self, other: &NoSolution) -> bool { true }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NoSolution {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq)]
35#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for NoSolution {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self { NoSolution => {} }
            }
        }
    };StableHash))]
36pub struct NoSolution;
37
38pub trait RerunResultExt<T> {
39    fn map_err_to_rerun(self) -> Result<Result<T, NoSolution>, RerunNonErased>;
40}
41
42impl<T> RerunResultExt<T> for Result<T, NoSolutionOrRerunNonErased> {
43    fn map_err_to_rerun(self) -> Result<Result<T, NoSolution>, RerunNonErased> {
44        match self {
45            Ok(i) => Ok(Ok(i)),
46            Err(NoSolutionOrRerunNonErased::NoSolution(NoSolution)) => Ok(Err(NoSolution)),
47            Err(NoSolutionOrRerunNonErased::RerunNonErased(e)) => Err(e),
48        }
49    }
50}
51
52/// A bit like [`NoSolution`], but for functions that normally cannot fail *unless* they accessed
53/// opaues. (See [`TypingMode::ErasedNotCoherence`]). Getting `OpaquesAccessed` doesn't mean there
54/// truly is no solution. It just means that we want to bail out of the current query as fast as
55/// possible, possibly by returning `NoSolution` if that's fastest. This is okay because when you get
56/// `OpaquesAccessed` we're guaranteed that we're going to retry this query in the original typing
57/// mode to get the correct answer.
58#[derive(#[automatically_derived]
impl ::core::marker::Copy for RerunNonErased { }Copy, #[automatically_derived]
impl ::core::clone::Clone for RerunNonErased {
    #[inline]
    fn clone(&self) -> RerunNonErased {
        let _: ::core::clone::AssertParamIsClone<()>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for RerunNonErased {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field1_finish(f, "RerunNonErased",
            &&self.0)
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for RerunNonErased {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for RerunNonErased {
    #[inline]
    fn eq(&self, other: &RerunNonErased) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RerunNonErased {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<()>;
    }
}Eq)]
59#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            RerunNonErased {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    RerunNonErased(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash))]
60pub struct RerunNonErased(());
61
62#[derive(#[automatically_derived]
impl ::core::marker::Copy for NoSolutionOrRerunNonErased { }Copy, #[automatically_derived]
impl ::core::clone::Clone for NoSolutionOrRerunNonErased {
    #[inline]
    fn clone(&self) -> NoSolutionOrRerunNonErased {
        let _: ::core::clone::AssertParamIsClone<NoSolution>;
        let _: ::core::clone::AssertParamIsClone<RerunNonErased>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for NoSolutionOrRerunNonErased {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            NoSolutionOrRerunNonErased::NoSolution(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "NoSolution", &__self_0),
            NoSolutionOrRerunNonErased::RerunNonErased(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "RerunNonErased", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for NoSolutionOrRerunNonErased {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            NoSolutionOrRerunNonErased::NoSolution(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            NoSolutionOrRerunNonErased::RerunNonErased(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for NoSolutionOrRerunNonErased {
    #[inline]
    fn eq(&self, other: &NoSolutionOrRerunNonErased) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (NoSolutionOrRerunNonErased::NoSolution(__self_0),
                    NoSolutionOrRerunNonErased::NoSolution(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (NoSolutionOrRerunNonErased::RerunNonErased(__self_0),
                    NoSolutionOrRerunNonErased::RerunNonErased(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NoSolutionOrRerunNonErased {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<NoSolution>;
        let _: ::core::cmp::AssertParamIsEq<RerunNonErased>;
    }
}Eq)]
63#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            NoSolutionOrRerunNonErased {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    NoSolutionOrRerunNonErased::NoSolution(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    NoSolutionOrRerunNonErased::RerunNonErased(ref __binding_0)
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash))]
64pub enum NoSolutionOrRerunNonErased {
65    NoSolution(NoSolution),
66    RerunNonErased(RerunNonErased),
67}
68
69impl From<NoSolution> for NoSolutionOrRerunNonErased {
70    fn from(value: NoSolution) -> Self {
71        Self::NoSolution(value)
72    }
73}
74
75impl From<RerunNonErased> for NoSolutionOrRerunNonErased {
76    fn from(value: RerunNonErased) -> Self {
77        Self::RerunNonErased(value)
78    }
79}
80
81#[derive(#[automatically_derived]
impl<T: ::core::marker::Copy + Copy + Debug + Hash + Eq> ::core::marker::Copy
    for SmallCopyList<T> {
}Copy, #[automatically_derived]
impl<T: ::core::clone::Clone + Copy + Debug + Hash + Eq> ::core::clone::Clone
    for SmallCopyList<T> {
    #[inline]
    fn clone(&self) -> SmallCopyList<T> {
        match self {
            SmallCopyList::Empty => SmallCopyList::Empty,
            SmallCopyList::One(__self_0) =>
                SmallCopyList::One(::core::clone::Clone::clone(__self_0)),
            SmallCopyList::Two(__self_0) =>
                SmallCopyList::Two(::core::clone::Clone::clone(__self_0)),
            SmallCopyList::Three(__self_0) =>
                SmallCopyList::Three(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl<T: ::core::fmt::Debug + Copy + Debug + Hash + Eq> ::core::fmt::Debug for
    SmallCopyList<T> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            SmallCopyList::Empty =>
                ::core::fmt::Formatter::write_str(f, "Empty"),
            SmallCopyList::One(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "One",
                    &__self_0),
            SmallCopyList::Two(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Two",
                    &__self_0),
            SmallCopyList::Three(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Three",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl<T: ::core::hash::Hash + Copy + Debug + Hash + Eq> ::core::hash::Hash for
    SmallCopyList<T> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            SmallCopyList::One(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            SmallCopyList::Two(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            SmallCopyList::Three(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl<T: ::core::cmp::PartialEq + Copy + Debug + Hash + Eq>
    ::core::cmp::PartialEq for SmallCopyList<T> {
    #[inline]
    fn eq(&self, other: &SmallCopyList<T>) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (SmallCopyList::One(__self_0), SmallCopyList::One(__arg1_0))
                    => __self_0 == __arg1_0,
                (SmallCopyList::Two(__self_0), SmallCopyList::Two(__arg1_0))
                    => __self_0 == __arg1_0,
                (SmallCopyList::Three(__self_0),
                    SmallCopyList::Three(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl<T: ::core::cmp::Eq + Copy + Debug + Hash + Eq> ::core::cmp::Eq for
    SmallCopyList<T> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<[T; 1]>;
        let _: ::core::cmp::AssertParamIsEq<[T; 2]>;
        let _: ::core::cmp::AssertParamIsEq<[T; 3]>;
    }
}Eq)]
82#[derive(const _: () =
    {
        impl<T: Copy + Debug + Hash + Eq, I> ::rustc_type_ir::TypeVisitable<I>
            for SmallCopyList<T> where I: Interner,
            [T; 1]: ::rustc_type_ir::TypeVisitable<I>,
            [T; 2]: ::rustc_type_ir::TypeVisitable<I>,
            [T; 3]: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    SmallCopyList::Empty => {}
                    SmallCopyList::One(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);
                                }
                            }
                        }
                    }
                    SmallCopyList::Two(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);
                                }
                            }
                        }
                    }
                    SmallCopyList::Three(ref __binding_0) => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        impl<T: Copy + Debug + Hash + Eq, I> ::rustc_type_ir::TypeFoldable<I>
            for SmallCopyList<T> where I: Interner,
            [T; 1]: ::rustc_type_ir::TypeFoldable<I>,
            [T; 2]: ::rustc_type_ir::TypeFoldable<I>,
            [T; 3]: ::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 {
                        SmallCopyList::Empty => { SmallCopyList::Empty }
                        SmallCopyList::One(__binding_0) => {
                            SmallCopyList::One(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        SmallCopyList::Two(__binding_0) => {
                            SmallCopyList::Two(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        SmallCopyList::Three(__binding_0) => {
                            SmallCopyList::Three(::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 {
                    SmallCopyList::Empty => { SmallCopyList::Empty }
                    SmallCopyList::One(__binding_0) => {
                        SmallCopyList::One(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    SmallCopyList::Two(__binding_0) => {
                        SmallCopyList::Two(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    SmallCopyList::Three(__binding_0) => {
                        SmallCopyList::Three(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable_Generic, GenericTypeVisitable)]
83#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<T: Copy + Debug + Hash + Eq>
            ::rustc_data_structures::stable_hash::StableHash for
            SmallCopyList<T> where
            [T; 1]: ::rustc_data_structures::stable_hash::StableHash,
            [T; 2]: ::rustc_data_structures::stable_hash::StableHash,
            [T; 3]: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    SmallCopyList::Empty => {}
                    SmallCopyList::One(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    SmallCopyList::Two(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    SmallCopyList::Three(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext))]
84pub enum SmallCopyList<T: Copy + Debug + Hash + Eq> {
85    Empty,
86    One([T; 1]),
87    Two([T; 2]),
88    Three([T; 3]),
89}
90
91impl<T: Copy + Debug + Hash + Eq> SmallCopyList<T> {
92    fn empty() -> Self {
93        Self::Empty
94    }
95
96    fn new(first: T) -> Self {
97        Self::One([first])
98    }
99
100    /// Computes the union of two lists. Duplicates are removed.
101    fn union(self, other: Self) -> Option<Self> {
102        match (self, other) {
103            (Self::Empty, other) | (other, Self::Empty) => Some(other),
104
105            (Self::One([a]), Self::One([b])) if a == b => Some(Self::One([a])),
106            (Self::One([a]), Self::One([b])) => Some(Self::Two([a, b])),
107            (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c]))
108                if a == b && b == c =>
109            {
110                Some(Self::One([a]))
111            }
112            (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if a == b => {
113                Some(Self::Two([a, c]))
114            }
115            (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if a == c => {
116                Some(Self::Two([a, b]))
117            }
118            (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if b == c => {
119                Some(Self::Two([a, b]))
120            }
121            (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) => {
122                Some(Self::Three([a, b, c]))
123            }
124            _ => None,
125        }
126    }
127}
128
129impl<T: Copy + Debug + Hash + Eq> AsRef<[T]> for SmallCopyList<T> {
130    fn as_ref(&self) -> &[T] {
131        match self {
132            Self::Empty => &[],
133            Self::One(l) => l,
134            Self::Two(l) => l,
135            Self::Three(l) => l,
136        }
137    }
138}
139
140/// Information about how we accessed opaque types
141/// This is what the trait solver does when each states is encountered:
142///
143/// |                         | bail? | rerun goal?                                                                                                          |
144/// | ----------------------- | ----- | -------------------------------------------------------------------------------------------------------------------- |
145/// | never                   | no    | no                                                                                                                   |
146/// | always                  | yes   | yes                                                                                                                  |
147/// | [defid in storage]      | no    | only if any of the defids in the list is in the opaque type storage OR if TypingMode::PostAnalysis                   |
148/// | opaque with hidden type | no    | only if any of the the opaques in the opaque type storage has a hidden type in this list AND if TypingMode::Analysis |
149///
150/// - "bail" is implemented with [`should_bail`](Self::should_bail).
151///   If true, we're abandoning our attempt to canonicalize in [`TypingMode::ErasedNotCoherence`],
152///   and should try to return as soon as possible to waste as little time as possible.
153///   A rerun will be attempted in the original typing mode.
154///
155/// - Rerun goal is implemented with `should_rerun_after_erased_canonicalization`, on the `EvalCtxt`.
156///
157/// Some variant names contain an `Or` here. They rerun when any of the two conditions applies
158#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for RerunCondition<I> where I: Interner { }#[derive_where(Copy, Clone, Debug, Hash, PartialEq, Eq; I: Interner)]
159#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            RerunCondition<I> where I: Interner,
            SmallCopyList<I::LocalDefId>: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    RerunCondition::Never => {}
                    RerunCondition::AnyOpaqueHasInferAsHidden => {}
                    RerunCondition::OpaqueInStorage(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);
                                }
                            }
                        }
                    }
                    RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(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);
                                }
                            }
                        }
                    }
                    RerunCondition::Always => {}
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
            RerunCondition<I> where I: Interner,
            SmallCopyList<I::LocalDefId>: ::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 {
                        RerunCondition::Never => { RerunCondition::Never }
                        RerunCondition::AnyOpaqueHasInferAsHidden => {
                            RerunCondition::AnyOpaqueHasInferAsHidden
                        }
                        RerunCondition::OpaqueInStorage(__binding_0) => {
                            RerunCondition::OpaqueInStorage(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(__binding_0)
                            => {
                            RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        RerunCondition::Always => { RerunCondition::Always }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    RerunCondition::Never => { RerunCondition::Never }
                    RerunCondition::AnyOpaqueHasInferAsHidden => {
                        RerunCondition::AnyOpaqueHasInferAsHidden
                    }
                    RerunCondition::OpaqueInStorage(__binding_0) => {
                        RerunCondition::OpaqueInStorage(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(__binding_0)
                        => {
                        RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    RerunCondition::Always => { RerunCondition::Always }
                }
            }
        }
    };TypeFoldable_Generic, GenericTypeVisitable)]
160#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            RerunCondition<I> where
            SmallCopyList<I::LocalDefId>: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    RerunCondition::Never => {}
                    RerunCondition::AnyOpaqueHasInferAsHidden => {}
                    RerunCondition::OpaqueInStorage(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __binding_0)
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    RerunCondition::Always => {}
                }
            }
        }
    };StableHash_NoContext))]
161pub enum RerunCondition<I: Interner> {
162    Never,
163
164    /// Note that this only reruns according to the condition *if* we are in [`TypingMode::Analysis`].
165    AnyOpaqueHasInferAsHidden,
166    /// Note: unconditionally reruns in postanalysis
167    OpaqueInStorage(SmallCopyList<I::LocalDefId>),
168
169    /// Merges [`Self::AnyOpaqueHasInferAsHidden`] and [`Self::OpaqueInStorage`].
170    /// Note that just like the unmerged [`Self::OpaqueInStorage`], that part of the
171    /// condition only matters in [`TypingMode::Analysis`]
172    OpaqueInStorageOrAnyOpaqueHasInferAsHidden(SmallCopyList<I::LocalDefId>),
173
174    Always,
175}
176
177impl<I: Interner> RerunCondition<I> {
178    /// Merge two rerun states according to the following transition diagram
179    /// (some cells are empty because the table is symmetric, i.e. `a.merge(b)` == `b.merge(a)`).
180    ///
181    /// - "self" here means the current state, i.e. the state of the current column
182    /// - square brackets represents that this is a list of things. Even if the state doesn't
183    /// change, we might grow the list to effectively end up in a different state anyway
184    /// - `[o. in s.]` abbreviates "opaque in storage"
185    ///
186    ///
187    /// |                                 | never  | always | [opaque in storage] | opaque has infer as hidden | [o. in s.] or i. as hidden |
188    /// | ------------------------------- | ------ | ------ | ------------------- | -------------------------- | -------------------------- |
189    /// | never                           | self   | self   | self                | self                       | self                       |
190    /// | always                          |        | always | always              | always                     | always                     |
191    /// | [opaque in storage]             |        |        | concat self         | [o. in s.] or i. as hidden | concat to self             |
192    /// | opaque has infer as hidden type |        |        |                     | self                       | to self                    |
193    ///
194    fn merge(self, other: Self) -> Self {
195        let merged = match (self, other) {
196            (Self::Never, other) | (other, Self::Never) => other,
197            (Self::Always, _) | (_, Self::Always) => Self::Always,
198
199            (Self::OpaqueInStorage(a), Self::OpaqueInStorage(b)) => {
200                a.union(b).map(Self::OpaqueInStorage).unwrap_or(Self::Always)
201            }
202            (Self::AnyOpaqueHasInferAsHidden, Self::AnyOpaqueHasInferAsHidden) => {
203                Self::AnyOpaqueHasInferAsHidden
204            }
205            (
206                Self::AnyOpaqueHasInferAsHidden,
207                Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
208            )
209            | (
210                Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
211                Self::AnyOpaqueHasInferAsHidden,
212            ) => Self::OpaqueInStorage(a),
213
214            (
215                Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
216                Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b),
217            ) => a
218                .union(b)
219                .map(Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden)
220                .unwrap_or(Self::Always),
221
222            (Self::OpaqueInStorage(a), Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b))
223            | (Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b), Self::OpaqueInStorage(a)) => a
224                .union(b)
225                .map(Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden)
226                .unwrap_or(Self::Always),
227
228            (Self::OpaqueInStorage(a), Self::AnyOpaqueHasInferAsHidden)
229            | (Self::AnyOpaqueHasInferAsHidden, Self::OpaqueInStorage(a)) => {
230                Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a)
231            }
232        };
233        {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:233",
                        "rustc_type_ir::solve", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
                        ::tracing_core::__macro_support::Option::Some(233u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                let mut iter = __CALLSITE.metadata().fields().iter();
                __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                    ::tracing::__macro_support::Option::Some(&format_args!("merging rerun state {0:?} + {1:?} => {2:?}",
                                                    self, other, merged) as &dyn Value))])
            });
    } else { ; }
};debug!("merging rerun state {self:?} + {other:?} => {merged:?}");
234        merged
235    }
236
237    #[must_use]
238    fn should_bail(&self) -> Result<(), RerunNonErased> {
239        match self {
240            Self::Always => Err(RerunNonErased(())),
241            Self::Never
242            | Self::OpaqueInStorage(_)
243            | Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(_)
244            | Self::AnyOpaqueHasInferAsHidden => Ok(()),
245        }
246    }
247
248    /// Returns true when any access of opaques was attempted.
249    /// i.e. when `self != Self::Never`
250    #[must_use]
251    fn might_rerun(&self) -> bool {
252        match self {
253            Self::Never => false,
254            Self::Always
255            | Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(_)
256            | Self::OpaqueInStorage(_)
257            | Self::AnyOpaqueHasInferAsHidden => true,
258        }
259    }
260}
261
262/// Mainly for debugging, to keep track of the source of the rerunning
263/// in [`TypingMode::ErasedNotCoherence`].
264#[derive(#[automatically_derived]
impl ::core::marker::Copy for RerunReason { }Copy, #[automatically_derived]
impl ::core::clone::Clone for RerunReason {
    #[inline]
    fn clone(&self) -> RerunReason { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for RerunReason {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RerunReason::NormalizeOpaqueTypeRemoteCrate =>
                    "NormalizeOpaqueTypeRemoteCrate",
                RerunReason::NormalizeOpaqueType => "NormalizeOpaqueType",
                RerunReason::MayUseUnstableFeature => "MayUseUnstableFeature",
                RerunReason::EvaluateConst => "EvaluateConst",
                RerunReason::SkipErasedAttempt => "SkipErasedAttempt",
                RerunReason::SelfTyInfer => "SelfTyInfer",
                RerunReason::FetchEligibleAssocItem =>
                    "FetchEligibleAssocItem",
                RerunReason::AutoTraitLeakage => "AutoTraitLeakage",
                RerunReason::TryStallCoroutine => "TryStallCoroutine",
            })
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for RerunReason {
    #[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 RerunReason {
    #[inline]
    fn eq(&self, other: &RerunReason) -> 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 RerunReason {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq)]
265#[derive(const _: () =
    {
        impl<I> ::rustc_type_ir::TypeVisitable<I> for RerunReason where
            I: Interner {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    RerunReason::NormalizeOpaqueTypeRemoteCrate => {}
                    RerunReason::NormalizeOpaqueType => {}
                    RerunReason::MayUseUnstableFeature => {}
                    RerunReason::EvaluateConst => {}
                    RerunReason::SkipErasedAttempt => {}
                    RerunReason::SelfTyInfer => {}
                    RerunReason::FetchEligibleAssocItem => {}
                    RerunReason::AutoTraitLeakage => {}
                    RerunReason::TryStallCoroutine => {}
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, GenericTypeVisitable)]
266#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for RerunReason
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    RerunReason::NormalizeOpaqueTypeRemoteCrate => {}
                    RerunReason::NormalizeOpaqueType => {}
                    RerunReason::MayUseUnstableFeature => {}
                    RerunReason::EvaluateConst => {}
                    RerunReason::SkipErasedAttempt => {}
                    RerunReason::SelfTyInfer => {}
                    RerunReason::FetchEligibleAssocItem => {}
                    RerunReason::AutoTraitLeakage => {}
                    RerunReason::TryStallCoroutine => {}
                }
            }
        }
    };StableHash_NoContext))]
267pub enum RerunReason {
268    NormalizeOpaqueTypeRemoteCrate,
269    NormalizeOpaqueType,
270    MayUseUnstableFeature,
271    EvaluateConst,
272    SkipErasedAttempt,
273    SelfTyInfer,
274    FetchEligibleAssocItem,
275    AutoTraitLeakage,
276    TryStallCoroutine,
277}
278
279#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for AccessedOpaques<I> where I: Interner { }#[derive_where(Copy, Clone, Debug, Hash, PartialEq, Eq; I: Interner)]
280#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            AccessedOpaques<I> where I: Interner,
            RerunCondition<I>: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    AccessedOpaques { rerun: ref __binding_1, .. } => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
            AccessedOpaques<I> where I: Interner,
            RerunCondition<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 {
                        AccessedOpaques { reason: __binding_0, rerun: __binding_1 }
                            => {
                            AccessedOpaques {
                                reason: __binding_0,
                                rerun: ::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 {
                    AccessedOpaques { reason: __binding_0, rerun: __binding_1 }
                        => {
                        AccessedOpaques {
                            reason: __binding_0,
                            rerun: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, GenericTypeVisitable)]
281#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            AccessedOpaques<I> where
            RerunCondition<I>: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    AccessedOpaques {
                        reason: ref __binding_0, rerun: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext))]
282pub struct AccessedOpaques<I: Interner> {
283    #[cfg_attr(feature = "nightly", type_visitable(ignore))]
284    #[type_foldable(identity)]
285    pub reason: Option<RerunReason>,
286    pub rerun: RerunCondition<I>,
287}
288
289impl<I: Interner> Default for AccessedOpaques<I> {
290    fn default() -> Self {
291        Self { reason: None, rerun: RerunCondition::Never }
292    }
293}
294
295impl<I: Interner> AccessedOpaques<I> {
296    pub fn update(&mut self, other: Self) -> Result<(), RerunNonErased> {
297        *self = Self {
298            // prefer the newest reason
299            reason: other.reason.or(self.reason),
300            // merging accessed states can only result in MultipleOrUnknown
301            rerun: self.rerun.merge(other.rerun),
302        };
303
304        self.should_bail()
305    }
306
307    #[must_use]
308    pub fn might_rerun(&self) -> bool {
309        self.rerun.might_rerun()
310    }
311
312    #[must_use]
313    pub fn should_bail(&self) -> Result<(), RerunNonErased> {
314        self.rerun.should_bail()
315    }
316
317    pub fn rerun_always(&mut self, reason: RerunReason) -> Result<Infallible, RerunNonErased> {
318        {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:318",
                        "rustc_type_ir::solve", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
                        ::tracing_core::__macro_support::Option::Some(318u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                let mut iter = __CALLSITE.metadata().fields().iter();
                __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                    ::tracing::__macro_support::Option::Some(&format_args!("set rerun always")
                                            as &dyn Value))])
            });
    } else { ; }
};debug!("set rerun always");
319        match self.update(AccessedOpaques { reason: Some(reason), rerun: RerunCondition::Always }) {
320            Ok(_) => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
321            Err(e) => Err(e),
322        }
323    }
324
325    pub fn rerun_if_in_post_analysis(&mut self, reason: RerunReason) -> Result<(), RerunNonErased> {
326        {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:326",
                        "rustc_type_ir::solve", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
                        ::tracing_core::__macro_support::Option::Some(326u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                let mut iter = __CALLSITE.metadata().fields().iter();
                __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                    ::tracing::__macro_support::Option::Some(&format_args!("set rerun if post analysis")
                                            as &dyn Value))])
            });
    } else { ; }
};debug!("set rerun if post analysis");
327        self.update(AccessedOpaques {
328            reason: Some(reason),
329            rerun: RerunCondition::OpaqueInStorage(SmallCopyList::empty()),
330        })
331    }
332
333    pub fn rerun_if_opaque_in_opaque_type_storage(
334        &mut self,
335        reason: RerunReason,
336        defid: I::LocalDefId,
337    ) -> Result<(), RerunNonErased> {
338        {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:338",
                        "rustc_type_ir::solve", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
                        ::tracing_core::__macro_support::Option::Some(338u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                let mut iter = __CALLSITE.metadata().fields().iter();
                __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                    ::tracing::__macro_support::Option::Some(&format_args!("set rerun if opaque type {0:?} in storage",
                                                    defid) as &dyn Value))])
            });
    } else { ; }
};debug!("set rerun if opaque type {defid:?} in storage");
339        self.update(AccessedOpaques {
340            reason: Some(reason),
341            rerun: RerunCondition::OpaqueInStorage(SmallCopyList::new(defid)),
342        })
343    }
344
345    pub fn rerun_if_any_opaque_has_infer_as_hidden_type(
346        &mut self,
347        reason: RerunReason,
348    ) -> Result<(), RerunNonErased> {
349        {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:349",
                        "rustc_type_ir::solve", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
                        ::tracing_core::__macro_support::Option::Some(349u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                let mut iter = __CALLSITE.metadata().fields().iter();
                __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                    ::tracing::__macro_support::Option::Some(&format_args!("set rerun if any opaque in the storage has a hidden type that is an infer var")
                                            as &dyn Value))])
            });
    } else { ; }
};debug!("set rerun if any opaque in the storage has a hidden type that is an infer var");
350        self.update(AccessedOpaques {
351            reason: Some(reason),
352            rerun: RerunCondition::AnyOpaqueHasInferAsHidden,
353        })
354    }
355}
356
357/// A goal is a statement, i.e. `predicate`, we want to prove
358/// given some assumptions, i.e. `param_env`.
359///
360/// Most of the time the `param_env` contains the `where`-bounds of the function
361/// we're currently typechecking while the `predicate` is some trait bound.
362#[automatically_derived]
impl<I: Interner, P> ::core::marker::Copy for Goal<I, P> where I: Interner,
    P: Copy {
}#[derive_where(Clone, Hash, PartialEq, Debug; I: Interner, P)]
363#[derive_where(Copy; I: Interner, P: Copy)]
364#[derive(const _: () =
    {
        impl<I: Interner, P> ::rustc_type_ir::TypeVisitable<I> for Goal<I, P>
            where I: Interner, I::ParamEnv: ::rustc_type_ir::TypeVisitable<I>,
            P: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    Goal {
                        param_env: ref __binding_0, predicate: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        impl<I: Interner, P> ::rustc_type_ir::TypeFoldable<I> for Goal<I, P>
            where I: Interner, I::ParamEnv: ::rustc_type_ir::TypeFoldable<I>,
            P: ::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 {
                        Goal { param_env: __binding_0, predicate: __binding_1 } => {
                            Goal {
                                param_env: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                predicate: ::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 {
                    Goal { param_env: __binding_0, predicate: __binding_1 } => {
                        Goal {
                            param_env: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            predicate: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, const _: () =
    {
        impl<I: Interner, P, J> ::rustc_type_ir::lift::Lift<J> for Goal<I, P>
            where I: Interner, J: Interner,
            I::ParamEnv: ::rustc_type_ir::lift::Lift<J, Lifted = J::ParamEnv>,
            P: ::rustc_type_ir::lift::Lift<J, Lifted = P> {
            type Lifted = Goal<J, P>;
            fn lift_to_interner(self, interner: J) -> Self::Lifted {
                match self {
                    Goal { param_env: __binding_0, predicate: __binding_1 } => {
                        Goal {
                            param_env: __binding_0.lift_to_interner(interner),
                            predicate: __binding_1.lift_to_interner(interner),
                        }
                    }
                }
            }
        }
    };Lift_Generic, GenericTypeVisitable)]
365#[cfg_attr(
366    feature = "nightly",
367    derive(const _: () =
    {
        impl<I: Interner, P, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for Goal<I, P> where
            I::ParamEnv: ::rustc_serialize::Decodable<__D>,
            P: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                Goal {
                    param_env: ::rustc_serialize::Decodable::decode(__decoder),
                    predicate: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, P, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for Goal<I, P> where
            I::ParamEnv: ::rustc_serialize::Encodable<__E>,
            P: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    Goal {
                        param_env: ref __binding_0, predicate: 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, P> ::rustc_data_structures::stable_hash::StableHash
            for Goal<I, P> where
            I::ParamEnv: ::rustc_data_structures::stable_hash::StableHash,
            P: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    Goal {
                        param_env: ref __binding_0, predicate: ref __binding_1 } =>
                        {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
368)]
369pub struct Goal<I: Interner, P> {
370    pub param_env: I::ParamEnv,
371    pub predicate: P,
372}
373
374impl<I: Interner, P: Eq> Eq for Goal<I, P> {}
375
376impl<I: Interner, P> Goal<I, P> {
377    pub fn new(cx: I, param_env: I::ParamEnv, predicate: impl Upcast<I, P>) -> Goal<I, P> {
378        Goal { param_env, predicate: predicate.upcast(cx) }
379    }
380
381    /// Updates the goal to one with a different `predicate` but the same `param_env`.
382    pub fn with<Q>(self, cx: I, predicate: impl Upcast<I, Q>) -> Goal<I, Q> {
383        Goal { param_env: self.param_env, predicate: predicate.upcast(cx) }
384    }
385}
386
387/// Why a specific goal has to be proven.
388///
389/// This is necessary as we treat nested goals different depending on
390/// their source. This is used to decide whether a cycle is coinductive.
391/// See the documentation of `EvalCtxt::step_kind_for_source` for more details
392/// about this.
393///
394/// It is also used by proof tree visitors, e.g. for diagnostics purposes.
395#[derive(#[automatically_derived]
impl ::core::marker::Copy for GoalSource { }Copy, #[automatically_derived]
impl ::core::clone::Clone for GoalSource {
    #[inline]
    fn clone(&self) -> GoalSource {
        let _: ::core::clone::AssertParamIsClone<PathKind>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for GoalSource {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GoalSource::Misc => ::core::fmt::Formatter::write_str(f, "Misc"),
            GoalSource::TypeRelating =>
                ::core::fmt::Formatter::write_str(f, "TypeRelating"),
            GoalSource::ImplWhereBound =>
                ::core::fmt::Formatter::write_str(f, "ImplWhereBound"),
            GoalSource::AliasBoundConstCondition =>
                ::core::fmt::Formatter::write_str(f,
                    "AliasBoundConstCondition"),
            GoalSource::AliasWellFormed =>
                ::core::fmt::Formatter::write_str(f, "AliasWellFormed"),
            GoalSource::NormalizeGoal(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "NormalizeGoal", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for GoalSource {
    #[inline]
    fn eq(&self, other: &GoalSource) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (GoalSource::NormalizeGoal(__self_0),
                    GoalSource::NormalizeGoal(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for GoalSource {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<PathKind>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for GoalSource {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            GoalSource::NormalizeGoal(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash)]
396#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for GoalSource {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    GoalSource::Misc => {}
                    GoalSource::TypeRelating => {}
                    GoalSource::ImplWhereBound => {}
                    GoalSource::AliasBoundConstCondition => {}
                    GoalSource::AliasWellFormed => {}
                    GoalSource::NormalizeGoal(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash))]
397pub enum GoalSource {
398    Misc,
399    /// A nested goal required to prove that types are equal/subtypes.
400    /// This is always an unproductive step.
401    ///
402    /// This is also used for all `NormalizesTo` goals as we they are used
403    /// to relate types in `AliasRelate`.
404    TypeRelating,
405    /// We're proving a where-bound of an impl.
406    ImplWhereBound,
407    /// Const conditions that need to hold for `[const]` alias bounds to hold.
408    AliasBoundConstCondition,
409    /// Predicate required for an alias projection to be well-formed.
410    /// This is used in three places:
411    /// 1. projecting to an opaque whose hidden type is already registered in
412    ///    the opaque type storage,
413    /// 2. for rigid projections's trait goal,
414    /// 3. for GAT where clauses.
415    AliasWellFormed,
416    /// In case normalizing aliases in nested goals cycles, eagerly normalizing these
417    /// aliases in the context of the parent may incorrectly change the cycle kind.
418    /// Normalizing aliases in goals therefore tracks the original path kind for this
419    /// nested goal. See the comment of the `ReplaceAliasWithInfer` visitor for more
420    /// details.
421    NormalizeGoal(PathKind),
422}
423
424#[automatically_derived]
impl<I: Interner, P> ::core::marker::Copy for QueryInput<I, P> where
    I: Interner, Goal<I, P>: Copy {
}#[derive_where(Clone, Hash, PartialEq, Debug; I: Interner, Goal<I, P>)]
425#[derive_where(Copy; I: Interner, Goal<I, P>: Copy)]
426#[derive(const _: () =
    {
        impl<I: Interner, P> ::rustc_type_ir::TypeVisitable<I> for
            QueryInput<I, P> where I: Interner,
            Goal<I, P>: ::rustc_type_ir::TypeVisitable<I>,
            I::PredefinedOpaques: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    QueryInput {
                        goal: ref __binding_0,
                        predefined_opaques_in_body: ref __binding_1 } => {
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_type_ir::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, const _: () =
    {
        impl<I: Interner, P> ::rustc_type_ir::TypeFoldable<I> for
            QueryInput<I, P> where I: Interner,
            Goal<I, P>: ::rustc_type_ir::TypeFoldable<I>,
            I::PredefinedOpaques: ::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 {
                        QueryInput {
                            goal: __binding_0, predefined_opaques_in_body: __binding_1 }
                            => {
                            QueryInput {
                                goal: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                predefined_opaques_in_body: ::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 {
                    QueryInput {
                        goal: __binding_0, predefined_opaques_in_body: __binding_1 }
                        => {
                        QueryInput {
                            goal: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            predefined_opaques_in_body: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic, GenericTypeVisitable)]
427#[cfg_attr(
428    feature = "nightly",
429    derive(const _: () =
    {
        impl<I: Interner, P, __D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for QueryInput<I, P> where
            Goal<I, P>: ::rustc_serialize::Decodable<__D>,
            I::PredefinedOpaques: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                QueryInput {
                    goal: ::rustc_serialize::Decodable::decode(__decoder),
                    predefined_opaques_in_body: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable_NoContext, const _: () =
    {
        impl<I: Interner, P, __E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for QueryInput<I, P> where
            Goal<I, P>: ::rustc_serialize::Encodable<__E>,
            I::PredefinedOpaques: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    QueryInput {
                        goal: ref __binding_0,
                        predefined_opaques_in_body: 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, P> ::rustc_data_structures::stable_hash::StableHash
            for QueryInput<I, P> where
            Goal<I, P>: ::rustc_data_structures::stable_hash::StableHash,
            I::PredefinedOpaques: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    QueryInput {
                        goal: ref __binding_0,
                        predefined_opaques_in_body: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext)
430)]
431pub struct QueryInput<I: Interner, P> {
432    pub goal: Goal<I, P>,
433    pub predefined_opaques_in_body: I::PredefinedOpaques,
434}
435
436impl<I: Interner, P: Eq> Eq for QueryInput<I, P> {}
437
438/// Which trait candidates should be preferred over other candidates? By default, prefer where
439/// bounds over alias bounds. For marker traits, prefer alias bounds over where bounds.
440#[derive(#[automatically_derived]
impl ::core::clone::Clone for CandidatePreferenceMode {
    #[inline]
    fn clone(&self) -> CandidatePreferenceMode { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CandidatePreferenceMode { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for CandidatePreferenceMode {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                CandidatePreferenceMode::Default => "Default",
                CandidatePreferenceMode::Marker => "Marker",
            })
    }
}Debug)]
441pub enum CandidatePreferenceMode {
442    /// Prefers where bounds over alias bounds
443    Default,
444    /// Prefers alias bounds over where bounds
445    Marker,
446}
447
448impl CandidatePreferenceMode {
449    /// Given `trait_def_id`, which candidate preference mode should be used?
450    pub fn compute<I: Interner>(cx: I, trait_id: I::TraitId) -> CandidatePreferenceMode {
451        let is_sizedness_or_auto_or_default_goal = cx.is_sizedness_trait(trait_id)
452            || cx.trait_is_auto(trait_id)
453            || cx.is_default_trait(trait_id);
454        if is_sizedness_or_auto_or_default_goal {
455            CandidatePreferenceMode::Marker
456        } else {
457            CandidatePreferenceMode::Default
458        }
459    }
460}
461
462/// Possible ways the given goal can be proven.
463#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for CandidateSource<I> where I: Interner
    {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            CandidateSource::Impl(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "Impl");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            CandidateSource::BuiltinImpl(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "BuiltinImpl");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            CandidateSource::ParamEnv(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "ParamEnv");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            CandidateSource::AliasBound(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "AliasBound");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            CandidateSource::CoherenceUnknowable =>
                ::core::fmt::Formatter::write_str(__f, "CoherenceUnknowable"),
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
464pub enum CandidateSource<I: Interner> {
465    /// A user written impl.
466    ///
467    /// ## Examples
468    ///
469    /// ```rust
470    /// fn main() {
471    ///     let x: Vec<u32> = Vec::new();
472    ///     // This uses the impl from the standard library to prove `Vec<T>: Clone`.
473    ///     let y = x.clone();
474    /// }
475    /// ```
476    Impl(I::ImplId),
477    /// A builtin impl generated by the compiler. When adding a new special
478    /// trait, try to use actual impls whenever possible. Builtin impls should
479    /// only be used in cases where the impl cannot be manually be written.
480    ///
481    /// Notable examples are auto traits, `Sized`, and `DiscriminantKind`.
482    /// For a list of all traits with builtin impls, check out the
483    /// `EvalCtxt::assemble_builtin_impl_candidates` method.
484    BuiltinImpl(BuiltinImplSource),
485    /// An assumption from the environment. Stores a [`ParamEnvSource`], since we
486    /// prefer non-global param-env candidates in candidate assembly.
487    ///
488    /// ## Examples
489    ///
490    /// ```rust
491    /// fn is_clone<T: Clone>(x: T) -> (T, T) {
492    ///     // This uses the assumption `T: Clone` from the `where`-bounds
493    ///     // to prove `T: Clone`.
494    ///     (x.clone(), x)
495    /// }
496    /// ```
497    ParamEnv(ParamEnvSource),
498    /// If the self type is an alias type, e.g. an opaque type or a projection,
499    /// we know the bounds on that alias to hold even without knowing its concrete
500    /// underlying type.
501    ///
502    /// More precisely this candidate is using the `n-th` bound in the `item_bounds` of
503    /// the self type.
504    ///
505    /// ## Examples
506    ///
507    /// ```rust
508    /// trait Trait {
509    ///     type Assoc: Clone;
510    /// }
511    ///
512    /// fn foo<T: Trait>(x: <T as Trait>::Assoc) {
513    ///     // We prove `<T as Trait>::Assoc` by looking at the bounds on `Assoc` in
514    ///     // in the trait definition.
515    ///     let _y = x.clone();
516    /// }
517    /// ```
518    AliasBound(AliasBoundKind),
519    /// A candidate that is registered only during coherence to represent some
520    /// yet-unknown impl that could be produced downstream without violating orphan
521    /// rules.
522    // FIXME: Merge this with the forced ambiguity candidates, so those don't use `Misc`.
523    CoherenceUnknowable,
524}
525
526impl<I: Interner> Eq for CandidateSource<I> {}
527
528#[derive(#[automatically_derived]
impl ::core::clone::Clone for ParamEnvSource {
    #[inline]
    fn clone(&self) -> ParamEnvSource { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ParamEnvSource { }Copy, #[automatically_derived]
impl ::core::hash::Hash for ParamEnvSource {
    #[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 ParamEnvSource {
    #[inline]
    fn eq(&self, other: &ParamEnvSource) -> 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 ParamEnvSource {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for ParamEnvSource {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                ParamEnvSource::NonGlobal => "NonGlobal",
                ParamEnvSource::Global => "Global",
            })
    }
}Debug)]
529pub enum ParamEnvSource {
530    /// Preferred eagerly.
531    NonGlobal,
532    // Not considered unless there are non-global param-env candidates too.
533    Global,
534}
535
536#[derive(#[automatically_derived]
impl ::core::clone::Clone for AliasBoundKind {
    #[inline]
    fn clone(&self) -> AliasBoundKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AliasBoundKind { }Copy, #[automatically_derived]
impl ::core::hash::Hash for AliasBoundKind {
    #[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 AliasBoundKind {
    #[inline]
    fn eq(&self, other: &AliasBoundKind) -> 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 AliasBoundKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for AliasBoundKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AliasBoundKind::SelfBounds => "SelfBounds",
                AliasBoundKind::NonSelfBounds => "NonSelfBounds",
            })
    }
}Debug)]
537#[derive(const _: () =
    {
        impl<I> ::rustc_type_ir::TypeVisitable<I> for AliasBoundKind where
            I: Interner {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    AliasBoundKind::SelfBounds => {}
                    AliasBoundKind::NonSelfBounds => {}
                }
                <__V::Result as ::rustc_type_ir::VisitorResult>::output()
            }
        }
    };TypeVisitable_Generic, GenericTypeVisitable, const _: () =
    {
        impl<I> ::rustc_type_ir::TypeFoldable<I> for AliasBoundKind where
            I: Interner {
            fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        AliasBoundKind::SelfBounds => { AliasBoundKind::SelfBounds }
                        AliasBoundKind::NonSelfBounds => {
                            AliasBoundKind::NonSelfBounds
                        }
                    })
            }
            fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    AliasBoundKind::SelfBounds => { AliasBoundKind::SelfBounds }
                    AliasBoundKind::NonSelfBounds => {
                        AliasBoundKind::NonSelfBounds
                    }
                }
            }
        }
    };TypeFoldable_Generic)]
538pub enum AliasBoundKind {
539    /// Alias bound from the self type of a projection
540    SelfBounds,
541    // Alias bound having recursed on the self type of a projection
542    NonSelfBounds,
543}
544
545#[derive(#[automatically_derived]
impl ::core::clone::Clone for BuiltinImplSource {
    #[inline]
    fn clone(&self) -> BuiltinImplSource {
        let _: ::core::clone::AssertParamIsClone<usize>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BuiltinImplSource { }Copy, #[automatically_derived]
impl ::core::hash::Hash for BuiltinImplSource {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            BuiltinImplSource::Object(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            BuiltinImplSource::TraitUpcasting(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for BuiltinImplSource {
    #[inline]
    fn eq(&self, other: &BuiltinImplSource) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BuiltinImplSource::Object(__self_0),
                    BuiltinImplSource::Object(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (BuiltinImplSource::TraitUpcasting(__self_0),
                    BuiltinImplSource::TraitUpcasting(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BuiltinImplSource {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<usize>;
    }
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for BuiltinImplSource {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BuiltinImplSource::Trivial =>
                ::core::fmt::Formatter::write_str(f, "Trivial"),
            BuiltinImplSource::Misc =>
                ::core::fmt::Formatter::write_str(f, "Misc"),
            BuiltinImplSource::Object(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Object",
                    &__self_0),
            BuiltinImplSource::TraitUpcasting(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TraitUpcasting", &__self_0),
        }
    }
}Debug)]
546#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            BuiltinImplSource {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    BuiltinImplSource::Trivial => {}
                    BuiltinImplSource::Misc => {}
                    BuiltinImplSource::Object(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    BuiltinImplSource::TraitUpcasting(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<__E: ::rustc_serialize::Encoder>
            ::rustc_serialize::Encodable<__E> for BuiltinImplSource {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BuiltinImplSource::Trivial => { 0usize }
                        BuiltinImplSource::Misc => { 1usize }
                        BuiltinImplSource::Object(ref __binding_0) => { 2usize }
                        BuiltinImplSource::TraitUpcasting(ref __binding_0) => {
                            3usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BuiltinImplSource::Trivial => {}
                    BuiltinImplSource::Misc => {}
                    BuiltinImplSource::Object(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    BuiltinImplSource::TraitUpcasting(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable_NoContext, const _: () =
    {
        impl<__D: ::rustc_serialize::Decoder>
            ::rustc_serialize::Decodable<__D> for BuiltinImplSource {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BuiltinImplSource::Trivial }
                    1usize => { BuiltinImplSource::Misc }
                    2usize => {
                        BuiltinImplSource::Object(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        BuiltinImplSource::TraitUpcasting(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BuiltinImplSource`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable_NoContext))]
547pub enum BuiltinImplSource {
548    /// A built-in impl that is considered trivial, without any nested requirements. They
549    /// are preferred over where-clauses, and we want to track them explicitly.
550    Trivial,
551    /// Some built-in impl we don't need to differentiate. This should be used
552    /// unless more specific information is necessary.
553    Misc,
554    /// A built-in impl for trait objects. The index is only used in winnowing.
555    Object(usize),
556    /// A built-in implementation of `Upcast` for trait objects to other trait objects.
557    ///
558    /// The index is only used for winnowing.
559    TraitUpcasting(usize),
560}
561
562#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for FetchEligibleAssocItemResponse<I>
    where I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            FetchEligibleAssocItemResponse::Err(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "Err");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            FetchEligibleAssocItemResponse::Found(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "Found");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            FetchEligibleAssocItemResponse::NotFound(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "NotFound");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            FetchEligibleAssocItemResponse::NotFoundBecauseErased =>
                ::core::fmt::Formatter::write_str(__f,
                    "NotFoundBecauseErased"),
        }
    }
}#[derive_where(Copy, Clone, Debug; I: Interner)]
563pub enum FetchEligibleAssocItemResponse<I: Interner> {
564    Err(I::ErrorGuaranteed),
565    Found(I::ImplOrTraitAssocTermId),
566    NotFound(TypingMode<I, CantBeErased>),
567    NotFoundBecauseErased,
568}
569
570#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for Response<I> where I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            Response {
                certainty: ref __field_certainty,
                var_values: ref __field_var_values,
                external_constraints: ref __field_external_constraints } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f, "Response");
                ::core::fmt::DebugStruct::field(&mut __builder, "certainty",
                    __field_certainty);
                ::core::fmt::DebugStruct::field(&mut __builder, "var_values",
                    __field_var_values);
                ::core::fmt::DebugStruct::field(&mut __builder,
                    "external_constraints", __field_external_constraints);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
571#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for Response<I>
            where I: Interner,
            CanonicalVarValues<I>: ::rustc_type_ir::TypeVisitable<I>,
            I::ExternalConstraints: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    Response {
                        certainty: ref __binding_0,
                        var_values: ref __binding_1,
                        external_constraints: 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 Response<I>
            where I: Interner,
            CanonicalVarValues<I>: ::rustc_type_ir::TypeFoldable<I>,
            I::ExternalConstraints: ::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 {
                        Response {
                            certainty: __binding_0,
                            var_values: __binding_1,
                            external_constraints: __binding_2 } => {
                            Response {
                                certainty: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                var_values: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                external_constraints: ::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 {
                    Response {
                        certainty: __binding_0,
                        var_values: __binding_1,
                        external_constraints: __binding_2 } => {
                        Response {
                            certainty: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            var_values: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            external_constraints: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic)]
572#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            Response<I> where
            CanonicalVarValues<I>: ::rustc_data_structures::stable_hash::StableHash,
            I::ExternalConstraints: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    Response {
                        certainty: ref __binding_0,
                        var_values: ref __binding_1,
                        external_constraints: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext))]
573pub struct Response<I: Interner> {
574    pub certainty: Certainty,
575    pub var_values: CanonicalVarValues<I>,
576    /// Additional constraints returned by this query.
577    pub external_constraints: I::ExternalConstraints,
578}
579
580impl<I: Interner> Eq for Response<I> {}
581
582#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for ExternalRegionConstraints<I> where
    I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            ExternalRegionConstraints::Old(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "Old");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
            ExternalRegionConstraints::NextGen(ref __field_0) => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_tuple(__f, "NextGen");
                ::core::fmt::DebugTuple::field(&mut __builder, __field_0);
                ::core::fmt::DebugTuple::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Hash, PartialEq, Debug; I: Interner)]
583#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            ExternalRegionConstraints<I> where I: Interner,
            Vec<(ty::RegionConstraint<I>,
            VisibleForLeakCheck)>: ::rustc_type_ir::TypeVisitable<I>,
            RegionConstraint<I>: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ExternalRegionConstraints::Old(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);
                                }
                            }
                        }
                    }
                    ExternalRegionConstraints::NextGen(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
            ExternalRegionConstraints<I> where I: Interner,
            Vec<(ty::RegionConstraint<I>,
            VisibleForLeakCheck)>: ::rustc_type_ir::TypeFoldable<I>,
            RegionConstraint<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 {
                        ExternalRegionConstraints::Old(__binding_0) => {
                            ExternalRegionConstraints::Old(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        ExternalRegionConstraints::NextGen(__binding_0) => {
                            ExternalRegionConstraints::NextGen(::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 {
                    ExternalRegionConstraints::Old(__binding_0) => {
                        ExternalRegionConstraints::Old(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    ExternalRegionConstraints::NextGen(__binding_0) => {
                        ExternalRegionConstraints::NextGen(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable_Generic)]
584#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            ExternalRegionConstraints<I> where
            Vec<(ty::RegionConstraint<I>,
            VisibleForLeakCheck)>: ::rustc_data_structures::stable_hash::StableHash,
            RegionConstraint<I>: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    ExternalRegionConstraints::Old(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    ExternalRegionConstraints::NextGen(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext))]
585pub enum ExternalRegionConstraints<I: Interner> {
586    /// normal region constraints used on stable/when -Znext-solver is used by itself
587    Old(Vec<(ty::RegionConstraint<I>, VisibleForLeakCheck)>),
588    /// new form of region constraints used when `-Zassumptions-on-binders` is enabled.
589    /// supports ORs.
590    NextGen(RegionConstraint<I>),
591}
592
593impl<I: Interner> ExternalRegionConstraints<I> {
594    pub fn is_empty(&self) -> bool {
595        match self {
596            Self::Old(r) => r.is_empty(),
597            Self::NextGen(r) => r.is_true(),
598        }
599    }
600}
601
602/// Additional constraints returned on success.
603#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for ExternalConstraintsData<I> where
    I: Interner {
    fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
        -> ::core::fmt::Result {
        match self {
            ExternalConstraintsData {
                region_constraints: ref __field_region_constraints,
                opaque_types: ref __field_opaque_types,
                normalization_nested_goals: ref __field_normalization_nested_goals
                } => {
                let mut __builder =
                    ::core::fmt::Formatter::debug_struct(__f,
                        "ExternalConstraintsData");
                ::core::fmt::DebugStruct::field(&mut __builder,
                    "region_constraints", __field_region_constraints);
                ::core::fmt::DebugStruct::field(&mut __builder,
                    "opaque_types", __field_opaque_types);
                ::core::fmt::DebugStruct::field(&mut __builder,
                    "normalization_nested_goals",
                    __field_normalization_nested_goals);
                ::core::fmt::DebugStruct::finish(&mut __builder)
            }
        }
    }
}#[derive_where(Clone, Hash, PartialEq, Debug; I: Interner)]
604#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            ExternalConstraintsData<I> where I: Interner,
            ExternalRegionConstraints<I>: ::rustc_type_ir::TypeVisitable<I>,
            Vec<(ty::OpaqueTypeKey<I>,
            I::Ty)>: ::rustc_type_ir::TypeVisitable<I>,
            NestedNormalizationGoals<I>: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ExternalConstraintsData {
                        region_constraints: ref __binding_0,
                        opaque_types: ref __binding_1,
                        normalization_nested_goals: 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
            ExternalConstraintsData<I> where I: Interner,
            ExternalRegionConstraints<I>: ::rustc_type_ir::TypeFoldable<I>,
            Vec<(ty::OpaqueTypeKey<I>,
            I::Ty)>: ::rustc_type_ir::TypeFoldable<I>,
            NestedNormalizationGoals<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 {
                        ExternalConstraintsData {
                            region_constraints: __binding_0,
                            opaque_types: __binding_1,
                            normalization_nested_goals: __binding_2 } => {
                            ExternalConstraintsData {
                                region_constraints: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                opaque_types: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                normalization_nested_goals: ::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 {
                    ExternalConstraintsData {
                        region_constraints: __binding_0,
                        opaque_types: __binding_1,
                        normalization_nested_goals: __binding_2 } => {
                        ExternalConstraintsData {
                            region_constraints: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            opaque_types: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            normalization_nested_goals: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable_Generic)]
605#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            ExternalConstraintsData<I> where
            ExternalRegionConstraints<I>: ::rustc_data_structures::stable_hash::StableHash,
            Vec<(ty::OpaqueTypeKey<I>,
            I::Ty)>: ::rustc_data_structures::stable_hash::StableHash,
            NestedNormalizationGoals<I>: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    ExternalConstraintsData {
                        region_constraints: ref __binding_0,
                        opaque_types: ref __binding_1,
                        normalization_nested_goals: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext))]
606pub struct ExternalConstraintsData<I: Interner> {
607    pub region_constraints: ExternalRegionConstraints<I>,
608    pub opaque_types: Vec<(ty::OpaqueTypeKey<I>, I::Ty)>,
609    pub normalization_nested_goals: NestedNormalizationGoals<I>,
610}
611
612impl<I: Interner> Eq for ExternalConstraintsData<I> {}
613
614impl<I: Interner> ExternalConstraintsData<I> {
615    pub fn new(cx: I) -> Self {
616        let region_constraints = match cx.assumptions_on_binders() {
617            true => ExternalRegionConstraints::NextGen(RegionConstraint::new_true()),
618            false => ExternalRegionConstraints::Old(::alloc::vec::Vec::new()vec![]),
619        };
620
621        Self {
622            region_constraints,
623            opaque_types: ::alloc::vec::Vec::new()vec![],
624            normalization_nested_goals: NestedNormalizationGoals::default(),
625        }
626    }
627
628    pub fn is_empty(&self) -> bool {
629        let ExternalConstraintsData {
630            region_constraints,
631            opaque_types,
632            normalization_nested_goals,
633        } = self;
634        region_constraints.is_empty()
635            && opaque_types.is_empty()
636            && normalization_nested_goals.is_empty()
637    }
638}
639
640/// Whether the given region constraint should be considered/ignored for
641/// leak check. In most part of the compiler, this should be `Yes`, except
642/// for applying constraints from the nested goals in next-solver.
643/// `Unreachable` is used in places in which leak check isn't done, e.g.
644/// borrowck.
645#[derive(#[automatically_derived]
impl ::core::clone::Clone for VisibleForLeakCheck {
    #[inline]
    fn clone(&self) -> VisibleForLeakCheck { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for VisibleForLeakCheck { }Copy, #[automatically_derived]
impl ::core::hash::Hash for VisibleForLeakCheck {
    #[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 VisibleForLeakCheck {
    #[inline]
    fn eq(&self, other: &VisibleForLeakCheck) -> 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 VisibleForLeakCheck {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for VisibleForLeakCheck {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                VisibleForLeakCheck::Yes => "Yes",
                VisibleForLeakCheck::No => "No",
                VisibleForLeakCheck::Unreachable => "Unreachable",
            })
    }
}Debug)]
646#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            VisibleForLeakCheck {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    VisibleForLeakCheck::Yes => {}
                    VisibleForLeakCheck::No => {}
                    VisibleForLeakCheck::Unreachable => {}
                }
            }
        }
    };StableHash_NoContext))]
647pub enum VisibleForLeakCheck {
648    Yes,
649    No,
650    Unreachable,
651}
652
653impl VisibleForLeakCheck {
654    pub fn and(self, other: VisibleForLeakCheck) -> VisibleForLeakCheck {
655        match (self, other) {
656            // Make sure that we never overwrite that constraints shouldn't
657            // be encountered by the leak checked
658            (VisibleForLeakCheck::Unreachable, _) | (_, VisibleForLeakCheck::Unreachable) => {
659                VisibleForLeakCheck::Unreachable
660            }
661            (VisibleForLeakCheck::No, _) | (_, VisibleForLeakCheck::No) => VisibleForLeakCheck::No,
662            (VisibleForLeakCheck::Yes, VisibleForLeakCheck::Yes) => VisibleForLeakCheck::Yes,
663        }
664    }
665
666    pub fn or(self, other: VisibleForLeakCheck) -> VisibleForLeakCheck {
667        match (self, other) {
668            // Make sure that we never overwrite that constraints shouldn't
669            // be encountered by the leak checked
670            (VisibleForLeakCheck::Unreachable, _) | (_, VisibleForLeakCheck::Unreachable) => {
671                VisibleForLeakCheck::Unreachable
672            }
673            (VisibleForLeakCheck::Yes, _) | (_, VisibleForLeakCheck::Yes) => {
674                VisibleForLeakCheck::Yes
675            }
676            (VisibleForLeakCheck::No, VisibleForLeakCheck::No) => VisibleForLeakCheck::No,
677        }
678    }
679}
680
681#[automatically_derived]
impl<I: Interner> ::core::default::Default for NestedNormalizationGoals<I>
    where I: Interner {
    fn default() -> Self {
        NestedNormalizationGoals(::core::default::Default::default())
    }
}#[derive_where(Clone, Hash, PartialEq, Debug, Default; I: Interner)]
682#[derive(const _: () =
    {
        impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
            NestedNormalizationGoals<I> where I: Interner,
            Vec<(GoalSource,
            Goal<I, I::Predicate>)>: ::rustc_type_ir::TypeVisitable<I> {
            fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    NestedNormalizationGoals(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
            NestedNormalizationGoals<I> where I: Interner,
            Vec<(GoalSource,
            Goal<I, I::Predicate>)>: ::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 {
                        NestedNormalizationGoals(__binding_0) => {
                            NestedNormalizationGoals(::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 {
                    NestedNormalizationGoals(__binding_0) => {
                        NestedNormalizationGoals(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable_Generic)]
683#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
            NestedNormalizationGoals<I> where
            Vec<(GoalSource,
            Goal<I,
            I::Predicate>)>: ::rustc_data_structures::stable_hash::StableHash
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    NestedNormalizationGoals(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext))]
684pub struct NestedNormalizationGoals<I: Interner>(pub Vec<(GoalSource, Goal<I, I::Predicate>)>);
685
686impl<I: Interner> Eq for NestedNormalizationGoals<I> {}
687
688impl<I: Interner> NestedNormalizationGoals<I> {
689    pub fn empty() -> Self {
690        NestedNormalizationGoals(::alloc::vec::Vec::new()vec![])
691    }
692
693    pub fn is_empty(&self) -> bool {
694        self.0.is_empty()
695    }
696}
697
698#[derive(#[automatically_derived]
impl ::core::clone::Clone for Certainty {
    #[inline]
    fn clone(&self) -> Certainty {
        let _: ::core::clone::AssertParamIsClone<MaybeInfo>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Certainty { }Copy, #[automatically_derived]
impl ::core::hash::Hash for Certainty {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            Certainty::Maybe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for Certainty {
    #[inline]
    fn eq(&self, other: &Certainty) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Certainty::Maybe(__self_0), Certainty::Maybe(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Certainty {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<MaybeInfo>;
    }
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for Certainty {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Certainty::Yes => ::core::fmt::Formatter::write_str(f, "Yes"),
            Certainty::Maybe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Maybe",
                    &__self_0),
        }
    }
}Debug)]
699#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Certainty {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    Certainty::Yes => {}
                    Certainty::Maybe(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash))]
700pub enum Certainty {
701    Yes,
702    Maybe(MaybeInfo),
703}
704
705#[derive(#[automatically_derived]
impl ::core::clone::Clone for MaybeInfo {
    #[inline]
    fn clone(&self) -> MaybeInfo {
        let _: ::core::clone::AssertParamIsClone<MaybeCause>;
        let _: ::core::clone::AssertParamIsClone<OpaqueTypesJank>;
        let _: ::core::clone::AssertParamIsClone<StalledOnCoroutines>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MaybeInfo { }Copy, #[automatically_derived]
impl ::core::hash::Hash for MaybeInfo {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.cause, state);
        ::core::hash::Hash::hash(&self.opaque_types_jank, state);
        ::core::hash::Hash::hash(&self.stalled_on_coroutines, state)
    }
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for MaybeInfo {
    #[inline]
    fn eq(&self, other: &MaybeInfo) -> bool {
        self.cause == other.cause &&
                self.opaque_types_jank == other.opaque_types_jank &&
            self.stalled_on_coroutines == other.stalled_on_coroutines
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MaybeInfo {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<MaybeCause>;
        let _: ::core::cmp::AssertParamIsEq<OpaqueTypesJank>;
        let _: ::core::cmp::AssertParamIsEq<StalledOnCoroutines>;
    }
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for MaybeInfo {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "MaybeInfo",
            "cause", &self.cause, "opaque_types_jank",
            &self.opaque_types_jank, "stalled_on_coroutines",
            &&self.stalled_on_coroutines)
    }
}Debug)]
706#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MaybeInfo {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    MaybeInfo {
                        cause: ref __binding_0,
                        opaque_types_jank: ref __binding_1,
                        stalled_on_coroutines: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash_NoContext))]
707pub struct MaybeInfo {
708    pub cause: MaybeCause,
709    pub opaque_types_jank: OpaqueTypesJank,
710    pub stalled_on_coroutines: StalledOnCoroutines,
711}
712
713impl MaybeInfo {
714    pub const AMBIGUOUS: MaybeInfo = MaybeInfo {
715        cause: MaybeCause::Ambiguity,
716        opaque_types_jank: OpaqueTypesJank::AllGood,
717        stalled_on_coroutines: StalledOnCoroutines::No,
718    };
719
720    fn and(self, other: MaybeInfo) -> MaybeInfo {
721        MaybeInfo {
722            cause: self.cause.and(other.cause),
723            opaque_types_jank: self.opaque_types_jank.and(other.opaque_types_jank),
724            stalled_on_coroutines: self.stalled_on_coroutines.and(other.stalled_on_coroutines),
725        }
726    }
727
728    pub fn or(self, other: MaybeInfo) -> MaybeInfo {
729        MaybeInfo {
730            cause: self.cause.or(other.cause),
731            opaque_types_jank: self.opaque_types_jank.or(other.opaque_types_jank),
732            stalled_on_coroutines: self.stalled_on_coroutines.or(other.stalled_on_coroutines),
733        }
734    }
735}
736
737/// Supporting not-yet-defined opaque types in HIR typeck is somewhat
738/// challenging. Ideally we'd normalize them to a new inference variable
739/// and just defer type inference which relies on the opaque until we've
740/// constrained the hidden type.
741///
742/// This doesn't work for method and function calls as we need to guide type
743/// inference for the function arguments. We treat not-yet-defined opaque types
744/// as if they were rigid instead in these places.
745///
746/// When we encounter a `?hidden_type_of_opaque: Trait<?var>` goal, we use the
747/// item bounds and blanket impls to guide inference by constraining other type
748/// variables, see `EvalCtxt::try_assemble_bounds_via_registered_opaques`. We
749/// always keep the certainty as `Maybe` so that we properly prove these goals
750/// once the hidden type has been constrained.
751///
752/// If we fail to prove the trait goal via item bounds or blanket impls, the
753/// goal would have errored if the opaque type were rigid. In this case, we
754/// set `OpaqueTypesJank::ErrorIfRigidSelfTy` in the [Certainty].
755///
756/// Places in HIR typeck where we want to treat not-yet-defined opaque types as if
757/// they were kind of rigid then use `fn root_goal_may_hold_opaque_types_jank` which
758/// returns `false` if the goal doesn't hold or if `OpaqueTypesJank::ErrorIfRigidSelfTy`
759/// is set (i.e. proving it required relies on some `?hidden_ty: NotInItemBounds` goal).
760///
761/// This is subtly different from actually treating not-yet-defined opaque types as
762/// rigid, e.g. it allows constraining opaque types if they are not the self-type of
763/// a goal. It is good enough for now and only matters for very rare type inference
764/// edge cases. We can improve this later on if necessary.
765#[derive(#[automatically_derived]
impl ::core::clone::Clone for OpaqueTypesJank {
    #[inline]
    fn clone(&self) -> OpaqueTypesJank { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for OpaqueTypesJank { }Copy, #[automatically_derived]
impl ::core::hash::Hash for OpaqueTypesJank {
    #[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 OpaqueTypesJank {
    #[inline]
    fn eq(&self, other: &OpaqueTypesJank) -> 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 OpaqueTypesJank {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for OpaqueTypesJank {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                OpaqueTypesJank::AllGood => "AllGood",
                OpaqueTypesJank::ErrorIfRigidSelfTy => "ErrorIfRigidSelfTy",
            })
    }
}Debug)]
766#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            OpaqueTypesJank {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    OpaqueTypesJank::AllGood => {}
                    OpaqueTypesJank::ErrorIfRigidSelfTy => {}
                }
            }
        }
    };StableHash))]
767pub enum OpaqueTypesJank {
768    AllGood,
769    ErrorIfRigidSelfTy,
770}
771impl OpaqueTypesJank {
772    fn and(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
773        match (self, other) {
774            (OpaqueTypesJank::AllGood, OpaqueTypesJank::AllGood) => OpaqueTypesJank::AllGood,
775            (OpaqueTypesJank::ErrorIfRigidSelfTy, _) | (_, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
776                OpaqueTypesJank::ErrorIfRigidSelfTy
777            }
778        }
779    }
780
781    pub fn or(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
782        match (self, other) {
783            (OpaqueTypesJank::ErrorIfRigidSelfTy, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
784                OpaqueTypesJank::ErrorIfRigidSelfTy
785            }
786            (OpaqueTypesJank::AllGood, _) | (_, OpaqueTypesJank::AllGood) => {
787                OpaqueTypesJank::AllGood
788            }
789        }
790    }
791}
792
793#[derive(#[automatically_derived]
impl ::core::clone::Clone for StalledOnCoroutines {
    #[inline]
    fn clone(&self) -> StalledOnCoroutines { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for StalledOnCoroutines { }Copy, #[automatically_derived]
impl ::core::hash::Hash for StalledOnCoroutines {
    #[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 StalledOnCoroutines {
    #[inline]
    fn eq(&self, other: &StalledOnCoroutines) -> 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 StalledOnCoroutines {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for StalledOnCoroutines {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                StalledOnCoroutines::Yes => "Yes",
                StalledOnCoroutines::No => "No",
            })
    }
}Debug)]
794#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            StalledOnCoroutines {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    StalledOnCoroutines::Yes => {}
                    StalledOnCoroutines::No => {}
                }
            }
        }
    };StableHash_NoContext))]
795pub enum StalledOnCoroutines {
796    Yes,
797    No,
798}
799
800impl StalledOnCoroutines {
801    fn and(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
802        match (self, other) {
803            (StalledOnCoroutines::No, StalledOnCoroutines::No) => StalledOnCoroutines::No,
804            (StalledOnCoroutines::Yes, _) | (_, StalledOnCoroutines::Yes) => {
805                StalledOnCoroutines::Yes
806            }
807        }
808    }
809
810    pub fn or(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
811        // `StalledOnCoroutines::Yes` is contagious: obtaining `Certainty::Maybe`
812        // while a candidate is stalled on a coroutine might have been
813        // `Certainty::Yes` or `NoSolution` if it were not stalled.
814        StalledOnCoroutines::and(self, other)
815    }
816}
817
818impl Certainty {
819    pub const AMBIGUOUS: Certainty = Certainty::Maybe(MaybeInfo::AMBIGUOUS);
820
821    /// Use this function to merge the certainty of multiple nested subgoals.
822    ///
823    /// Given an impl like `impl<T: Foo + Bar> Baz for T {}`, we have 2 nested
824    /// subgoals whenever we use the impl as a candidate: `T: Foo` and `T: Bar`.
825    /// If evaluating `T: Foo` results in ambiguity and `T: Bar` results in
826    /// success, we merge these two responses. This results in ambiguity.
827    ///
828    /// If we unify ambiguity with overflow, we return overflow. This doesn't matter
829    /// inside of the solver as we do not distinguish ambiguity from overflow. It does
830    /// however matter for diagnostics. If `T: Foo` resulted in overflow and `T: Bar`
831    /// in ambiguity without changing the inference state, we still want to tell the
832    /// user that `T: Baz` results in overflow.
833    pub fn and(self, other: Certainty) -> Certainty {
834        match (self, other) {
835            (Certainty::Yes, Certainty::Yes) => Certainty::Yes,
836            (Certainty::Yes, Certainty::Maybe { .. }) => other,
837            (Certainty::Maybe { .. }, Certainty::Yes) => self,
838            (Certainty::Maybe(a_maybe), Certainty::Maybe(b_maybe)) => {
839                Certainty::Maybe(a_maybe.and(b_maybe))
840            }
841        }
842    }
843
844    pub const fn overflow(suggest_increasing_limit: bool) -> Certainty {
845        Certainty::Maybe(MaybeInfo {
846            cause: MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: false },
847            opaque_types_jank: OpaqueTypesJank::AllGood,
848            stalled_on_coroutines: StalledOnCoroutines::No,
849        })
850    }
851}
852
853/// Why we failed to evaluate a goal.
854#[derive(#[automatically_derived]
impl ::core::clone::Clone for MaybeCause {
    #[inline]
    fn clone(&self) -> MaybeCause {
        let _: ::core::clone::AssertParamIsClone<bool>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MaybeCause { }Copy, #[automatically_derived]
impl ::core::hash::Hash for MaybeCause {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            MaybeCause::Overflow {
                suggest_increasing_limit: __self_0, keep_constraints: __self_1
                } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for MaybeCause {
    #[inline]
    fn eq(&self, other: &MaybeCause) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (MaybeCause::Overflow {
                    suggest_increasing_limit: __self_0,
                    keep_constraints: __self_1 }, MaybeCause::Overflow {
                    suggest_increasing_limit: __arg1_0,
                    keep_constraints: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MaybeCause {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for MaybeCause {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MaybeCause::Ambiguity =>
                ::core::fmt::Formatter::write_str(f, "Ambiguity"),
            MaybeCause::Overflow {
                suggest_increasing_limit: __self_0, keep_constraints: __self_1
                } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Overflow", "suggest_increasing_limit", __self_0,
                    "keep_constraints", &__self_1),
        }
    }
}Debug)]
855#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MaybeCause {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    MaybeCause::Ambiguity => {}
                    MaybeCause::Overflow {
                        suggest_increasing_limit: ref __binding_0,
                        keep_constraints: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash))]
856pub enum MaybeCause {
857    /// We failed due to ambiguity. This ambiguity can either
858    /// be a true ambiguity, i.e. there are multiple different answers,
859    /// or we hit a case where we just don't bother, e.g. `?x: Trait` goals.
860    Ambiguity,
861    /// We gave up due to an overflow, most often by hitting the recursion limit.
862    Overflow { suggest_increasing_limit: bool, keep_constraints: bool },
863}
864
865impl MaybeCause {
866    fn and(self, other: MaybeCause) -> MaybeCause {
867        match (self, other) {
868            (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
869            (MaybeCause::Ambiguity, MaybeCause::Overflow { .. }) => other,
870            (MaybeCause::Overflow { .. }, MaybeCause::Ambiguity) => self,
871            (
872                MaybeCause::Overflow {
873                    suggest_increasing_limit: limit_a,
874                    keep_constraints: keep_a,
875                },
876                MaybeCause::Overflow {
877                    suggest_increasing_limit: limit_b,
878                    keep_constraints: keep_b,
879                },
880            ) => MaybeCause::Overflow {
881                suggest_increasing_limit: limit_a && limit_b,
882                keep_constraints: keep_a && keep_b,
883            },
884        }
885    }
886
887    pub fn or(self, other: MaybeCause) -> MaybeCause {
888        match (self, other) {
889            (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
890
891            // When combining ambiguity + overflow, we can keep constraints.
892            (
893                MaybeCause::Ambiguity,
894                MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
895            ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
896            (
897                MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
898                MaybeCause::Ambiguity,
899            ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
900
901            (
902                MaybeCause::Overflow {
903                    suggest_increasing_limit: limit_a,
904                    keep_constraints: keep_a,
905                },
906                MaybeCause::Overflow {
907                    suggest_increasing_limit: limit_b,
908                    keep_constraints: keep_b,
909                },
910            ) => MaybeCause::Overflow {
911                suggest_increasing_limit: limit_a || limit_b,
912                keep_constraints: keep_a || keep_b,
913            },
914        }
915    }
916}
917
918/// Indicates that a `impl Drop for Adt` is `const` or not.
919#[derive(#[automatically_derived]
impl ::core::fmt::Debug for AdtDestructorKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AdtDestructorKind::NotConst => "NotConst",
                AdtDestructorKind::Const => "Const",
            })
    }
}Debug)]
920pub enum AdtDestructorKind {
921    NotConst,
922    Const,
923}
924
925/// Which sizedness trait - `Sized`, `MetaSized`? `PointeeSized` is omitted as it is removed during
926/// lowering.
927#[derive(#[automatically_derived]
impl ::core::marker::Copy for SizedTraitKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for SizedTraitKind {
    #[inline]
    fn clone(&self) -> SizedTraitKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for SizedTraitKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                SizedTraitKind::Sized => "Sized",
                SizedTraitKind::MetaSized => "MetaSized",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for SizedTraitKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for SizedTraitKind {
    #[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 SizedTraitKind {
    #[inline]
    fn eq(&self, other: &SizedTraitKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq)]
928#[cfg_attr(feature = "nightly", derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            SizedTraitKind {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    SizedTraitKind::Sized => {}
                    SizedTraitKind::MetaSized => {}
                }
            }
        }
    };StableHash))]
929pub enum SizedTraitKind {
930    /// `Sized` trait
931    Sized,
932    /// `MetaSized` trait
933    MetaSized,
934}
935
936impl SizedTraitKind {
937    /// Returns `DefId` of corresponding language item.
938    pub fn require_lang_item<I: Interner>(self, cx: I) -> I::TraitId {
939        cx.require_trait_lang_item(match self {
940            SizedTraitKind::Sized => SolverTraitLangItem::Sized,
941            SizedTraitKind::MetaSized => SolverTraitLangItem::MetaSized,
942        })
943    }
944}