1pub mod inspect;
2
3use std::hash::Hash;
4
5use derive_where::derive_where;
6#[cfg(feature = "nightly")]
7use rustc_macros::{Decodable_NoContext, Encodable_NoContext, HashStable_NoContext};
8use rustc_type_ir_macros::{
9 GenericTypeVisitable, Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic,
10};
11
12use crate::lang_items::SolverTraitLangItem;
13use crate::search_graph::PathKind;
14use crate::{self as ty, Canonical, CanonicalVarValues, Interner, Upcast};
15
16pub type CanonicalInput<I, T = <I as Interner>::Predicate> =
17 ty::CanonicalQueryInput<I, QueryInput<I, T>>;
18pub type CanonicalResponse<I> = Canonical<I, Response<I>>;
19pub type QueryResult<I> = Result<CanonicalResponse<I>, NoSolution>;
26
27#[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)]
28#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for NoSolution {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self { NoSolution => {} }
}
}
};HashStable_NoContext))]
29pub struct NoSolution;
30
31#[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)]
37#[derive_where(Copy; I: Interner, P: Copy)]
38#[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, GenericTypeVisitable, 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) -> Option<Self::Lifted> {
Some(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)]
39#[cfg_attr(
40 feature = "nightly",
41 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, __CTX>
::rustc_data_structures::stable_hasher::HashStable<__CTX> for
Goal<I, P> where
I::ParamEnv: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
P: ::rustc_data_structures::stable_hasher::HashStable<__CTX> {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Goal {
param_env: ref __binding_0, predicate: ref __binding_1 } =>
{
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext)
42)]
43pub struct Goal<I: Interner, P> {
44 pub param_env: I::ParamEnv,
45 pub predicate: P,
46}
47
48impl<I: Interner, P: Eq> Eq for Goal<I, P> {}
49
50impl<I: Interner, P> Goal<I, P> {
51 pub fn new(cx: I, param_env: I::ParamEnv, predicate: impl Upcast<I, P>) -> Goal<I, P> {
52 Goal { param_env, predicate: predicate.upcast(cx) }
53 }
54
55 pub fn with<Q>(self, cx: I, predicate: impl Upcast<I, Q>) -> Goal<I, Q> {
57 Goal { param_env: self.param_env, predicate: predicate.upcast(cx) }
58 }
59}
60
61#[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)]
70#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for GoalSource {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
GoalSource::Misc => {}
GoalSource::TypeRelating => {}
GoalSource::ImplWhereBound => {}
GoalSource::AliasBoundConstCondition => {}
GoalSource::AliasWellFormed => {}
GoalSource::NormalizeGoal(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext))]
71pub enum GoalSource {
72 Misc,
73 TypeRelating,
79 ImplWhereBound,
81 AliasBoundConstCondition,
83 AliasWellFormed,
90 NormalizeGoal(PathKind),
96}
97
98#[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>)]
99#[derive_where(Copy; I: Interner, Goal<I, P>: Copy)]
100#[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, GenericTypeVisitable, 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)]
101#[cfg_attr(
102 feature = "nightly",
103 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, __CTX>
::rustc_data_structures::stable_hasher::HashStable<__CTX> for
QueryInput<I, P> where
Goal<I,
P>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
I::PredefinedOpaques: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
{
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
QueryInput {
goal: ref __binding_0,
predefined_opaques_in_body: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext)
104)]
105pub struct QueryInput<I: Interner, P> {
106 pub goal: Goal<I, P>,
107 pub predefined_opaques_in_body: I::PredefinedOpaques,
108}
109
110impl<I: Interner, P: Eq> Eq for QueryInput<I, P> {}
111
112#[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)]
115pub enum CandidatePreferenceMode {
116 Default,
118 Marker,
120}
121
122impl CandidatePreferenceMode {
123 pub fn compute<I: Interner>(cx: I, trait_id: I::TraitId) -> CandidatePreferenceMode {
125 let is_sizedness_or_auto_or_default_goal = cx.is_sizedness_trait(trait_id)
126 || cx.trait_is_auto(trait_id)
127 || cx.is_default_trait(trait_id);
128 if is_sizedness_or_auto_or_default_goal {
129 CandidatePreferenceMode::Marker
130 } else {
131 CandidatePreferenceMode::Default
132 }
133 }
134}
135
136#[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)]
138pub enum CandidateSource<I: Interner> {
139 Impl(I::ImplId),
151 BuiltinImpl(BuiltinImplSource),
159 ParamEnv(ParamEnvSource),
172 AliasBound(AliasBoundKind),
193 CoherenceUnknowable,
198}
199
200impl<I: Interner> Eq for CandidateSource<I> {}
201
202#[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)]
203pub enum ParamEnvSource {
204 NonGlobal,
206 Global,
208}
209
210#[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)]
211#[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)]
212pub enum AliasBoundKind {
213 SelfBounds,
215 NonSelfBounds,
217}
218
219#[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)]
220#[cfg_attr(
221 feature = "nightly",
222 derive(const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for BuiltinImplSource {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
BuiltinImplSource::Trivial => {}
BuiltinImplSource::Misc => {}
BuiltinImplSource::Object(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
BuiltinImplSource::TraitUpcasting(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext, 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)
223)]
224pub enum BuiltinImplSource {
225 Trivial,
228 Misc,
231 Object(usize),
233 TraitUpcasting(usize),
237}
238
239#[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)]
240#[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)]
241#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner, __CTX>
::rustc_data_structures::stable_hasher::HashStable<__CTX> for
Response<I> where
CanonicalVarValues<I>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
I::ExternalConstraints: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
{
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Response {
certainty: ref __binding_0,
var_values: ref __binding_1,
external_constraints: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext))]
242pub struct Response<I: Interner> {
243 pub certainty: Certainty,
244 pub var_values: CanonicalVarValues<I>,
245 pub external_constraints: I::ExternalConstraints,
247}
248
249impl<I: Interner> Eq for Response<I> {}
250
251#[automatically_derived]
impl<I: Interner> ::core::default::Default for ExternalConstraintsData<I>
where I: Interner {
fn default() -> Self {
ExternalConstraintsData {
region_constraints: ::core::default::Default::default(),
opaque_types: ::core::default::Default::default(),
normalization_nested_goals: ::core::default::Default::default(),
}
}
}#[derive_where(Clone, Hash, PartialEq, Debug, Default; I: Interner)]
253#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
ExternalConstraintsData<I> where I: Interner,
Vec<ty::RegionConstraint<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,
Vec<ty::RegionConstraint<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)]
254#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner, __CTX>
::rustc_data_structures::stable_hasher::HashStable<__CTX> for
ExternalConstraintsData<I> where
Vec<ty::RegionConstraint<I>>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
Vec<(ty::OpaqueTypeKey<I>,
I::Ty)>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>,
NestedNormalizationGoals<I>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
{
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ExternalConstraintsData {
region_constraints: ref __binding_0,
opaque_types: ref __binding_1,
normalization_nested_goals: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext))]
255pub struct ExternalConstraintsData<I: Interner> {
256 pub region_constraints: Vec<ty::RegionConstraint<I>>,
257 pub opaque_types: Vec<(ty::OpaqueTypeKey<I>, I::Ty)>,
258 pub normalization_nested_goals: NestedNormalizationGoals<I>,
259}
260
261impl<I: Interner> Eq for ExternalConstraintsData<I> {}
262
263impl<I: Interner> ExternalConstraintsData<I> {
264 pub fn is_empty(&self) -> bool {
265 self.region_constraints.is_empty()
266 && self.opaque_types.is_empty()
267 && self.normalization_nested_goals.is_empty()
268 }
269}
270
271#[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)]
272#[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)]
273#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner, __CTX>
::rustc_data_structures::stable_hasher::HashStable<__CTX> for
NestedNormalizationGoals<I> where
Vec<(GoalSource,
Goal<I,
I::Predicate>)>: ::rustc_data_structures::stable_hasher::HashStable<__CTX>
{
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
NestedNormalizationGoals(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext))]
274pub struct NestedNormalizationGoals<I: Interner>(pub Vec<(GoalSource, Goal<I, I::Predicate>)>);
275
276impl<I: Interner> Eq for NestedNormalizationGoals<I> {}
277
278impl<I: Interner> NestedNormalizationGoals<I> {
279 pub fn empty() -> Self {
280 NestedNormalizationGoals(::alloc::vec::Vec::new()vec![])
281 }
282
283 pub fn is_empty(&self) -> bool {
284 self.0.is_empty()
285 }
286}
287
288#[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)]
289#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for Certainty {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
Certainty::Yes => {}
Certainty::Maybe(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext))]
290pub enum Certainty {
291 Yes,
292 Maybe(MaybeInfo),
293}
294
295#[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)]
296#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for MaybeInfo {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
MaybeInfo {
cause: ref __binding_0,
opaque_types_jank: ref __binding_1,
stalled_on_coroutines: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext))]
297pub struct MaybeInfo {
298 pub cause: MaybeCause,
299 pub opaque_types_jank: OpaqueTypesJank,
300 pub stalled_on_coroutines: StalledOnCoroutines,
301}
302
303impl MaybeInfo {
304 pub const AMBIGUOUS: MaybeInfo = MaybeInfo {
305 cause: MaybeCause::Ambiguity,
306 opaque_types_jank: OpaqueTypesJank::AllGood,
307 stalled_on_coroutines: StalledOnCoroutines::No,
308 };
309
310 fn and(self, other: MaybeInfo) -> MaybeInfo {
311 MaybeInfo {
312 cause: self.cause.and(other.cause),
313 opaque_types_jank: self.opaque_types_jank.and(other.opaque_types_jank),
314 stalled_on_coroutines: self.stalled_on_coroutines.and(other.stalled_on_coroutines),
315 }
316 }
317
318 pub fn or(self, other: MaybeInfo) -> MaybeInfo {
319 MaybeInfo {
320 cause: self.cause.or(other.cause),
321 opaque_types_jank: self.opaque_types_jank.or(other.opaque_types_jank),
322 stalled_on_coroutines: self.stalled_on_coroutines.or(other.stalled_on_coroutines),
323 }
324 }
325}
326
327#[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)]
356#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for OpaqueTypesJank {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
OpaqueTypesJank::AllGood => {}
OpaqueTypesJank::ErrorIfRigidSelfTy => {}
}
}
}
};HashStable_NoContext))]
357pub enum OpaqueTypesJank {
358 AllGood,
359 ErrorIfRigidSelfTy,
360}
361impl OpaqueTypesJank {
362 fn and(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
363 match (self, other) {
364 (OpaqueTypesJank::AllGood, OpaqueTypesJank::AllGood) => OpaqueTypesJank::AllGood,
365 (OpaqueTypesJank::ErrorIfRigidSelfTy, _) | (_, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
366 OpaqueTypesJank::ErrorIfRigidSelfTy
367 }
368 }
369 }
370
371 pub fn or(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
372 match (self, other) {
373 (OpaqueTypesJank::ErrorIfRigidSelfTy, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
374 OpaqueTypesJank::ErrorIfRigidSelfTy
375 }
376 (OpaqueTypesJank::AllGood, _) | (_, OpaqueTypesJank::AllGood) => {
377 OpaqueTypesJank::AllGood
378 }
379 }
380 }
381}
382
383#[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)]
384#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for StalledOnCoroutines {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
StalledOnCoroutines::Yes => {}
StalledOnCoroutines::No => {}
}
}
}
};HashStable_NoContext))]
385pub enum StalledOnCoroutines {
386 Yes,
387 No,
388}
389
390impl StalledOnCoroutines {
391 fn and(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
392 match (self, other) {
393 (StalledOnCoroutines::No, StalledOnCoroutines::No) => StalledOnCoroutines::No,
394 (StalledOnCoroutines::Yes, _) | (_, StalledOnCoroutines::Yes) => {
395 StalledOnCoroutines::Yes
396 }
397 }
398 }
399
400 pub fn or(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
401 StalledOnCoroutines::and(self, other)
405 }
406}
407
408impl Certainty {
409 pub const AMBIGUOUS: Certainty = Certainty::Maybe(MaybeInfo::AMBIGUOUS);
410
411 pub fn and(self, other: Certainty) -> Certainty {
424 match (self, other) {
425 (Certainty::Yes, Certainty::Yes) => Certainty::Yes,
426 (Certainty::Yes, Certainty::Maybe { .. }) => other,
427 (Certainty::Maybe { .. }, Certainty::Yes) => self,
428 (Certainty::Maybe(a_maybe), Certainty::Maybe(b_maybe)) => {
429 Certainty::Maybe(a_maybe.and(b_maybe))
430 }
431 }
432 }
433
434 pub const fn overflow(suggest_increasing_limit: bool) -> Certainty {
435 Certainty::Maybe(MaybeInfo {
436 cause: MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: false },
437 opaque_types_jank: OpaqueTypesJank::AllGood,
438 stalled_on_coroutines: StalledOnCoroutines::No,
439 })
440 }
441}
442
443#[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)]
445#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for MaybeCause {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
MaybeCause::Ambiguity => {}
MaybeCause::Overflow {
suggest_increasing_limit: ref __binding_0,
keep_constraints: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_NoContext))]
446pub enum MaybeCause {
447 Ambiguity,
451 Overflow { suggest_increasing_limit: bool, keep_constraints: bool },
453}
454
455impl MaybeCause {
456 fn and(self, other: MaybeCause) -> MaybeCause {
457 match (self, other) {
458 (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
459 (MaybeCause::Ambiguity, MaybeCause::Overflow { .. }) => other,
460 (MaybeCause::Overflow { .. }, MaybeCause::Ambiguity) => self,
461 (
462 MaybeCause::Overflow {
463 suggest_increasing_limit: limit_a,
464 keep_constraints: keep_a,
465 },
466 MaybeCause::Overflow {
467 suggest_increasing_limit: limit_b,
468 keep_constraints: keep_b,
469 },
470 ) => MaybeCause::Overflow {
471 suggest_increasing_limit: limit_a && limit_b,
472 keep_constraints: keep_a && keep_b,
473 },
474 }
475 }
476
477 pub fn or(self, other: MaybeCause) -> MaybeCause {
478 match (self, other) {
479 (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
480
481 (
483 MaybeCause::Ambiguity,
484 MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
485 ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
486 (
487 MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
488 MaybeCause::Ambiguity,
489 ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
490
491 (
492 MaybeCause::Overflow {
493 suggest_increasing_limit: limit_a,
494 keep_constraints: keep_a,
495 },
496 MaybeCause::Overflow {
497 suggest_increasing_limit: limit_b,
498 keep_constraints: keep_b,
499 },
500 ) => MaybeCause::Overflow {
501 suggest_increasing_limit: limit_a || limit_b,
502 keep_constraints: keep_a || keep_b,
503 },
504 }
505 }
506}
507
508#[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)]
510pub enum AdtDestructorKind {
511 NotConst,
512 Const,
513}
514
515#[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)]
518#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for SizedTraitKind {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
SizedTraitKind::Sized => {}
SizedTraitKind::MetaSized => {}
}
}
}
};HashStable_NoContext))]
519pub enum SizedTraitKind {
520 Sized,
522 MetaSized,
524}
525
526impl SizedTraitKind {
527 pub fn require_lang_item<I: Interner>(self, cx: I) -> I::TraitId {
529 cx.require_trait_lang_item(match self {
530 SizedTraitKind::Sized => SolverTraitLangItem::Sized,
531 SizedTraitKind::MetaSized => SolverTraitLangItem::MetaSized,
532 })
533 }
534}