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 thin_vec::ThinVec;
14use tracing::debug;
15
16use crate::inherent::*;
17use crate::lang_items::SolverTraitLangItem;
18use crate::region_constraint::RegionConstraint;
19use crate::search_graph::PathKind;
20use crate::{
21 self as ty, Canonical, CanonicalVarValues, CantBeErased, ConstVid, FloatVid, GenericArgKind,
22 InferConst, IntVid, Interner, TermKind, TyVid, TypingMode, Upcast,
23};
24
25pub type CanonicalInput<I, T = <I as Interner>::Predicate> =
26 ty::CanonicalQueryInput<I, QueryInput<I, T>>;
27pub type CanonicalResponse<I> = Canonical<I, Response<I>>;
28pub type QueryResult<I> = Result<CanonicalResponse<I>, NoSolution>;
35pub type QueryResultOrRerunNonErased<I> = Result<CanonicalResponse<I>, NoSolutionOrRerunNonErased>;
36
37#[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)]
38#[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))]
39pub struct NoSolution;
40
41pub trait RerunResultExt<T> {
42 fn map_err_to_rerun(self) -> Result<Result<T, NoSolution>, RerunNonErased>;
43}
44
45impl<T> RerunResultExt<T> for Result<T, NoSolutionOrRerunNonErased> {
46 fn map_err_to_rerun(self) -> Result<Result<T, NoSolution>, RerunNonErased> {
47 match self {
48 Ok(i) => Ok(Ok(i)),
49 Err(NoSolutionOrRerunNonErased::NoSolution(NoSolution)) => Ok(Err(NoSolution)),
50 Err(NoSolutionOrRerunNonErased::RerunNonErased(e)) => Err(e),
51 }
52 }
53}
54
55#[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)]
62#[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))]
63pub struct RerunNonErased(());
64
65#[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)]
66#[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))]
67pub enum NoSolutionOrRerunNonErased {
68 NoSolution(NoSolution),
69 RerunNonErased(RerunNonErased),
70}
71
72impl From<NoSolution> for NoSolutionOrRerunNonErased {
73 fn from(value: NoSolution) -> Self {
74 Self::NoSolution(value)
75 }
76}
77
78impl From<RerunNonErased> for NoSolutionOrRerunNonErased {
79 fn from(value: RerunNonErased) -> Self {
80 Self::RerunNonErased(value)
81 }
82}
83
84#[derive(#[automatically_derived]
impl<T: ::core::marker::Copy + Copy + Debug + Hash + Eq> ::core::marker::Copy
for SmallCopySet<T> {
}Copy, #[automatically_derived]
impl<T: ::core::clone::Clone + Copy + Debug + Hash + Eq> ::core::clone::Clone
for SmallCopySet<T> {
#[inline]
fn clone(&self) -> SmallCopySet<T> {
match self {
SmallCopySet::Empty => SmallCopySet::Empty,
SmallCopySet::One(__self_0) =>
SmallCopySet::One(::core::clone::Clone::clone(__self_0)),
SmallCopySet::Two(__self_0) =>
SmallCopySet::Two(::core::clone::Clone::clone(__self_0)),
SmallCopySet::Three(__self_0) =>
SmallCopySet::Three(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<T: ::core::fmt::Debug + Copy + Debug + Hash + Eq> ::core::fmt::Debug for
SmallCopySet<T> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
SmallCopySet::Empty =>
::core::fmt::Formatter::write_str(f, "Empty"),
SmallCopySet::One(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "One",
&__self_0),
SmallCopySet::Two(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Two",
&__self_0),
SmallCopySet::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
SmallCopySet<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 {
SmallCopySet::One(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
SmallCopySet::Two(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
SmallCopySet::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 SmallCopySet<T> {
#[inline]
fn eq(&self, other: &SmallCopySet<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) {
(SmallCopySet::One(__self_0), SmallCopySet::One(__arg1_0)) =>
__self_0 == __arg1_0,
(SmallCopySet::Two(__self_0), SmallCopySet::Two(__arg1_0)) =>
__self_0 == __arg1_0,
(SmallCopySet::Three(__self_0), SmallCopySet::Three(__arg1_0))
=> __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl<T: ::core::cmp::Eq + Copy + Debug + Hash + Eq> ::core::cmp::Eq for
SmallCopySet<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)]
89#[derive(const _: () =
{
impl<T: Copy + Debug + Hash + Eq, I> ::rustc_type_ir::TypeVisitable<I>
for SmallCopySet<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 {
SmallCopySet::Empty => {}
SmallCopySet::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);
}
}
}
}
SmallCopySet::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);
}
}
}
}
SmallCopySet::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 SmallCopySet<T> where I: Interner,
T: ::rustc_type_ir::TypeFoldable<I>,
[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 {
SmallCopySet::Empty => { SmallCopySet::Empty }
SmallCopySet::One(__binding_0) => {
SmallCopySet::One(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
SmallCopySet::Two(__binding_0) => {
SmallCopySet::Two(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
SmallCopySet::Three(__binding_0) => {
SmallCopySet::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 {
SmallCopySet::Empty => { SmallCopySet::Empty }
SmallCopySet::One(__binding_0) => {
SmallCopySet::One(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
SmallCopySet::Two(__binding_0) => {
SmallCopySet::Two(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
SmallCopySet::Three(__binding_0) => {
SmallCopySet::Three(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
}
}
}
};TypeFoldable_Generic, GenericTypeVisitable)]
90#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<T: Copy + Debug + Hash + Eq>
::rustc_data_structures::stable_hash::StableHash for
SmallCopySet<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 {
SmallCopySet::Empty => {}
SmallCopySet::One(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
SmallCopySet::Two(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
SmallCopySet::Three(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
91pub enum SmallCopySet<T: Copy + Debug + Hash + Eq> {
92 Empty,
93 One([T; 1]),
94 Two([T; 2]),
95 Three([T; 3]),
96}
97
98impl<T: Copy + Debug + Hash + Eq> SmallCopySet<T> {
99 fn empty() -> Self {
100 Self::Empty
101 }
102
103 fn new(first: T) -> Self {
104 Self::One([first])
105 }
106
107 fn union(self, other: Self) -> Option<Self> {
124 match (self, other) {
125 (Self::Empty, other) | (other, Self::Empty) => Some(other),
126
127 (Self::One([a]), Self::One([b])) if a == b => Some(Self::One([a])),
128 (Self::One([a]), Self::One([b])) => Some(Self::Two([a, b])),
129 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c]))
130 if a == b && b == c =>
131 {
132 Some(Self::One([a]))
133 }
134 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if a == b => {
135 Some(Self::Two([a, c]))
136 }
137 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if a == c => {
138 Some(Self::Two([a, b]))
139 }
140 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if b == c => {
141 Some(Self::Two([a, b]))
142 }
143 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) => {
144 Some(Self::Three([a, b, c]))
145 }
146 _ => None,
150 }
151 }
152}
153
154impl<T: Copy + Debug + Hash + Eq> AsRef<[T]> for SmallCopySet<T> {
155 fn as_ref(&self) -> &[T] {
156 match self {
157 Self::Empty => &[],
158 Self::One(l) => l,
159 Self::Two(l) => l,
160 Self::Three(l) => l,
161 }
162 }
163}
164
165#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for RerunCondition<I> where I: Interner { }#[derive_where(Copy, Clone, Debug, Hash, PartialEq, Eq; I: Interner)]
184#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
RerunCondition<I> where I: Interner,
SmallCopySet<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,
SmallCopySet<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)]
185#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
RerunCondition<I> where
SmallCopySet<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))]
186pub enum RerunCondition<I: Interner> {
187 Never,
188
189 AnyOpaqueHasInferAsHidden,
191 OpaqueInStorage(SmallCopySet<I::LocalDefId>),
193
194 OpaqueInStorageOrAnyOpaqueHasInferAsHidden(SmallCopySet<I::LocalDefId>),
198
199 Always,
200}
201
202impl<I: Interner> RerunCondition<I> {
203 fn merge(self, other: Self) -> Self {
220 let merged = match (self, other) {
221 (Self::Never, other) | (other, Self::Never) => other,
222 (Self::Always, _) | (_, Self::Always) => Self::Always,
223
224 (Self::OpaqueInStorage(a), Self::OpaqueInStorage(b)) => {
225 a.union(b).map(Self::OpaqueInStorage).unwrap_or(Self::Always)
226 }
227 (Self::AnyOpaqueHasInferAsHidden, Self::AnyOpaqueHasInferAsHidden) => {
228 Self::AnyOpaqueHasInferAsHidden
229 }
230 (
231 Self::AnyOpaqueHasInferAsHidden,
232 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
233 )
234 | (
235 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
236 Self::AnyOpaqueHasInferAsHidden,
237 ) => Self::OpaqueInStorage(a),
238
239 (
240 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
241 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b),
242 ) => a
243 .union(b)
244 .map(Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden)
245 .unwrap_or(Self::Always),
246
247 (Self::OpaqueInStorage(a), Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b))
248 | (Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b), Self::OpaqueInStorage(a)) => a
249 .union(b)
250 .map(Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden)
251 .unwrap_or(Self::Always),
252
253 (Self::OpaqueInStorage(a), Self::AnyOpaqueHasInferAsHidden)
254 | (Self::AnyOpaqueHasInferAsHidden, Self::OpaqueInStorage(a)) => {
255 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a)
256 }
257 };
258 {
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:258",
"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(258u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("merging rerun state {0:?} + {1:?} => {2:?}",
self, other, merged) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("merging rerun state {self:?} + {other:?} => {merged:?}");
259 merged
260 }
261
262 #[must_use]
263 fn should_bail(&self) -> Result<(), RerunNonErased> {
264 match self {
265 Self::Always => Err(RerunNonErased(())),
266 Self::Never
267 | Self::OpaqueInStorage(_)
268 | Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(_)
269 | Self::AnyOpaqueHasInferAsHidden => Ok(()),
270 }
271 }
272
273 #[must_use]
276 fn might_rerun(&self) -> bool {
277 match self {
278 Self::Never => false,
279 Self::Always
280 | Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(_)
281 | Self::OpaqueInStorage(_)
282 | Self::AnyOpaqueHasInferAsHidden => true,
283 }
284 }
285}
286
287#[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)]
290#[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)]
291#[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))]
292pub enum RerunReason {
293 NormalizeOpaqueTypeRemoteCrate,
294 NormalizeOpaqueType,
295 MayUseUnstableFeature,
296 EvaluateConst,
297 SkipErasedAttempt,
298 SelfTyInfer,
299 FetchEligibleAssocItem,
300 AutoTraitLeakage,
301 TryStallCoroutine,
302}
303
304#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for AccessedOpaques<I> where I: Interner { }#[derive_where(Copy, Clone, Debug, Hash, PartialEq, Eq; I: Interner)]
305#[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)]
306#[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))]
307pub struct AccessedOpaques<I: Interner> {
308 #[cfg_attr(feature = "nightly", type_visitable(ignore))]
309 #[type_foldable(identity)]
310 pub reason: Option<RerunReason>,
311 pub rerun: RerunCondition<I>,
312}
313
314impl<I: Interner> Default for AccessedOpaques<I> {
315 fn default() -> Self {
316 Self { reason: None, rerun: RerunCondition::Never }
317 }
318}
319
320impl<I: Interner> AccessedOpaques<I> {
321 pub fn update(&mut self, other: Self) -> Result<(), RerunNonErased> {
322 *self = Self {
323 reason: other.reason.or(self.reason),
325 rerun: self.rerun.merge(other.rerun),
327 };
328
329 self.should_bail()
330 }
331
332 #[must_use]
333 pub fn might_rerun(&self) -> bool {
334 self.rerun.might_rerun()
335 }
336
337 #[must_use]
338 pub fn should_bail(&self) -> Result<(), RerunNonErased> {
339 self.rerun.should_bail()
340 }
341
342 pub fn rerun_always(&mut self, reason: RerunReason) -> Result<Infallible, RerunNonErased> {
343 {
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:343",
"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(343u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("set rerun always")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("set rerun always");
344 match self.update(AccessedOpaques { reason: Some(reason), rerun: RerunCondition::Always }) {
345 Ok(_) => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
346 Err(e) => Err(e),
347 }
348 }
349
350 pub fn rerun_if_in_post_analysis(&mut self, reason: RerunReason) -> Result<(), RerunNonErased> {
351 {
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:351",
"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(351u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("set rerun if post analysis")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("set rerun if post analysis");
352 self.update(AccessedOpaques {
353 reason: Some(reason),
354 rerun: RerunCondition::OpaqueInStorage(SmallCopySet::empty()),
355 })
356 }
357
358 pub fn rerun_if_opaque_in_opaque_type_storage(
359 &mut self,
360 reason: RerunReason,
361 defid: I::LocalOpaqueTyId,
362 ) -> Result<(), RerunNonErased> {
363 {
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:363",
"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(363u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("set rerun if opaque type {0:?} in storage",
defid) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("set rerun if opaque type {defid:?} in storage");
364 self.update(AccessedOpaques {
365 reason: Some(reason),
366 rerun: RerunCondition::OpaqueInStorage(SmallCopySet::new(defid.into())),
367 })
368 }
369
370 pub fn rerun_if_any_opaque_has_infer_as_hidden_type(
371 &mut self,
372 reason: RerunReason,
373 ) -> Result<(), RerunNonErased> {
374 {
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:374",
"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(374u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::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 ::tracing::field::Value))])
});
} else { ; }
};debug!("set rerun if any opaque in the storage has a hidden type that is an infer var");
375 self.update(AccessedOpaques {
376 reason: Some(reason),
377 rerun: RerunCondition::AnyOpaqueHasInferAsHidden,
378 })
379 }
380}
381
382#[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)]
388#[derive_where(Copy; I: Interner, P: Copy)]
389#[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, P: ::rustc_type_ir::TypeFoldable<I>,
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 J: Interner, I: ::rustc_type_ir::LiftInto<J>,
P: ::rustc_type_ir::lift::Lift<J> {
type Lifted =
Goal<J, <P as ::rustc_type_ir::lift::Lift<J>>::Lifted>;
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)]
390#[cfg_attr(
391 feature = "nightly",
392 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)
393)]
394pub struct Goal<I: Interner, P> {
395 pub param_env: I::ParamEnv,
396 pub predicate: P,
397}
398
399impl<I: Interner, P: Eq> Eq for Goal<I, P> {}
400
401impl<I: Interner, P> Goal<I, P> {
402 pub fn new(cx: I, param_env: I::ParamEnv, predicate: impl Upcast<I, P>) -> Goal<I, P> {
403 Goal { param_env, predicate: predicate.upcast(cx) }
404 }
405
406 pub fn with<Q>(self, cx: I, predicate: impl Upcast<I, Q>) -> Goal<I, Q> {
408 Goal { param_env: self.param_env, predicate: predicate.upcast(cx) }
409 }
410}
411
412#[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)]
421#[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))]
422pub enum GoalSource {
423 Misc,
424 TypeRelating,
430 ImplWhereBound,
432 AliasBoundConstCondition,
434 AliasWellFormed,
441 NormalizeGoal(PathKind),
447}
448
449#[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>)]
450#[derive_where(Copy; I: Interner, Goal<I, P>: Copy)]
451#[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,
P: ::rustc_type_ir::TypeFoldable<I>,
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)]
452#[cfg_attr(
453 feature = "nightly",
454 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)
455)]
456pub struct QueryInput<I: Interner, P> {
457 pub goal: Goal<I, P>,
458 pub predefined_opaques_in_body: I::PredefinedOpaques,
459}
460
461impl<I: Interner, P: Eq> Eq for QueryInput<I, P> {}
462
463#[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)]
466pub enum CandidatePreferenceMode {
467 Default,
469 Marker,
471}
472
473impl CandidatePreferenceMode {
474 pub fn compute<I: Interner>(cx: I, trait_id: I::TraitId) -> CandidatePreferenceMode {
476 let is_sizedness_or_auto_or_default_goal = cx.is_sizedness_trait(trait_id)
477 || cx.trait_is_auto(trait_id)
478 || cx.is_default_trait(trait_id);
479 if is_sizedness_or_auto_or_default_goal {
480 CandidatePreferenceMode::Marker
481 } else {
482 CandidatePreferenceMode::Default
483 }
484 }
485}
486
487#[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)]
489pub enum CandidateSource<I: Interner> {
490 Impl(I::ImplId),
502 BuiltinImpl(BuiltinImplSource),
510 ParamEnv(ParamEnvSource),
523 AliasBound(AliasBoundKind),
544 CoherenceUnknowable,
549}
550
551impl<I: Interner> Eq for CandidateSource<I> {}
552
553#[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)]
554pub enum ParamEnvSource {
555 NonGlobal,
557 Global,
559}
560
561#[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)]
562#[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)]
563pub enum AliasBoundKind {
564 SelfBounds,
566 NonSelfBounds,
568}
569
570#[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)]
571#[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))]
572pub enum BuiltinImplSource {
573 Trivial,
576 Misc,
579 Object(usize),
581 TraitUpcasting(usize),
585}
586
587#[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)]
588pub enum FetchEligibleAssocItemResponse<I: Interner> {
589 Err(I::ErrorGuaranteed),
590 Found(I::ImplOrTraitAssocTermId),
591 NotFound(TypingMode<I, CantBeErased>),
592 NotFoundBecauseErased,
593}
594
595#[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)]
596#[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)]
597#[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))]
598pub struct Response<I: Interner> {
599 pub certainty: Certainty,
600 pub var_values: CanonicalVarValues<I>,
601 pub external_constraints: I::ExternalConstraints,
603}
604
605impl<I: Interner> Eq for Response<I> {}
606
607#[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)]
608#[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)]
609#[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))]
610pub enum ExternalRegionConstraints<I: Interner> {
611 Old(Vec<(ty::RegionConstraint<I>, VisibleForLeakCheck)>),
613 NextGen(RegionConstraint<I>),
616}
617
618impl<I: Interner> ExternalRegionConstraints<I> {
619 pub fn is_empty(&self) -> bool {
620 match self {
621 Self::Old(r) => r.is_empty(),
622 Self::NextGen(r) => r.is_true(),
623 }
624 }
625}
626
627#[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)]
629#[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)]
630#[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))]
631pub struct ExternalConstraintsData<I: Interner> {
632 pub region_constraints: ExternalRegionConstraints<I>,
633 pub opaque_types: Vec<(ty::OpaqueTypeKey<I>, I::Ty)>,
634 pub normalization_nested_goals: NestedNormalizationGoals<I>,
635}
636
637impl<I: Interner> Eq for ExternalConstraintsData<I> {}
638
639impl<I: Interner> ExternalConstraintsData<I> {
640 pub fn new(cx: I) -> Self {
641 let region_constraints = match cx.assumptions_on_binders() {
642 true => ExternalRegionConstraints::NextGen(RegionConstraint::new_true()),
643 false => ExternalRegionConstraints::Old(::alloc::vec::Vec::new()vec![]),
644 };
645
646 Self {
647 region_constraints,
648 opaque_types: ::alloc::vec::Vec::new()vec![],
649 normalization_nested_goals: NestedNormalizationGoals::default(),
650 }
651 }
652
653 pub fn is_empty(&self) -> bool {
654 let ExternalConstraintsData {
655 region_constraints,
656 opaque_types,
657 normalization_nested_goals,
658 } = self;
659 region_constraints.is_empty()
660 && opaque_types.is_empty()
661 && normalization_nested_goals.is_empty()
662 }
663}
664
665#[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)]
671#[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))]
672pub enum VisibleForLeakCheck {
673 Yes,
674 No,
675 Unreachable,
676}
677
678impl VisibleForLeakCheck {
679 pub fn and(self, other: VisibleForLeakCheck) -> VisibleForLeakCheck {
680 match (self, other) {
681 (VisibleForLeakCheck::Unreachable, _) | (_, VisibleForLeakCheck::Unreachable) => {
684 VisibleForLeakCheck::Unreachable
685 }
686 (VisibleForLeakCheck::No, _) | (_, VisibleForLeakCheck::No) => VisibleForLeakCheck::No,
687 (VisibleForLeakCheck::Yes, VisibleForLeakCheck::Yes) => VisibleForLeakCheck::Yes,
688 }
689 }
690
691 pub fn or(self, other: VisibleForLeakCheck) -> VisibleForLeakCheck {
692 match (self, other) {
693 (VisibleForLeakCheck::Unreachable, _) | (_, VisibleForLeakCheck::Unreachable) => {
696 VisibleForLeakCheck::Unreachable
697 }
698 (VisibleForLeakCheck::Yes, _) | (_, VisibleForLeakCheck::Yes) => {
699 VisibleForLeakCheck::Yes
700 }
701 (VisibleForLeakCheck::No, VisibleForLeakCheck::No) => VisibleForLeakCheck::No,
702 }
703 }
704}
705
706#[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)]
707#[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)]
708#[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))]
709pub struct NestedNormalizationGoals<I: Interner>(pub Vec<(GoalSource, Goal<I, I::Predicate>)>);
710
711impl<I: Interner> Eq for NestedNormalizationGoals<I> {}
712
713impl<I: Interner> NestedNormalizationGoals<I> {
714 pub fn empty() -> Self {
715 NestedNormalizationGoals(::alloc::vec::Vec::new()vec![])
716 }
717
718 pub fn is_empty(&self) -> bool {
719 self.0.is_empty()
720 }
721}
722
723#[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)]
724#[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))]
725pub enum Certainty {
726 Yes,
727 Maybe(MaybeInfo),
728}
729
730#[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)]
731#[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))]
732pub struct MaybeInfo {
733 pub cause: MaybeCause,
734 pub opaque_types_jank: OpaqueTypesJank,
735 pub stalled_on_coroutines: StalledOnCoroutines,
736}
737
738impl MaybeInfo {
739 pub const AMBIGUOUS: MaybeInfo = MaybeInfo {
740 cause: MaybeCause::Ambiguity,
741 opaque_types_jank: OpaqueTypesJank::AllGood,
742 stalled_on_coroutines: StalledOnCoroutines::No,
743 };
744
745 fn and(self, other: MaybeInfo) -> MaybeInfo {
746 MaybeInfo {
747 cause: self.cause.and(other.cause),
748 opaque_types_jank: self.opaque_types_jank.and(other.opaque_types_jank),
749 stalled_on_coroutines: self.stalled_on_coroutines.and(other.stalled_on_coroutines),
750 }
751 }
752
753 pub fn or(self, other: MaybeInfo) -> MaybeInfo {
754 MaybeInfo {
755 cause: self.cause.or(other.cause),
756 opaque_types_jank: self.opaque_types_jank.or(other.opaque_types_jank),
757 stalled_on_coroutines: self.stalled_on_coroutines.or(other.stalled_on_coroutines),
758 }
759 }
760}
761
762#[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)]
791#[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))]
792pub enum OpaqueTypesJank {
793 AllGood,
794 ErrorIfRigidSelfTy,
795}
796impl OpaqueTypesJank {
797 fn and(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
798 match (self, other) {
799 (OpaqueTypesJank::AllGood, OpaqueTypesJank::AllGood) => OpaqueTypesJank::AllGood,
800 (OpaqueTypesJank::ErrorIfRigidSelfTy, _) | (_, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
801 OpaqueTypesJank::ErrorIfRigidSelfTy
802 }
803 }
804 }
805
806 pub fn or(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
807 match (self, other) {
808 (OpaqueTypesJank::ErrorIfRigidSelfTy, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
809 OpaqueTypesJank::ErrorIfRigidSelfTy
810 }
811 (OpaqueTypesJank::AllGood, _) | (_, OpaqueTypesJank::AllGood) => {
812 OpaqueTypesJank::AllGood
813 }
814 }
815 }
816}
817
818#[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)]
819#[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))]
820pub enum StalledOnCoroutines {
821 Yes,
822 No,
823}
824
825impl StalledOnCoroutines {
826 fn and(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
827 match (self, other) {
828 (StalledOnCoroutines::No, StalledOnCoroutines::No) => StalledOnCoroutines::No,
829 (StalledOnCoroutines::Yes, _) | (_, StalledOnCoroutines::Yes) => {
830 StalledOnCoroutines::Yes
831 }
832 }
833 }
834
835 pub fn or(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
836 StalledOnCoroutines::and(self, other)
840 }
841}
842
843impl Certainty {
844 pub const AMBIGUOUS: Certainty = Certainty::Maybe(MaybeInfo::AMBIGUOUS);
845
846 pub fn and(self, other: Certainty) -> Certainty {
859 match (self, other) {
860 (Certainty::Yes, Certainty::Yes) => Certainty::Yes,
861 (Certainty::Yes, Certainty::Maybe { .. }) => other,
862 (Certainty::Maybe { .. }, Certainty::Yes) => self,
863 (Certainty::Maybe(a_maybe), Certainty::Maybe(b_maybe)) => {
864 Certainty::Maybe(a_maybe.and(b_maybe))
865 }
866 }
867 }
868
869 pub const fn overflow(suggest_increasing_limit: bool) -> Certainty {
870 Certainty::Maybe(MaybeInfo {
871 cause: MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: false },
872 opaque_types_jank: OpaqueTypesJank::AllGood,
873 stalled_on_coroutines: StalledOnCoroutines::No,
874 })
875 }
876
877 pub fn is_yes(&self) -> bool {
878 match self {
879 Certainty::Yes => true,
880 Certainty::Maybe(_) => false,
881 }
882 }
883
884 pub fn is_overflow(&self) -> bool {
885 match self {
886 Certainty::Maybe(MaybeInfo { cause: MaybeCause::Overflow { .. }, .. }) => true,
887 _ => false,
888 }
889 }
890}
891
892#[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)]
894#[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))]
895pub enum MaybeCause {
896 Ambiguity,
900 Overflow { suggest_increasing_limit: bool, keep_constraints: bool },
902}
903
904impl MaybeCause {
905 fn and(self, other: MaybeCause) -> MaybeCause {
906 match (self, other) {
907 (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
908 (MaybeCause::Ambiguity, MaybeCause::Overflow { .. }) => other,
909 (MaybeCause::Overflow { .. }, MaybeCause::Ambiguity) => self,
910 (
911 MaybeCause::Overflow {
912 suggest_increasing_limit: limit_a,
913 keep_constraints: keep_a,
914 },
915 MaybeCause::Overflow {
916 suggest_increasing_limit: limit_b,
917 keep_constraints: keep_b,
918 },
919 ) => MaybeCause::Overflow {
920 suggest_increasing_limit: limit_a && limit_b,
921 keep_constraints: keep_a && keep_b,
922 },
923 }
924 }
925
926 pub fn or(self, other: MaybeCause) -> MaybeCause {
927 match (self, other) {
928 (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
929
930 (
932 MaybeCause::Ambiguity,
933 MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
934 ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
935 (
936 MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
937 MaybeCause::Ambiguity,
938 ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
939
940 (
941 MaybeCause::Overflow {
942 suggest_increasing_limit: limit_a,
943 keep_constraints: keep_a,
944 },
945 MaybeCause::Overflow {
946 suggest_increasing_limit: limit_b,
947 keep_constraints: keep_b,
948 },
949 ) => MaybeCause::Overflow {
950 suggest_increasing_limit: limit_a || limit_b,
951 keep_constraints: keep_a || keep_b,
952 },
953 }
954 }
955}
956
957#[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)]
959pub enum AdtDestructorKind {
960 NotConst,
961 Const,
962}
963
964#[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)]
967#[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))]
968pub enum SizedTraitKind {
969 Sized,
971 MetaSized,
973}
974
975impl SizedTraitKind {
976 pub fn require_lang_item<I: Interner>(self, cx: I) -> I::TraitId {
978 cx.require_trait_lang_item(match self {
979 SizedTraitKind::Sized => SolverTraitLangItem::Sized,
980 SizedTraitKind::MetaSized => SolverTraitLangItem::MetaSized,
981 })
982 }
983}
984
985#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for SucceededInErased<I> where
I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
SucceededInErased::Yes {
accessed_opaques: ref __field_accessed_opaques } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Yes");
::core::fmt::DebugStruct::field(&mut __builder,
"accessed_opaques", __field_accessed_opaques);
::core::fmt::DebugStruct::finish(&mut __builder)
}
SucceededInErased::No =>
::core::fmt::Formatter::write_str(__f, "No"),
}
}
}#[derive_where(Clone, Debug; I: Interner)]
986pub enum SucceededInErased<I: Interner> {
987 Yes {
990 accessed_opaques: AccessedOpaques<I>,
991 },
992 No,
993}
994
995#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for GoalStalledOnOpaques<I> where
I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
GoalStalledOnOpaques::No =>
::core::fmt::Formatter::write_str(__f, "No"),
GoalStalledOnOpaques::Yes {
num_opaques_in_storage: ref __field_num_opaques_in_storage,
previously_succeeded_in_erased: ref __field_previously_succeeded_in_erased
} => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Yes");
::core::fmt::DebugStruct::field(&mut __builder,
"num_opaques_in_storage", __field_num_opaques_in_storage);
::core::fmt::DebugStruct::field(&mut __builder,
"previously_succeeded_in_erased",
__field_previously_succeeded_in_erased);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Debug; I: Interner)]
996pub enum GoalStalledOnOpaques<I: Interner> {
997 No,
1001 Yes {
1002 num_opaques_in_storage: usize,
1003 previously_succeeded_in_erased: SucceededInErased<I>,
1004 },
1005}
1006
1007#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for GoalStalledOn<I> where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
GoalStalledOn {
stalled_vars: ref __field_stalled_vars,
sub_roots: ref __field_sub_roots,
stalled_maybe_info: ref __field_stalled_maybe_info,
opaques: ref __field_opaques } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "GoalStalledOn");
::core::fmt::DebugStruct::field(&mut __builder,
"stalled_vars", __field_stalled_vars);
::core::fmt::DebugStruct::field(&mut __builder, "sub_roots",
__field_sub_roots);
::core::fmt::DebugStruct::field(&mut __builder,
"stalled_maybe_info", __field_stalled_maybe_info);
::core::fmt::DebugStruct::field(&mut __builder, "opaques",
__field_opaques);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Debug; I: Interner)]
1009pub struct GoalStalledOn<I: Interner> {
1010 pub stalled_vars: ThinVec<TyOrConstInferVar>,
1012 pub sub_roots: ThinVec<TyVid>,
1014 pub stalled_maybe_info: MaybeInfo,
1017 pub opaques: GoalStalledOnOpaques<I>,
1018}
1019
1020#[derive(#[automatically_derived]
impl<I: ::core::clone::Clone + Interner> ::core::clone::Clone for
ComputeGoalFastPathOutcome<I> {
#[inline]
fn clone(&self) -> ComputeGoalFastPathOutcome<I> {
match self {
ComputeGoalFastPathOutcome::NoFastPath =>
ComputeGoalFastPathOutcome::NoFastPath,
ComputeGoalFastPathOutcome::TriviallyHolds =>
ComputeGoalFastPathOutcome::TriviallyHolds,
ComputeGoalFastPathOutcome::TriviallyStalled {
stalled_on: __self_0 } =>
ComputeGoalFastPathOutcome::TriviallyStalled {
stalled_on: ::core::clone::Clone::clone(__self_0),
},
}
}
}Clone, #[automatically_derived]
impl<I: ::core::fmt::Debug + Interner> ::core::fmt::Debug for
ComputeGoalFastPathOutcome<I> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
ComputeGoalFastPathOutcome::NoFastPath =>
::core::fmt::Formatter::write_str(f, "NoFastPath"),
ComputeGoalFastPathOutcome::TriviallyHolds =>
::core::fmt::Formatter::write_str(f, "TriviallyHolds"),
ComputeGoalFastPathOutcome::TriviallyStalled {
stalled_on: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TriviallyStalled", "stalled_on", &__self_0),
}
}
}Debug)]
1023pub enum ComputeGoalFastPathOutcome<I: Interner> {
1024 NoFastPath,
1026 TriviallyHolds,
1028 TriviallyStalled { stalled_on: GoalStalledOn<I> },
1031}
1032
1033#[derive(#[automatically_derived]
impl ::core::marker::Copy for TyOrConstInferVar { }Copy, #[automatically_derived]
impl ::core::clone::Clone for TyOrConstInferVar {
#[inline]
fn clone(&self) -> TyOrConstInferVar {
let _: ::core::clone::AssertParamIsClone<TyVid>;
let _: ::core::clone::AssertParamIsClone<IntVid>;
let _: ::core::clone::AssertParamIsClone<FloatVid>;
let _: ::core::clone::AssertParamIsClone<ConstVid>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TyOrConstInferVar {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
TyOrConstInferVar::Ty(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
&__self_0),
TyOrConstInferVar::TyInt(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "TyInt",
&__self_0),
TyOrConstInferVar::TyFloat(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TyFloat", &__self_0),
TyOrConstInferVar::Const(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
&__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for TyOrConstInferVar {
#[inline]
fn eq(&self, other: &TyOrConstInferVar) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(TyOrConstInferVar::Ty(__self_0),
TyOrConstInferVar::Ty(__arg1_0)) => __self_0 == __arg1_0,
(TyOrConstInferVar::TyInt(__self_0),
TyOrConstInferVar::TyInt(__arg1_0)) => __self_0 == __arg1_0,
(TyOrConstInferVar::TyFloat(__self_0),
TyOrConstInferVar::TyFloat(__arg1_0)) =>
__self_0 == __arg1_0,
(TyOrConstInferVar::Const(__self_0),
TyOrConstInferVar::Const(__arg1_0)) => __self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TyOrConstInferVar {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<TyVid>;
let _: ::core::cmp::AssertParamIsEq<IntVid>;
let _: ::core::cmp::AssertParamIsEq<FloatVid>;
let _: ::core::cmp::AssertParamIsEq<ConstVid>;
}
}Eq)]
1037pub enum TyOrConstInferVar {
1038 Ty(TyVid),
1040 TyInt(IntVid),
1042 TyFloat(FloatVid),
1044
1045 Const(ConstVid),
1047}
1048
1049impl TyOrConstInferVar {
1050 pub fn as_type<I: Interner>(&self, interner: I) -> Option<I::Ty> {
1051 match self {
1052 Self::Ty(vid) => Some(I::Ty::new_var(interner, *vid)),
1053 Self::TyInt(_) | Self::TyFloat(_) | Self::Const(_) => None,
1054 }
1055 }
1056
1057 pub fn maybe_from_generic_arg<I: Interner>(arg: I::GenericArg) -> Option<Self> {
1061 match arg.kind() {
1062 GenericArgKind::Type(ty) => Self::maybe_from_ty::<I>(ty),
1063 GenericArgKind::Const(ct) => Self::maybe_from_const::<I>(ct),
1064 GenericArgKind::Lifetime(_) => None,
1065 }
1066 }
1067
1068 pub fn maybe_from_term<I: Interner>(term: I::Term) -> Option<Self> {
1072 match term.kind() {
1073 TermKind::Ty(ty) => Self::maybe_from_ty::<I>(ty),
1074 TermKind::Const(ct) => Self::maybe_from_const::<I>(ct),
1075 }
1076 }
1077
1078 fn maybe_from_ty<I: Interner>(ty: I::Ty) -> Option<Self> {
1081 match ty.kind() {
1082 ty::Infer(ty::TyVar(v)) => Some(TyOrConstInferVar::Ty(v)),
1083 ty::Infer(ty::IntVar(v)) => Some(TyOrConstInferVar::TyInt(v)),
1084 ty::Infer(ty::FloatVar(v)) => Some(TyOrConstInferVar::TyFloat(v)),
1085 _ => None,
1086 }
1087 }
1088
1089 fn maybe_from_const<I: Interner>(ct: I::Const) -> Option<Self> {
1092 match ct.kind() {
1093 ty::ConstKind::Infer(InferConst::Var(v)) => Some(TyOrConstInferVar::Const(v)),
1094 _ => None,
1095 }
1096 }
1097}