1pub mod inspect;
2
3use std::convert::Infallible;
4use std::fmt::Debug;
5use std::hash::Hash;
6
7use derive_where::derive_where;
8#[cfg(feature = "nightly")]
9use rustc_macros::{Decodable_NoContext, Encodable_NoContext, StableHash, StableHash_NoContext};
10use rustc_type_ir_macros::{
11 GenericTypeVisitable, Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic,
12};
13use tracing::debug;
14
15use crate::lang_items::SolverTraitLangItem;
16use crate::region_constraint::RegionConstraint;
17use crate::search_graph::PathKind;
18use crate::{
19 self as ty, Canonical, CanonicalVarValues, CantBeErased, Interner, TypingMode, Upcast,
20};
21
22pub type CanonicalInput<I, T = <I as Interner>::Predicate> =
23 ty::CanonicalQueryInput<I, QueryInput<I, T>>;
24pub type CanonicalResponse<I> = Canonical<I, Response<I>>;
25pub type QueryResult<I> = Result<CanonicalResponse<I>, NoSolution>;
32pub type QueryResultOrRerunNonErased<I> = Result<CanonicalResponse<I>, NoSolutionOrRerunNonErased>;
33
34#[derive(#[automatically_derived]
impl ::core::marker::Copy for NoSolution { }Copy, #[automatically_derived]
impl ::core::clone::Clone for NoSolution {
#[inline]
fn clone(&self) -> NoSolution { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for NoSolution {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f, "NoSolution")
}
}Debug, #[automatically_derived]
impl ::core::hash::Hash for NoSolution {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for NoSolution {
#[inline]
fn eq(&self, other: &NoSolution) -> bool { true }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NoSolution {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq)]
35#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for NoSolution {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self { NoSolution => {} }
}
}
};StableHash))]
36pub struct NoSolution;
37
38pub trait RerunResultExt<T> {
39 fn map_err_to_rerun(self) -> Result<Result<T, NoSolution>, RerunNonErased>;
40}
41
42impl<T> RerunResultExt<T> for Result<T, NoSolutionOrRerunNonErased> {
43 fn map_err_to_rerun(self) -> Result<Result<T, NoSolution>, RerunNonErased> {
44 match self {
45 Ok(i) => Ok(Ok(i)),
46 Err(NoSolutionOrRerunNonErased::NoSolution(NoSolution)) => Ok(Err(NoSolution)),
47 Err(NoSolutionOrRerunNonErased::RerunNonErased(e)) => Err(e),
48 }
49 }
50}
51
52#[derive(#[automatically_derived]
impl ::core::marker::Copy for RerunNonErased { }Copy, #[automatically_derived]
impl ::core::clone::Clone for RerunNonErased {
#[inline]
fn clone(&self) -> RerunNonErased {
let _: ::core::clone::AssertParamIsClone<()>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for RerunNonErased {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "RerunNonErased",
&&self.0)
}
}Debug, #[automatically_derived]
impl ::core::hash::Hash for RerunNonErased {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for RerunNonErased {
#[inline]
fn eq(&self, other: &RerunNonErased) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RerunNonErased {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<()>;
}
}Eq)]
59#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
RerunNonErased {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
RerunNonErased(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash))]
60pub struct RerunNonErased(());
61
62#[derive(#[automatically_derived]
impl ::core::marker::Copy for NoSolutionOrRerunNonErased { }Copy, #[automatically_derived]
impl ::core::clone::Clone for NoSolutionOrRerunNonErased {
#[inline]
fn clone(&self) -> NoSolutionOrRerunNonErased {
let _: ::core::clone::AssertParamIsClone<NoSolution>;
let _: ::core::clone::AssertParamIsClone<RerunNonErased>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for NoSolutionOrRerunNonErased {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
NoSolutionOrRerunNonErased::NoSolution(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"NoSolution", &__self_0),
NoSolutionOrRerunNonErased::RerunNonErased(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"RerunNonErased", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::hash::Hash for NoSolutionOrRerunNonErased {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
NoSolutionOrRerunNonErased::NoSolution(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
NoSolutionOrRerunNonErased::RerunNonErased(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for NoSolutionOrRerunNonErased {
#[inline]
fn eq(&self, other: &NoSolutionOrRerunNonErased) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(NoSolutionOrRerunNonErased::NoSolution(__self_0),
NoSolutionOrRerunNonErased::NoSolution(__arg1_0)) =>
__self_0 == __arg1_0,
(NoSolutionOrRerunNonErased::RerunNonErased(__self_0),
NoSolutionOrRerunNonErased::RerunNonErased(__arg1_0)) =>
__self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NoSolutionOrRerunNonErased {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<NoSolution>;
let _: ::core::cmp::AssertParamIsEq<RerunNonErased>;
}
}Eq)]
63#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
NoSolutionOrRerunNonErased {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
NoSolutionOrRerunNonErased::NoSolution(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
NoSolutionOrRerunNonErased::RerunNonErased(ref __binding_0)
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash))]
64pub enum NoSolutionOrRerunNonErased {
65 NoSolution(NoSolution),
66 RerunNonErased(RerunNonErased),
67}
68
69impl From<NoSolution> for NoSolutionOrRerunNonErased {
70 fn from(value: NoSolution) -> Self {
71 Self::NoSolution(value)
72 }
73}
74
75impl From<RerunNonErased> for NoSolutionOrRerunNonErased {
76 fn from(value: RerunNonErased) -> Self {
77 Self::RerunNonErased(value)
78 }
79}
80
81#[derive(#[automatically_derived]
impl<T: ::core::marker::Copy + Copy + Debug + Hash + Eq> ::core::marker::Copy
for SmallCopyList<T> {
}Copy, #[automatically_derived]
impl<T: ::core::clone::Clone + Copy + Debug + Hash + Eq> ::core::clone::Clone
for SmallCopyList<T> {
#[inline]
fn clone(&self) -> SmallCopyList<T> {
match self {
SmallCopyList::Empty => SmallCopyList::Empty,
SmallCopyList::One(__self_0) =>
SmallCopyList::One(::core::clone::Clone::clone(__self_0)),
SmallCopyList::Two(__self_0) =>
SmallCopyList::Two(::core::clone::Clone::clone(__self_0)),
SmallCopyList::Three(__self_0) =>
SmallCopyList::Three(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<T: ::core::fmt::Debug + Copy + Debug + Hash + Eq> ::core::fmt::Debug for
SmallCopyList<T> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
SmallCopyList::Empty =>
::core::fmt::Formatter::write_str(f, "Empty"),
SmallCopyList::One(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "One",
&__self_0),
SmallCopyList::Two(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Two",
&__self_0),
SmallCopyList::Three(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Three",
&__self_0),
}
}
}Debug, #[automatically_derived]
impl<T: ::core::hash::Hash + Copy + Debug + Hash + Eq> ::core::hash::Hash for
SmallCopyList<T> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
SmallCopyList::One(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
SmallCopyList::Two(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
SmallCopyList::Three(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl<T: ::core::cmp::PartialEq + Copy + Debug + Hash + Eq>
::core::cmp::PartialEq for SmallCopyList<T> {
#[inline]
fn eq(&self, other: &SmallCopyList<T>) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(SmallCopyList::One(__self_0), SmallCopyList::One(__arg1_0))
=> __self_0 == __arg1_0,
(SmallCopyList::Two(__self_0), SmallCopyList::Two(__arg1_0))
=> __self_0 == __arg1_0,
(SmallCopyList::Three(__self_0),
SmallCopyList::Three(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl<T: ::core::cmp::Eq + Copy + Debug + Hash + Eq> ::core::cmp::Eq for
SmallCopyList<T> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<[T; 1]>;
let _: ::core::cmp::AssertParamIsEq<[T; 2]>;
let _: ::core::cmp::AssertParamIsEq<[T; 3]>;
}
}Eq)]
82#[derive(const _: () =
{
impl<T: Copy + Debug + Hash + Eq, I> ::rustc_type_ir::TypeVisitable<I>
for SmallCopyList<T> where I: Interner,
[T; 1]: ::rustc_type_ir::TypeVisitable<I>,
[T; 2]: ::rustc_type_ir::TypeVisitable<I>,
[T; 3]: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
SmallCopyList::Empty => {}
SmallCopyList::One(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
SmallCopyList::Two(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
SmallCopyList::Three(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<T: Copy + Debug + Hash + Eq, I> ::rustc_type_ir::TypeFoldable<I>
for SmallCopyList<T> where I: Interner,
[T; 1]: ::rustc_type_ir::TypeFoldable<I>,
[T; 2]: ::rustc_type_ir::TypeFoldable<I>,
[T; 3]: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
SmallCopyList::Empty => { SmallCopyList::Empty }
SmallCopyList::One(__binding_0) => {
SmallCopyList::One(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
SmallCopyList::Two(__binding_0) => {
SmallCopyList::Two(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
SmallCopyList::Three(__binding_0) => {
SmallCopyList::Three(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
SmallCopyList::Empty => { SmallCopyList::Empty }
SmallCopyList::One(__binding_0) => {
SmallCopyList::One(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
SmallCopyList::Two(__binding_0) => {
SmallCopyList::Two(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
SmallCopyList::Three(__binding_0) => {
SmallCopyList::Three(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
}
}
}
};TypeFoldable_Generic, GenericTypeVisitable)]
83#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<T: Copy + Debug + Hash + Eq>
::rustc_data_structures::stable_hash::StableHash for
SmallCopyList<T> where
[T; 1]: ::rustc_data_structures::stable_hash::StableHash,
[T; 2]: ::rustc_data_structures::stable_hash::StableHash,
[T; 3]: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
SmallCopyList::Empty => {}
SmallCopyList::One(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
SmallCopyList::Two(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
SmallCopyList::Three(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
84pub enum SmallCopyList<T: Copy + Debug + Hash + Eq> {
85 Empty,
86 One([T; 1]),
87 Two([T; 2]),
88 Three([T; 3]),
89}
90
91impl<T: Copy + Debug + Hash + Eq> SmallCopyList<T> {
92 fn empty() -> Self {
93 Self::Empty
94 }
95
96 fn new(first: T) -> Self {
97 Self::One([first])
98 }
99
100 fn union(self, other: Self) -> Option<Self> {
102 match (self, other) {
103 (Self::Empty, other) | (other, Self::Empty) => Some(other),
104
105 (Self::One([a]), Self::One([b])) if a == b => Some(Self::One([a])),
106 (Self::One([a]), Self::One([b])) => Some(Self::Two([a, b])),
107 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c]))
108 if a == b && b == c =>
109 {
110 Some(Self::One([a]))
111 }
112 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if a == b => {
113 Some(Self::Two([a, c]))
114 }
115 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if a == c => {
116 Some(Self::Two([a, b]))
117 }
118 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if b == c => {
119 Some(Self::Two([a, b]))
120 }
121 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) => {
122 Some(Self::Three([a, b, c]))
123 }
124 _ => None,
125 }
126 }
127}
128
129impl<T: Copy + Debug + Hash + Eq> AsRef<[T]> for SmallCopyList<T> {
130 fn as_ref(&self) -> &[T] {
131 match self {
132 Self::Empty => &[],
133 Self::One(l) => l,
134 Self::Two(l) => l,
135 Self::Three(l) => l,
136 }
137 }
138}
139
140#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for RerunCondition<I> where I: Interner { }#[derive_where(Copy, Clone, Debug, Hash, PartialEq, Eq; I: Interner)]
159#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
RerunCondition<I> where I: Interner,
SmallCopyList<I::LocalDefId>: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
RerunCondition::Never => {}
RerunCondition::AnyOpaqueHasInferAsHidden => {}
RerunCondition::OpaqueInStorage(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __binding_0)
=> {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
RerunCondition::Always => {}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
RerunCondition<I> where I: Interner,
SmallCopyList<I::LocalDefId>: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
RerunCondition::Never => { RerunCondition::Never }
RerunCondition::AnyOpaqueHasInferAsHidden => {
RerunCondition::AnyOpaqueHasInferAsHidden
}
RerunCondition::OpaqueInStorage(__binding_0) => {
RerunCondition::OpaqueInStorage(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(__binding_0)
=> {
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
RerunCondition::Always => { RerunCondition::Always }
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
RerunCondition::Never => { RerunCondition::Never }
RerunCondition::AnyOpaqueHasInferAsHidden => {
RerunCondition::AnyOpaqueHasInferAsHidden
}
RerunCondition::OpaqueInStorage(__binding_0) => {
RerunCondition::OpaqueInStorage(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(__binding_0)
=> {
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
RerunCondition::Always => { RerunCondition::Always }
}
}
}
};TypeFoldable_Generic, GenericTypeVisitable)]
160#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
RerunCondition<I> where
SmallCopyList<I::LocalDefId>: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
RerunCondition::Never => {}
RerunCondition::AnyOpaqueHasInferAsHidden => {}
RerunCondition::OpaqueInStorage(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __binding_0)
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
RerunCondition::Always => {}
}
}
}
};StableHash_NoContext))]
161pub enum RerunCondition<I: Interner> {
162 Never,
163
164 AnyOpaqueHasInferAsHidden,
166 OpaqueInStorage(SmallCopyList<I::LocalDefId>),
168
169 OpaqueInStorageOrAnyOpaqueHasInferAsHidden(SmallCopyList<I::LocalDefId>),
173
174 Always,
175}
176
177impl<I: Interner> RerunCondition<I> {
178 fn merge(self, other: Self) -> Self {
195 let merged = match (self, other) {
196 (Self::Never, other) | (other, Self::Never) => other,
197 (Self::Always, _) | (_, Self::Always) => Self::Always,
198
199 (Self::OpaqueInStorage(a), Self::OpaqueInStorage(b)) => {
200 a.union(b).map(Self::OpaqueInStorage).unwrap_or(Self::Always)
201 }
202 (Self::AnyOpaqueHasInferAsHidden, Self::AnyOpaqueHasInferAsHidden) => {
203 Self::AnyOpaqueHasInferAsHidden
204 }
205 (
206 Self::AnyOpaqueHasInferAsHidden,
207 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
208 )
209 | (
210 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
211 Self::AnyOpaqueHasInferAsHidden,
212 ) => Self::OpaqueInStorage(a),
213
214 (
215 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
216 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b),
217 ) => a
218 .union(b)
219 .map(Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden)
220 .unwrap_or(Self::Always),
221
222 (Self::OpaqueInStorage(a), Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b))
223 | (Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b), Self::OpaqueInStorage(a)) => a
224 .union(b)
225 .map(Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden)
226 .unwrap_or(Self::Always),
227
228 (Self::OpaqueInStorage(a), Self::AnyOpaqueHasInferAsHidden)
229 | (Self::AnyOpaqueHasInferAsHidden, Self::OpaqueInStorage(a)) => {
230 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a)
231 }
232 };
233 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:233",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(233u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("merging rerun state {0:?} + {1:?} => {2:?}",
self, other, merged) as &dyn Value))])
});
} else { ; }
};debug!("merging rerun state {self:?} + {other:?} => {merged:?}");
234 merged
235 }
236
237 #[must_use]
238 fn should_bail(&self) -> Result<(), RerunNonErased> {
239 match self {
240 Self::Always => Err(RerunNonErased(())),
241 Self::Never
242 | Self::OpaqueInStorage(_)
243 | Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(_)
244 | Self::AnyOpaqueHasInferAsHidden => Ok(()),
245 }
246 }
247
248 #[must_use]
251 fn might_rerun(&self) -> bool {
252 match self {
253 Self::Never => false,
254 Self::Always
255 | Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(_)
256 | Self::OpaqueInStorage(_)
257 | Self::AnyOpaqueHasInferAsHidden => true,
258 }
259 }
260}
261
262#[derive(#[automatically_derived]
impl ::core::marker::Copy for RerunReason { }Copy, #[automatically_derived]
impl ::core::clone::Clone for RerunReason {
#[inline]
fn clone(&self) -> RerunReason { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for RerunReason {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RerunReason::NormalizeOpaqueTypeRemoteCrate =>
"NormalizeOpaqueTypeRemoteCrate",
RerunReason::NormalizeOpaqueType => "NormalizeOpaqueType",
RerunReason::MayUseUnstableFeature => "MayUseUnstableFeature",
RerunReason::EvaluateConst => "EvaluateConst",
RerunReason::SkipErasedAttempt => "SkipErasedAttempt",
RerunReason::SelfTyInfer => "SelfTyInfer",
RerunReason::FetchEligibleAssocItem =>
"FetchEligibleAssocItem",
RerunReason::AutoTraitLeakage => "AutoTraitLeakage",
RerunReason::TryStallCoroutine => "TryStallCoroutine",
})
}
}Debug, #[automatically_derived]
impl ::core::hash::Hash for RerunReason {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for RerunReason {
#[inline]
fn eq(&self, other: &RerunReason) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RerunReason {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq)]
265#[derive(const _: () =
{
impl<I> ::rustc_type_ir::TypeVisitable<I> for RerunReason where
I: Interner {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
RerunReason::NormalizeOpaqueTypeRemoteCrate => {}
RerunReason::NormalizeOpaqueType => {}
RerunReason::MayUseUnstableFeature => {}
RerunReason::EvaluateConst => {}
RerunReason::SkipErasedAttempt => {}
RerunReason::SelfTyInfer => {}
RerunReason::FetchEligibleAssocItem => {}
RerunReason::AutoTraitLeakage => {}
RerunReason::TryStallCoroutine => {}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable)]
266#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for RerunReason
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
RerunReason::NormalizeOpaqueTypeRemoteCrate => {}
RerunReason::NormalizeOpaqueType => {}
RerunReason::MayUseUnstableFeature => {}
RerunReason::EvaluateConst => {}
RerunReason::SkipErasedAttempt => {}
RerunReason::SelfTyInfer => {}
RerunReason::FetchEligibleAssocItem => {}
RerunReason::AutoTraitLeakage => {}
RerunReason::TryStallCoroutine => {}
}
}
}
};StableHash_NoContext))]
267pub enum RerunReason {
268 NormalizeOpaqueTypeRemoteCrate,
269 NormalizeOpaqueType,
270 MayUseUnstableFeature,
271 EvaluateConst,
272 SkipErasedAttempt,
273 SelfTyInfer,
274 FetchEligibleAssocItem,
275 AutoTraitLeakage,
276 TryStallCoroutine,
277}
278
279#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for AccessedOpaques<I> where I: Interner { }#[derive_where(Copy, Clone, Debug, Hash, PartialEq, Eq; I: Interner)]
280#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
AccessedOpaques<I> where I: Interner,
RerunCondition<I>: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
AccessedOpaques { rerun: ref __binding_1, .. } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
AccessedOpaques<I> where I: Interner,
RerunCondition<I>: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
AccessedOpaques { reason: __binding_0, rerun: __binding_1 }
=> {
AccessedOpaques {
reason: __binding_0,
rerun: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
AccessedOpaques { reason: __binding_0, rerun: __binding_1 }
=> {
AccessedOpaques {
reason: __binding_0,
rerun: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable_Generic, GenericTypeVisitable)]
281#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
AccessedOpaques<I> where
RerunCondition<I>: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
AccessedOpaques {
reason: ref __binding_0, rerun: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
282pub struct AccessedOpaques<I: Interner> {
283 #[cfg_attr(feature = "nightly", type_visitable(ignore))]
284 #[type_foldable(identity)]
285 pub reason: Option<RerunReason>,
286 pub rerun: RerunCondition<I>,
287}
288
289impl<I: Interner> Default for AccessedOpaques<I> {
290 fn default() -> Self {
291 Self { reason: None, rerun: RerunCondition::Never }
292 }
293}
294
295impl<I: Interner> AccessedOpaques<I> {
296 pub fn update(&mut self, other: Self) -> Result<(), RerunNonErased> {
297 *self = Self {
298 reason: other.reason.or(self.reason),
300 rerun: self.rerun.merge(other.rerun),
302 };
303
304 self.should_bail()
305 }
306
307 #[must_use]
308 pub fn might_rerun(&self) -> bool {
309 self.rerun.might_rerun()
310 }
311
312 #[must_use]
313 pub fn should_bail(&self) -> Result<(), RerunNonErased> {
314 self.rerun.should_bail()
315 }
316
317 pub fn rerun_always(&mut self, reason: RerunReason) -> Result<Infallible, RerunNonErased> {
318 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:318",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(318u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("set rerun always")
as &dyn Value))])
});
} else { ; }
};debug!("set rerun always");
319 match self.update(AccessedOpaques { reason: Some(reason), rerun: RerunCondition::Always }) {
320 Ok(_) => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
321 Err(e) => Err(e),
322 }
323 }
324
325 pub fn rerun_if_in_post_analysis(&mut self, reason: RerunReason) -> Result<(), RerunNonErased> {
326 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:326",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(326u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("set rerun if post analysis")
as &dyn Value))])
});
} else { ; }
};debug!("set rerun if post analysis");
327 self.update(AccessedOpaques {
328 reason: Some(reason),
329 rerun: RerunCondition::OpaqueInStorage(SmallCopyList::empty()),
330 })
331 }
332
333 pub fn rerun_if_opaque_in_opaque_type_storage(
334 &mut self,
335 reason: RerunReason,
336 defid: I::LocalDefId,
337 ) -> Result<(), RerunNonErased> {
338 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:338",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(338u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("set rerun if opaque type {0:?} in storage",
defid) as &dyn Value))])
});
} else { ; }
};debug!("set rerun if opaque type {defid:?} in storage");
339 self.update(AccessedOpaques {
340 reason: Some(reason),
341 rerun: RerunCondition::OpaqueInStorage(SmallCopyList::new(defid)),
342 })
343 }
344
345 pub fn rerun_if_any_opaque_has_infer_as_hidden_type(
346 &mut self,
347 reason: RerunReason,
348 ) -> Result<(), RerunNonErased> {
349 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/solve/mod.rs:349",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(349u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("set rerun if any opaque in the storage has a hidden type that is an infer var")
as &dyn Value))])
});
} else { ; }
};debug!("set rerun if any opaque in the storage has a hidden type that is an infer var");
350 self.update(AccessedOpaques {
351 reason: Some(reason),
352 rerun: RerunCondition::AnyOpaqueHasInferAsHidden,
353 })
354 }
355}
356
357#[automatically_derived]
impl<I: Interner, P> ::core::marker::Copy for Goal<I, P> where I: Interner,
P: Copy {
}#[derive_where(Clone, Hash, PartialEq, Debug; I: Interner, P)]
363#[derive_where(Copy; I: Interner, P: Copy)]
364#[derive(const _: () =
{
impl<I: Interner, P> ::rustc_type_ir::TypeVisitable<I> for Goal<I, P>
where I: Interner, I::ParamEnv: ::rustc_type_ir::TypeVisitable<I>,
P: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
Goal {
param_env: ref __binding_0, predicate: ref __binding_1 } =>
{
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<I: Interner, P> ::rustc_type_ir::TypeFoldable<I> for Goal<I, P>
where I: Interner, I::ParamEnv: ::rustc_type_ir::TypeFoldable<I>,
P: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
Goal { param_env: __binding_0, predicate: __binding_1 } => {
Goal {
param_env: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
predicate: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
Goal { param_env: __binding_0, predicate: __binding_1 } => {
Goal {
param_env: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
predicate: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, P, J> ::rustc_type_ir::lift::Lift<J> for Goal<I, P>
where I: Interner, J: Interner,
I::ParamEnv: ::rustc_type_ir::lift::Lift<J, Lifted = J::ParamEnv>,
P: ::rustc_type_ir::lift::Lift<J, Lifted = P> {
type Lifted = Goal<J, P>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
Goal { param_env: __binding_0, predicate: __binding_1 } => {
Goal {
param_env: __binding_0.lift_to_interner(interner),
predicate: __binding_1.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic, GenericTypeVisitable)]
365#[cfg_attr(
366 feature = "nightly",
367 derive(const _: () =
{
impl<I: Interner, P, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for Goal<I, P> where
I::ParamEnv: ::rustc_serialize::Decodable<__D>,
P: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
Goal {
param_env: ::rustc_serialize::Decodable::decode(__decoder),
predicate: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner, P, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for Goal<I, P> where
I::ParamEnv: ::rustc_serialize::Encodable<__E>,
P: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
Goal {
param_env: ref __binding_0, predicate: ref __binding_1 } =>
{
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, P> ::rustc_data_structures::stable_hash::StableHash
for Goal<I, P> where
I::ParamEnv: ::rustc_data_structures::stable_hash::StableHash,
P: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Goal {
param_env: ref __binding_0, predicate: ref __binding_1 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
368)]
369pub struct Goal<I: Interner, P> {
370 pub param_env: I::ParamEnv,
371 pub predicate: P,
372}
373
374impl<I: Interner, P: Eq> Eq for Goal<I, P> {}
375
376impl<I: Interner, P> Goal<I, P> {
377 pub fn new(cx: I, param_env: I::ParamEnv, predicate: impl Upcast<I, P>) -> Goal<I, P> {
378 Goal { param_env, predicate: predicate.upcast(cx) }
379 }
380
381 pub fn with<Q>(self, cx: I, predicate: impl Upcast<I, Q>) -> Goal<I, Q> {
383 Goal { param_env: self.param_env, predicate: predicate.upcast(cx) }
384 }
385}
386
387#[derive(#[automatically_derived]
impl ::core::marker::Copy for GoalSource { }Copy, #[automatically_derived]
impl ::core::clone::Clone for GoalSource {
#[inline]
fn clone(&self) -> GoalSource {
let _: ::core::clone::AssertParamIsClone<PathKind>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for GoalSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
GoalSource::Misc => ::core::fmt::Formatter::write_str(f, "Misc"),
GoalSource::TypeRelating =>
::core::fmt::Formatter::write_str(f, "TypeRelating"),
GoalSource::ImplWhereBound =>
::core::fmt::Formatter::write_str(f, "ImplWhereBound"),
GoalSource::AliasBoundConstCondition =>
::core::fmt::Formatter::write_str(f,
"AliasBoundConstCondition"),
GoalSource::AliasWellFormed =>
::core::fmt::Formatter::write_str(f, "AliasWellFormed"),
GoalSource::NormalizeGoal(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"NormalizeGoal", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for GoalSource {
#[inline]
fn eq(&self, other: &GoalSource) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(GoalSource::NormalizeGoal(__self_0),
GoalSource::NormalizeGoal(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for GoalSource {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<PathKind>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for GoalSource {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
GoalSource::NormalizeGoal(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash)]
396#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for GoalSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
GoalSource::Misc => {}
GoalSource::TypeRelating => {}
GoalSource::ImplWhereBound => {}
GoalSource::AliasBoundConstCondition => {}
GoalSource::AliasWellFormed => {}
GoalSource::NormalizeGoal(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash))]
397pub enum GoalSource {
398 Misc,
399 TypeRelating,
405 ImplWhereBound,
407 AliasBoundConstCondition,
409 AliasWellFormed,
416 NormalizeGoal(PathKind),
422}
423
424#[automatically_derived]
impl<I: Interner, P> ::core::marker::Copy for QueryInput<I, P> where
I: Interner, Goal<I, P>: Copy {
}#[derive_where(Clone, Hash, PartialEq, Debug; I: Interner, Goal<I, P>)]
425#[derive_where(Copy; I: Interner, Goal<I, P>: Copy)]
426#[derive(const _: () =
{
impl<I: Interner, P> ::rustc_type_ir::TypeVisitable<I> for
QueryInput<I, P> where I: Interner,
Goal<I, P>: ::rustc_type_ir::TypeVisitable<I>,
I::PredefinedOpaques: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
QueryInput {
goal: ref __binding_0,
predefined_opaques_in_body: ref __binding_1 } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<I: Interner, P> ::rustc_type_ir::TypeFoldable<I> for
QueryInput<I, P> where I: Interner,
Goal<I, P>: ::rustc_type_ir::TypeFoldable<I>,
I::PredefinedOpaques: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
QueryInput {
goal: __binding_0, predefined_opaques_in_body: __binding_1 }
=> {
QueryInput {
goal: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
predefined_opaques_in_body: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
QueryInput {
goal: __binding_0, predefined_opaques_in_body: __binding_1 }
=> {
QueryInput {
goal: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
predefined_opaques_in_body: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable_Generic, GenericTypeVisitable)]
427#[cfg_attr(
428 feature = "nightly",
429 derive(const _: () =
{
impl<I: Interner, P, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for QueryInput<I, P> where
Goal<I, P>: ::rustc_serialize::Decodable<__D>,
I::PredefinedOpaques: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
QueryInput {
goal: ::rustc_serialize::Decodable::decode(__decoder),
predefined_opaques_in_body: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner, P, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for QueryInput<I, P> where
Goal<I, P>: ::rustc_serialize::Encodable<__E>,
I::PredefinedOpaques: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
QueryInput {
goal: ref __binding_0,
predefined_opaques_in_body: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, P> ::rustc_data_structures::stable_hash::StableHash
for QueryInput<I, P> where
Goal<I, P>: ::rustc_data_structures::stable_hash::StableHash,
I::PredefinedOpaques: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
QueryInput {
goal: ref __binding_0,
predefined_opaques_in_body: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
430)]
431pub struct QueryInput<I: Interner, P> {
432 pub goal: Goal<I, P>,
433 pub predefined_opaques_in_body: I::PredefinedOpaques,
434}
435
436impl<I: Interner, P: Eq> Eq for QueryInput<I, P> {}
437
438#[derive(#[automatically_derived]
impl ::core::clone::Clone for CandidatePreferenceMode {
#[inline]
fn clone(&self) -> CandidatePreferenceMode { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CandidatePreferenceMode { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for CandidatePreferenceMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CandidatePreferenceMode::Default => "Default",
CandidatePreferenceMode::Marker => "Marker",
})
}
}Debug)]
441pub enum CandidatePreferenceMode {
442 Default,
444 Marker,
446}
447
448impl CandidatePreferenceMode {
449 pub fn compute<I: Interner>(cx: I, trait_id: I::TraitId) -> CandidatePreferenceMode {
451 let is_sizedness_or_auto_or_default_goal = cx.is_sizedness_trait(trait_id)
452 || cx.trait_is_auto(trait_id)
453 || cx.is_default_trait(trait_id);
454 if is_sizedness_or_auto_or_default_goal {
455 CandidatePreferenceMode::Marker
456 } else {
457 CandidatePreferenceMode::Default
458 }
459 }
460}
461
462#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for CandidateSource<I> where I: Interner
{
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
CandidateSource::Impl(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "Impl");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
CandidateSource::BuiltinImpl(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "BuiltinImpl");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
CandidateSource::ParamEnv(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "ParamEnv");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
CandidateSource::AliasBound(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "AliasBound");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
CandidateSource::CoherenceUnknowable =>
::core::fmt::Formatter::write_str(__f, "CoherenceUnknowable"),
}
}
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
464pub enum CandidateSource<I: Interner> {
465 Impl(I::ImplId),
477 BuiltinImpl(BuiltinImplSource),
485 ParamEnv(ParamEnvSource),
498 AliasBound(AliasBoundKind),
519 CoherenceUnknowable,
524}
525
526impl<I: Interner> Eq for CandidateSource<I> {}
527
528#[derive(#[automatically_derived]
impl ::core::clone::Clone for ParamEnvSource {
#[inline]
fn clone(&self) -> ParamEnvSource { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ParamEnvSource { }Copy, #[automatically_derived]
impl ::core::hash::Hash for ParamEnvSource {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for ParamEnvSource {
#[inline]
fn eq(&self, other: &ParamEnvSource) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ParamEnvSource {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for ParamEnvSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
ParamEnvSource::NonGlobal => "NonGlobal",
ParamEnvSource::Global => "Global",
})
}
}Debug)]
529pub enum ParamEnvSource {
530 NonGlobal,
532 Global,
534}
535
536#[derive(#[automatically_derived]
impl ::core::clone::Clone for AliasBoundKind {
#[inline]
fn clone(&self) -> AliasBoundKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AliasBoundKind { }Copy, #[automatically_derived]
impl ::core::hash::Hash for AliasBoundKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for AliasBoundKind {
#[inline]
fn eq(&self, other: &AliasBoundKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AliasBoundKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for AliasBoundKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
AliasBoundKind::SelfBounds => "SelfBounds",
AliasBoundKind::NonSelfBounds => "NonSelfBounds",
})
}
}Debug)]
537#[derive(const _: () =
{
impl<I> ::rustc_type_ir::TypeVisitable<I> for AliasBoundKind where
I: Interner {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
AliasBoundKind::SelfBounds => {}
AliasBoundKind::NonSelfBounds => {}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I> ::rustc_type_ir::TypeFoldable<I> for AliasBoundKind where
I: Interner {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
AliasBoundKind::SelfBounds => { AliasBoundKind::SelfBounds }
AliasBoundKind::NonSelfBounds => {
AliasBoundKind::NonSelfBounds
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
AliasBoundKind::SelfBounds => { AliasBoundKind::SelfBounds }
AliasBoundKind::NonSelfBounds => {
AliasBoundKind::NonSelfBounds
}
}
}
}
};TypeFoldable_Generic)]
538pub enum AliasBoundKind {
539 SelfBounds,
541 NonSelfBounds,
543}
544
545#[derive(#[automatically_derived]
impl ::core::clone::Clone for BuiltinImplSource {
#[inline]
fn clone(&self) -> BuiltinImplSource {
let _: ::core::clone::AssertParamIsClone<usize>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BuiltinImplSource { }Copy, #[automatically_derived]
impl ::core::hash::Hash for BuiltinImplSource {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
BuiltinImplSource::Object(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
BuiltinImplSource::TraitUpcasting(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for BuiltinImplSource {
#[inline]
fn eq(&self, other: &BuiltinImplSource) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(BuiltinImplSource::Object(__self_0),
BuiltinImplSource::Object(__arg1_0)) =>
__self_0 == __arg1_0,
(BuiltinImplSource::TraitUpcasting(__self_0),
BuiltinImplSource::TraitUpcasting(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BuiltinImplSource {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<usize>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for BuiltinImplSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
BuiltinImplSource::Trivial =>
::core::fmt::Formatter::write_str(f, "Trivial"),
BuiltinImplSource::Misc =>
::core::fmt::Formatter::write_str(f, "Misc"),
BuiltinImplSource::Object(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Object",
&__self_0),
BuiltinImplSource::TraitUpcasting(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TraitUpcasting", &__self_0),
}
}
}Debug)]
546#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
BuiltinImplSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
BuiltinImplSource::Trivial => {}
BuiltinImplSource::Misc => {}
BuiltinImplSource::Object(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
BuiltinImplSource::TraitUpcasting(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for BuiltinImplSource {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
BuiltinImplSource::Trivial => { 0usize }
BuiltinImplSource::Misc => { 1usize }
BuiltinImplSource::Object(ref __binding_0) => { 2usize }
BuiltinImplSource::TraitUpcasting(ref __binding_0) => {
3usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
BuiltinImplSource::Trivial => {}
BuiltinImplSource::Misc => {}
BuiltinImplSource::Object(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
BuiltinImplSource::TraitUpcasting(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<__D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for BuiltinImplSource {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { BuiltinImplSource::Trivial }
1usize => { BuiltinImplSource::Misc }
2usize => {
BuiltinImplSource::Object(::rustc_serialize::Decodable::decode(__decoder))
}
3usize => {
BuiltinImplSource::TraitUpcasting(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BuiltinImplSource`, expected 0..4, actual {0}",
n));
}
}
}
}
};Decodable_NoContext))]
547pub enum BuiltinImplSource {
548 Trivial,
551 Misc,
554 Object(usize),
556 TraitUpcasting(usize),
560}
561
562#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for FetchEligibleAssocItemResponse<I>
where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
FetchEligibleAssocItemResponse::Err(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "Err");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
FetchEligibleAssocItemResponse::Found(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "Found");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
FetchEligibleAssocItemResponse::NotFound(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "NotFound");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
FetchEligibleAssocItemResponse::NotFoundBecauseErased =>
::core::fmt::Formatter::write_str(__f,
"NotFoundBecauseErased"),
}
}
}#[derive_where(Copy, Clone, Debug; I: Interner)]
563pub enum FetchEligibleAssocItemResponse<I: Interner> {
564 Err(I::ErrorGuaranteed),
565 Found(I::ImplOrTraitAssocTermId),
566 NotFound(TypingMode<I, CantBeErased>),
567 NotFoundBecauseErased,
568}
569
570#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for Response<I> where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
Response {
certainty: ref __field_certainty,
var_values: ref __field_var_values,
external_constraints: ref __field_external_constraints } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Response");
::core::fmt::DebugStruct::field(&mut __builder, "certainty",
__field_certainty);
::core::fmt::DebugStruct::field(&mut __builder, "var_values",
__field_var_values);
::core::fmt::DebugStruct::field(&mut __builder,
"external_constraints", __field_external_constraints);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner)]
571#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for Response<I>
where I: Interner,
CanonicalVarValues<I>: ::rustc_type_ir::TypeVisitable<I>,
I::ExternalConstraints: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
Response {
certainty: ref __binding_0,
var_values: ref __binding_1,
external_constraints: ref __binding_2 } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_2,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for Response<I>
where I: Interner,
CanonicalVarValues<I>: ::rustc_type_ir::TypeFoldable<I>,
I::ExternalConstraints: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
Response {
certainty: __binding_0,
var_values: __binding_1,
external_constraints: __binding_2 } => {
Response {
certainty: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
var_values: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
external_constraints: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
Response {
certainty: __binding_0,
var_values: __binding_1,
external_constraints: __binding_2 } => {
Response {
certainty: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
var_values: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
external_constraints: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
__folder),
}
}
}
}
}
};TypeFoldable_Generic)]
572#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
Response<I> where
CanonicalVarValues<I>: ::rustc_data_structures::stable_hash::StableHash,
I::ExternalConstraints: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Response {
certainty: ref __binding_0,
var_values: ref __binding_1,
external_constraints: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
573pub struct Response<I: Interner> {
574 pub certainty: Certainty,
575 pub var_values: CanonicalVarValues<I>,
576 pub external_constraints: I::ExternalConstraints,
578}
579
580impl<I: Interner> Eq for Response<I> {}
581
582#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for ExternalRegionConstraints<I> where
I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
ExternalRegionConstraints::Old(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "Old");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
ExternalRegionConstraints::NextGen(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "NextGen");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Hash, PartialEq, Debug; I: Interner)]
583#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
ExternalRegionConstraints<I> where I: Interner,
Vec<(ty::RegionConstraint<I>,
VisibleForLeakCheck)>: ::rustc_type_ir::TypeVisitable<I>,
RegionConstraint<I>: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ExternalRegionConstraints::Old(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
ExternalRegionConstraints::NextGen(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
ExternalRegionConstraints<I> where I: Interner,
Vec<(ty::RegionConstraint<I>,
VisibleForLeakCheck)>: ::rustc_type_ir::TypeFoldable<I>,
RegionConstraint<I>: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ExternalRegionConstraints::Old(__binding_0) => {
ExternalRegionConstraints::Old(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
ExternalRegionConstraints::NextGen(__binding_0) => {
ExternalRegionConstraints::NextGen(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
ExternalRegionConstraints::Old(__binding_0) => {
ExternalRegionConstraints::Old(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
ExternalRegionConstraints::NextGen(__binding_0) => {
ExternalRegionConstraints::NextGen(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
}
}
}
};TypeFoldable_Generic)]
584#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
ExternalRegionConstraints<I> where
Vec<(ty::RegionConstraint<I>,
VisibleForLeakCheck)>: ::rustc_data_structures::stable_hash::StableHash,
RegionConstraint<I>: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ExternalRegionConstraints::Old(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExternalRegionConstraints::NextGen(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
585pub enum ExternalRegionConstraints<I: Interner> {
586 Old(Vec<(ty::RegionConstraint<I>, VisibleForLeakCheck)>),
588 NextGen(RegionConstraint<I>),
591}
592
593impl<I: Interner> ExternalRegionConstraints<I> {
594 pub fn is_empty(&self) -> bool {
595 match self {
596 Self::Old(r) => r.is_empty(),
597 Self::NextGen(r) => r.is_true(),
598 }
599 }
600}
601
602#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for ExternalConstraintsData<I> where
I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
ExternalConstraintsData {
region_constraints: ref __field_region_constraints,
opaque_types: ref __field_opaque_types,
normalization_nested_goals: ref __field_normalization_nested_goals
} => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f,
"ExternalConstraintsData");
::core::fmt::DebugStruct::field(&mut __builder,
"region_constraints", __field_region_constraints);
::core::fmt::DebugStruct::field(&mut __builder,
"opaque_types", __field_opaque_types);
::core::fmt::DebugStruct::field(&mut __builder,
"normalization_nested_goals",
__field_normalization_nested_goals);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Hash, PartialEq, Debug; I: Interner)]
604#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
ExternalConstraintsData<I> where I: Interner,
ExternalRegionConstraints<I>: ::rustc_type_ir::TypeVisitable<I>,
Vec<(ty::OpaqueTypeKey<I>,
I::Ty)>: ::rustc_type_ir::TypeVisitable<I>,
NestedNormalizationGoals<I>: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ExternalConstraintsData {
region_constraints: ref __binding_0,
opaque_types: ref __binding_1,
normalization_nested_goals: ref __binding_2 } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_2,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
ExternalConstraintsData<I> where I: Interner,
ExternalRegionConstraints<I>: ::rustc_type_ir::TypeFoldable<I>,
Vec<(ty::OpaqueTypeKey<I>,
I::Ty)>: ::rustc_type_ir::TypeFoldable<I>,
NestedNormalizationGoals<I>: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ExternalConstraintsData {
region_constraints: __binding_0,
opaque_types: __binding_1,
normalization_nested_goals: __binding_2 } => {
ExternalConstraintsData {
region_constraints: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
opaque_types: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
normalization_nested_goals: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
ExternalConstraintsData {
region_constraints: __binding_0,
opaque_types: __binding_1,
normalization_nested_goals: __binding_2 } => {
ExternalConstraintsData {
region_constraints: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
opaque_types: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
normalization_nested_goals: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
__folder),
}
}
}
}
}
};TypeFoldable_Generic)]
605#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
ExternalConstraintsData<I> where
ExternalRegionConstraints<I>: ::rustc_data_structures::stable_hash::StableHash,
Vec<(ty::OpaqueTypeKey<I>,
I::Ty)>: ::rustc_data_structures::stable_hash::StableHash,
NestedNormalizationGoals<I>: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ExternalConstraintsData {
region_constraints: ref __binding_0,
opaque_types: ref __binding_1,
normalization_nested_goals: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
606pub struct ExternalConstraintsData<I: Interner> {
607 pub region_constraints: ExternalRegionConstraints<I>,
608 pub opaque_types: Vec<(ty::OpaqueTypeKey<I>, I::Ty)>,
609 pub normalization_nested_goals: NestedNormalizationGoals<I>,
610}
611
612impl<I: Interner> Eq for ExternalConstraintsData<I> {}
613
614impl<I: Interner> ExternalConstraintsData<I> {
615 pub fn new(cx: I) -> Self {
616 let region_constraints = match cx.assumptions_on_binders() {
617 true => ExternalRegionConstraints::NextGen(RegionConstraint::new_true()),
618 false => ExternalRegionConstraints::Old(::alloc::vec::Vec::new()vec![]),
619 };
620
621 Self {
622 region_constraints,
623 opaque_types: ::alloc::vec::Vec::new()vec![],
624 normalization_nested_goals: NestedNormalizationGoals::default(),
625 }
626 }
627
628 pub fn is_empty(&self) -> bool {
629 let ExternalConstraintsData {
630 region_constraints,
631 opaque_types,
632 normalization_nested_goals,
633 } = self;
634 region_constraints.is_empty()
635 && opaque_types.is_empty()
636 && normalization_nested_goals.is_empty()
637 }
638}
639
640#[derive(#[automatically_derived]
impl ::core::clone::Clone for VisibleForLeakCheck {
#[inline]
fn clone(&self) -> VisibleForLeakCheck { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for VisibleForLeakCheck { }Copy, #[automatically_derived]
impl ::core::hash::Hash for VisibleForLeakCheck {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for VisibleForLeakCheck {
#[inline]
fn eq(&self, other: &VisibleForLeakCheck) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VisibleForLeakCheck {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for VisibleForLeakCheck {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
VisibleForLeakCheck::Yes => "Yes",
VisibleForLeakCheck::No => "No",
VisibleForLeakCheck::Unreachable => "Unreachable",
})
}
}Debug)]
646#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
VisibleForLeakCheck {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
VisibleForLeakCheck::Yes => {}
VisibleForLeakCheck::No => {}
VisibleForLeakCheck::Unreachable => {}
}
}
}
};StableHash_NoContext))]
647pub enum VisibleForLeakCheck {
648 Yes,
649 No,
650 Unreachable,
651}
652
653impl VisibleForLeakCheck {
654 pub fn and(self, other: VisibleForLeakCheck) -> VisibleForLeakCheck {
655 match (self, other) {
656 (VisibleForLeakCheck::Unreachable, _) | (_, VisibleForLeakCheck::Unreachable) => {
659 VisibleForLeakCheck::Unreachable
660 }
661 (VisibleForLeakCheck::No, _) | (_, VisibleForLeakCheck::No) => VisibleForLeakCheck::No,
662 (VisibleForLeakCheck::Yes, VisibleForLeakCheck::Yes) => VisibleForLeakCheck::Yes,
663 }
664 }
665
666 pub fn or(self, other: VisibleForLeakCheck) -> VisibleForLeakCheck {
667 match (self, other) {
668 (VisibleForLeakCheck::Unreachable, _) | (_, VisibleForLeakCheck::Unreachable) => {
671 VisibleForLeakCheck::Unreachable
672 }
673 (VisibleForLeakCheck::Yes, _) | (_, VisibleForLeakCheck::Yes) => {
674 VisibleForLeakCheck::Yes
675 }
676 (VisibleForLeakCheck::No, VisibleForLeakCheck::No) => VisibleForLeakCheck::No,
677 }
678 }
679}
680
681#[automatically_derived]
impl<I: Interner> ::core::default::Default for NestedNormalizationGoals<I>
where I: Interner {
fn default() -> Self {
NestedNormalizationGoals(::core::default::Default::default())
}
}#[derive_where(Clone, Hash, PartialEq, Debug, Default; I: Interner)]
682#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
NestedNormalizationGoals<I> where I: Interner,
Vec<(GoalSource,
Goal<I, I::Predicate>)>: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
NestedNormalizationGoals(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
NestedNormalizationGoals<I> where I: Interner,
Vec<(GoalSource,
Goal<I, I::Predicate>)>: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
NestedNormalizationGoals(__binding_0) => {
NestedNormalizationGoals(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
NestedNormalizationGoals(__binding_0) => {
NestedNormalizationGoals(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
}
}
}
};TypeFoldable_Generic)]
683#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
NestedNormalizationGoals<I> where
Vec<(GoalSource,
Goal<I,
I::Predicate>)>: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
NestedNormalizationGoals(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
684pub struct NestedNormalizationGoals<I: Interner>(pub Vec<(GoalSource, Goal<I, I::Predicate>)>);
685
686impl<I: Interner> Eq for NestedNormalizationGoals<I> {}
687
688impl<I: Interner> NestedNormalizationGoals<I> {
689 pub fn empty() -> Self {
690 NestedNormalizationGoals(::alloc::vec::Vec::new()vec![])
691 }
692
693 pub fn is_empty(&self) -> bool {
694 self.0.is_empty()
695 }
696}
697
698#[derive(#[automatically_derived]
impl ::core::clone::Clone for Certainty {
#[inline]
fn clone(&self) -> Certainty {
let _: ::core::clone::AssertParamIsClone<MaybeInfo>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Certainty { }Copy, #[automatically_derived]
impl ::core::hash::Hash for Certainty {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Certainty::Maybe(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for Certainty {
#[inline]
fn eq(&self, other: &Certainty) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Certainty::Maybe(__self_0), Certainty::Maybe(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Certainty {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<MaybeInfo>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for Certainty {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Certainty::Yes => ::core::fmt::Formatter::write_str(f, "Yes"),
Certainty::Maybe(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Maybe",
&__self_0),
}
}
}Debug)]
699#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Certainty {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Certainty::Yes => {}
Certainty::Maybe(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash))]
700pub enum Certainty {
701 Yes,
702 Maybe(MaybeInfo),
703}
704
705#[derive(#[automatically_derived]
impl ::core::clone::Clone for MaybeInfo {
#[inline]
fn clone(&self) -> MaybeInfo {
let _: ::core::clone::AssertParamIsClone<MaybeCause>;
let _: ::core::clone::AssertParamIsClone<OpaqueTypesJank>;
let _: ::core::clone::AssertParamIsClone<StalledOnCoroutines>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MaybeInfo { }Copy, #[automatically_derived]
impl ::core::hash::Hash for MaybeInfo {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.cause, state);
::core::hash::Hash::hash(&self.opaque_types_jank, state);
::core::hash::Hash::hash(&self.stalled_on_coroutines, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for MaybeInfo {
#[inline]
fn eq(&self, other: &MaybeInfo) -> bool {
self.cause == other.cause &&
self.opaque_types_jank == other.opaque_types_jank &&
self.stalled_on_coroutines == other.stalled_on_coroutines
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MaybeInfo {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<MaybeCause>;
let _: ::core::cmp::AssertParamIsEq<OpaqueTypesJank>;
let _: ::core::cmp::AssertParamIsEq<StalledOnCoroutines>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for MaybeInfo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "MaybeInfo",
"cause", &self.cause, "opaque_types_jank",
&self.opaque_types_jank, "stalled_on_coroutines",
&&self.stalled_on_coroutines)
}
}Debug)]
706#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for MaybeInfo {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
MaybeInfo {
cause: ref __binding_0,
opaque_types_jank: ref __binding_1,
stalled_on_coroutines: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
707pub struct MaybeInfo {
708 pub cause: MaybeCause,
709 pub opaque_types_jank: OpaqueTypesJank,
710 pub stalled_on_coroutines: StalledOnCoroutines,
711}
712
713impl MaybeInfo {
714 pub const AMBIGUOUS: MaybeInfo = MaybeInfo {
715 cause: MaybeCause::Ambiguity,
716 opaque_types_jank: OpaqueTypesJank::AllGood,
717 stalled_on_coroutines: StalledOnCoroutines::No,
718 };
719
720 fn and(self, other: MaybeInfo) -> MaybeInfo {
721 MaybeInfo {
722 cause: self.cause.and(other.cause),
723 opaque_types_jank: self.opaque_types_jank.and(other.opaque_types_jank),
724 stalled_on_coroutines: self.stalled_on_coroutines.and(other.stalled_on_coroutines),
725 }
726 }
727
728 pub fn or(self, other: MaybeInfo) -> MaybeInfo {
729 MaybeInfo {
730 cause: self.cause.or(other.cause),
731 opaque_types_jank: self.opaque_types_jank.or(other.opaque_types_jank),
732 stalled_on_coroutines: self.stalled_on_coroutines.or(other.stalled_on_coroutines),
733 }
734 }
735}
736
737#[derive(#[automatically_derived]
impl ::core::clone::Clone for OpaqueTypesJank {
#[inline]
fn clone(&self) -> OpaqueTypesJank { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for OpaqueTypesJank { }Copy, #[automatically_derived]
impl ::core::hash::Hash for OpaqueTypesJank {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for OpaqueTypesJank {
#[inline]
fn eq(&self, other: &OpaqueTypesJank) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for OpaqueTypesJank {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for OpaqueTypesJank {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
OpaqueTypesJank::AllGood => "AllGood",
OpaqueTypesJank::ErrorIfRigidSelfTy => "ErrorIfRigidSelfTy",
})
}
}Debug)]
766#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
OpaqueTypesJank {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
OpaqueTypesJank::AllGood => {}
OpaqueTypesJank::ErrorIfRigidSelfTy => {}
}
}
}
};StableHash))]
767pub enum OpaqueTypesJank {
768 AllGood,
769 ErrorIfRigidSelfTy,
770}
771impl OpaqueTypesJank {
772 fn and(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
773 match (self, other) {
774 (OpaqueTypesJank::AllGood, OpaqueTypesJank::AllGood) => OpaqueTypesJank::AllGood,
775 (OpaqueTypesJank::ErrorIfRigidSelfTy, _) | (_, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
776 OpaqueTypesJank::ErrorIfRigidSelfTy
777 }
778 }
779 }
780
781 pub fn or(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
782 match (self, other) {
783 (OpaqueTypesJank::ErrorIfRigidSelfTy, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
784 OpaqueTypesJank::ErrorIfRigidSelfTy
785 }
786 (OpaqueTypesJank::AllGood, _) | (_, OpaqueTypesJank::AllGood) => {
787 OpaqueTypesJank::AllGood
788 }
789 }
790 }
791}
792
793#[derive(#[automatically_derived]
impl ::core::clone::Clone for StalledOnCoroutines {
#[inline]
fn clone(&self) -> StalledOnCoroutines { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for StalledOnCoroutines { }Copy, #[automatically_derived]
impl ::core::hash::Hash for StalledOnCoroutines {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for StalledOnCoroutines {
#[inline]
fn eq(&self, other: &StalledOnCoroutines) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for StalledOnCoroutines {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for StalledOnCoroutines {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
StalledOnCoroutines::Yes => "Yes",
StalledOnCoroutines::No => "No",
})
}
}Debug)]
794#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
StalledOnCoroutines {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
StalledOnCoroutines::Yes => {}
StalledOnCoroutines::No => {}
}
}
}
};StableHash_NoContext))]
795pub enum StalledOnCoroutines {
796 Yes,
797 No,
798}
799
800impl StalledOnCoroutines {
801 fn and(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
802 match (self, other) {
803 (StalledOnCoroutines::No, StalledOnCoroutines::No) => StalledOnCoroutines::No,
804 (StalledOnCoroutines::Yes, _) | (_, StalledOnCoroutines::Yes) => {
805 StalledOnCoroutines::Yes
806 }
807 }
808 }
809
810 pub fn or(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
811 StalledOnCoroutines::and(self, other)
815 }
816}
817
818impl Certainty {
819 pub const AMBIGUOUS: Certainty = Certainty::Maybe(MaybeInfo::AMBIGUOUS);
820
821 pub fn and(self, other: Certainty) -> Certainty {
834 match (self, other) {
835 (Certainty::Yes, Certainty::Yes) => Certainty::Yes,
836 (Certainty::Yes, Certainty::Maybe { .. }) => other,
837 (Certainty::Maybe { .. }, Certainty::Yes) => self,
838 (Certainty::Maybe(a_maybe), Certainty::Maybe(b_maybe)) => {
839 Certainty::Maybe(a_maybe.and(b_maybe))
840 }
841 }
842 }
843
844 pub const fn overflow(suggest_increasing_limit: bool) -> Certainty {
845 Certainty::Maybe(MaybeInfo {
846 cause: MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: false },
847 opaque_types_jank: OpaqueTypesJank::AllGood,
848 stalled_on_coroutines: StalledOnCoroutines::No,
849 })
850 }
851}
852
853#[derive(#[automatically_derived]
impl ::core::clone::Clone for MaybeCause {
#[inline]
fn clone(&self) -> MaybeCause {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MaybeCause { }Copy, #[automatically_derived]
impl ::core::hash::Hash for MaybeCause {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
MaybeCause::Overflow {
suggest_increasing_limit: __self_0, keep_constraints: __self_1
} => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for MaybeCause {
#[inline]
fn eq(&self, other: &MaybeCause) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(MaybeCause::Overflow {
suggest_increasing_limit: __self_0,
keep_constraints: __self_1 }, MaybeCause::Overflow {
suggest_increasing_limit: __arg1_0,
keep_constraints: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MaybeCause {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for MaybeCause {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
MaybeCause::Ambiguity =>
::core::fmt::Formatter::write_str(f, "Ambiguity"),
MaybeCause::Overflow {
suggest_increasing_limit: __self_0, keep_constraints: __self_1
} =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Overflow", "suggest_increasing_limit", __self_0,
"keep_constraints", &__self_1),
}
}
}Debug)]
855#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for MaybeCause {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
MaybeCause::Ambiguity => {}
MaybeCause::Overflow {
suggest_increasing_limit: ref __binding_0,
keep_constraints: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash))]
856pub enum MaybeCause {
857 Ambiguity,
861 Overflow { suggest_increasing_limit: bool, keep_constraints: bool },
863}
864
865impl MaybeCause {
866 fn and(self, other: MaybeCause) -> MaybeCause {
867 match (self, other) {
868 (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
869 (MaybeCause::Ambiguity, MaybeCause::Overflow { .. }) => other,
870 (MaybeCause::Overflow { .. }, MaybeCause::Ambiguity) => self,
871 (
872 MaybeCause::Overflow {
873 suggest_increasing_limit: limit_a,
874 keep_constraints: keep_a,
875 },
876 MaybeCause::Overflow {
877 suggest_increasing_limit: limit_b,
878 keep_constraints: keep_b,
879 },
880 ) => MaybeCause::Overflow {
881 suggest_increasing_limit: limit_a && limit_b,
882 keep_constraints: keep_a && keep_b,
883 },
884 }
885 }
886
887 pub fn or(self, other: MaybeCause) -> MaybeCause {
888 match (self, other) {
889 (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
890
891 (
893 MaybeCause::Ambiguity,
894 MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
895 ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
896 (
897 MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
898 MaybeCause::Ambiguity,
899 ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
900
901 (
902 MaybeCause::Overflow {
903 suggest_increasing_limit: limit_a,
904 keep_constraints: keep_a,
905 },
906 MaybeCause::Overflow {
907 suggest_increasing_limit: limit_b,
908 keep_constraints: keep_b,
909 },
910 ) => MaybeCause::Overflow {
911 suggest_increasing_limit: limit_a || limit_b,
912 keep_constraints: keep_a || keep_b,
913 },
914 }
915 }
916}
917
918#[derive(#[automatically_derived]
impl ::core::fmt::Debug for AdtDestructorKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
AdtDestructorKind::NotConst => "NotConst",
AdtDestructorKind::Const => "Const",
})
}
}Debug)]
920pub enum AdtDestructorKind {
921 NotConst,
922 Const,
923}
924
925#[derive(#[automatically_derived]
impl ::core::marker::Copy for SizedTraitKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for SizedTraitKind {
#[inline]
fn clone(&self) -> SizedTraitKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for SizedTraitKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
SizedTraitKind::Sized => "Sized",
SizedTraitKind::MetaSized => "MetaSized",
})
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for SizedTraitKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for SizedTraitKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for SizedTraitKind {
#[inline]
fn eq(&self, other: &SizedTraitKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq)]
928#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
SizedTraitKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
SizedTraitKind::Sized => {}
SizedTraitKind::MetaSized => {}
}
}
}
};StableHash))]
929pub enum SizedTraitKind {
930 Sized,
932 MetaSized,
934}
935
936impl SizedTraitKind {
937 pub fn require_lang_item<I: Interner>(self, cx: I) -> I::TraitId {
939 cx.require_trait_lang_item(match self {
940 SizedTraitKind::Sized => SolverTraitLangItem::Sized,
941 SizedTraitKind::MetaSized => SolverTraitLangItem::MetaSized,
942 })
943 }
944}