1pub mod inspect;
2
3use std::convert::Infallible;
4use std::fmt::Debug;
5use std::hash::Hash;
6
7use derive_where::derive_where;
8#[cfg(feature = "nightly")]
9use rustc_macros::{Decodable_NoContext, Encodable_NoContext, StableHash, StableHash_NoContext};
10use rustc_type_ir_macros::{
11 GenericTypeVisitable, Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic,
12};
13use thin_vec::ThinVec;
14use tracing::debug;
15
16use crate::inherent::*;
17use crate::lang_items::SolverTraitLangItem;
18use crate::region_constraint::RegionConstraint;
19use crate::{
20 self as ty, Canonical, CantBeErased, Const, ConstVid, FloatVid, GenericArgKind, InferConst,
21 IntVid, Interner, TermKind, TyVid, TypingMode, Upcast,
22};
23
24pub type CanonicalInputData<I> =
25 ty::CanonicalQueryInput<I, QueryInput<I, <I as Interner>::Predicate>>;
26pub type CanonicalResponse<I> = Canonical<I, Response<I>>;
27pub type QueryResult<I> = Result<CanonicalResponse<I>, NoSolution>;
34pub type QueryResultOrRerunNonErased<I> = Result<CanonicalResponse<I>, NoSolutionOrRerunNonErased>;
35
36#[derive(#[automatically_derived]impl ::core::marker::Copy for NoSolution { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for NoSolution {
}
#[automatically_derived]impl ::core::clone::Clone for NoSolution {
#[inline]
fn clone(&self) -> Self { *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::marker::StructuralPartialEq for
NoSolution {
}
#[automatically_derived]impl ::core::cmp::PartialEq for NoSolution {
#[inline]
fn eq(&self, other: &Self) -> bool { true }
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for NoSolution { }Eq)]
37#[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))]
38pub struct NoSolution;
39
40pub trait RerunResultExt<T> {
41 fn map_err_to_rerun(self) -> Result<Result<T, NoSolution>, RerunNonErased>;
42}
43
44impl<T> RerunResultExt<T> for Result<T, NoSolutionOrRerunNonErased> {
45 fn map_err_to_rerun(self) -> Result<Result<T, NoSolution>, RerunNonErased> {
46 match self {
47 Ok(i) => Ok(Ok(i)),
48 Err(NoSolutionOrRerunNonErased::NoSolution(NoSolution)) => Ok(Err(NoSolution)),
49 Err(NoSolutionOrRerunNonErased::RerunNonErased(e)) => Err(e),
50 }
51 }
52}
53
54#[derive(#[automatically_derived]impl ::core::marker::Copy for RerunNonErased { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for RerunNonErased {
}
#[automatically_derived]impl ::core::clone::Clone for RerunNonErased {
#[inline]
fn clone(&self) -> Self {
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_struct_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::marker::StructuralPartialEq for
RerunNonErased {
}
#[automatically_derived]impl ::core::cmp::PartialEq for RerunNonErased {
#[inline]
fn eq(&self, other: &Self) -> 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)]
61#[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))]
62pub struct RerunNonErased(());
63
64#[derive(#[automatically_derived]impl ::core::marker::Copy for
NoSolutionOrRerunNonErased {
}Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for NoSolutionOrRerunNonErased {
}
#[automatically_derived]impl ::core::clone::Clone for
NoSolutionOrRerunNonErased {
#[inline]
fn clone(&self) -> Self {
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 {
Self::NoSolution(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"NoSolution", &__self_0),
Self::RerunNonErased(__self_0) =>
::core::fmt::Formatter::debug_struct_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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::NoSolution(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::RerunNonErased(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
NoSolutionOrRerunNonErased {
}
#[automatically_derived]impl ::core::cmp::PartialEq for
NoSolutionOrRerunNonErased {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::NoSolution(__self_0), Self::NoSolution(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::RerunNonErased(__self_0),
Self::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)]
65#[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) {
match *self {
NoSolutionOrRerunNonErased::NoSolution(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
NoSolutionOrRerunNonErased::RerunNonErased(ref __binding_0)
=> 1u8.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))]
66pub enum NoSolutionOrRerunNonErased {
67 NoSolution(NoSolution),
68 RerunNonErased(RerunNonErased),
69}
70
71impl From<NoSolution> for NoSolutionOrRerunNonErased {
72 fn from(value: NoSolution) -> Self {
73 Self::NoSolution(value)
74 }
75}
76
77impl From<RerunNonErased> for NoSolutionOrRerunNonErased {
78 fn from(value: RerunNonErased) -> Self {
79 Self::RerunNonErased(value)
80 }
81}
82
83#[derive(#[automatically_derived]impl<T: ::core::marker::Copy + Copy + Debug + Hash +
Eq> ::core::marker::Copy for SmallCopySet<T> {
}Copy, #[automatically_derived]impl<T: ::core::clone::Clone + Copy + Debug + Hash +
Eq> ::core::clone::Clone for SmallCopySet<T> {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Empty => SmallCopySet::Empty,
Self::One(__self_0) =>
SmallCopySet::One(::core::clone::Clone::clone(__self_0)),
Self::Two(__self_0) =>
SmallCopySet::Two(::core::clone::Clone::clone(__self_0)),
Self::Three(__self_0) =>
SmallCopySet::Three(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]impl<T: ::core::fmt::Debug + Copy + Debug + Hash + Eq>
::core::fmt::Debug for SmallCopySet<T> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Empty => ::core::fmt::Formatter::write_str(f, "Empty"),
Self::One(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "One",
&__self_0),
Self::Two(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Two",
&__self_0),
Self::Three(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Three",
&__self_0),
}
}
}Debug, #[automatically_derived]impl<T: ::core::hash::Hash + Copy + Debug + Hash + Eq>
::core::hash::Hash for SmallCopySet<T> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::One(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Self::Two(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Self::Three(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]impl<T: ::core::cmp::PartialEq + Copy + Debug + Hash +
Eq> ::core::marker::StructuralPartialEq for SmallCopySet<T> {
}
#[automatically_derived]impl<T: ::core::cmp::PartialEq + Copy + Debug + Hash +
Eq> ::core::cmp::PartialEq for SmallCopySet<T> {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::One(__self_0), Self::One(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Two(__self_0), Self::Two(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Three(__self_0), Self::Three(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]impl<T: ::core::cmp::Eq + Copy + Debug + Hash + Eq>
::core::cmp::Eq for SmallCopySet<T> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<[T; 1]>;
let _: ::core::cmp::AssertParamIsEq<[T; 2]>;
let _: ::core::cmp::AssertParamIsEq<[T; 3]>;
}
}Eq)]
88#[derive(const _: () =
{
impl<T: Copy + Debug + Hash + Eq, I> ::rustc_type_ir::TypeVisitable<I>
for SmallCopySet<T> where I: Interner,
[T; 1]: ::rustc_type_ir::TypeVisitable<I>,
[T; 2]: ::rustc_type_ir::TypeVisitable<I>,
[T; 3]: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
SmallCopySet::Empty => {}
SmallCopySet::One(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
SmallCopySet::Two(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
SmallCopySet::Three(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<T: Copy + Debug + Hash + Eq, I> ::rustc_type_ir::TypeFoldable<I>
for SmallCopySet<T> where I: Interner,
T: ::rustc_type_ir::TypeFoldable<I>,
[T; 1]: ::rustc_type_ir::TypeFoldable<I>,
[T; 2]: ::rustc_type_ir::TypeFoldable<I>,
[T; 3]: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
SmallCopySet::Empty => { SmallCopySet::Empty }
SmallCopySet::One(__binding_0) => {
SmallCopySet::One(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
SmallCopySet::Two(__binding_0) => {
SmallCopySet::Two(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
SmallCopySet::Three(__binding_0) => {
SmallCopySet::Three(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
SmallCopySet::Empty => { SmallCopySet::Empty }
SmallCopySet::One(__binding_0) => {
SmallCopySet::One(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
SmallCopySet::Two(__binding_0) => {
SmallCopySet::Two(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
SmallCopySet::Three(__binding_0) => {
SmallCopySet::Three(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
unsafe impl<T: Copy + Debug + Hash + Eq, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for SmallCopySet<T>
where [T; 1]: ::rustc_type_ir::GenericTypeVisitable<__V>,
[T; 2]: ::rustc_type_ir::GenericTypeVisitable<__V>,
[T; 3]: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
SmallCopySet::Empty => {}
SmallCopySet::One(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
SmallCopySet::Two(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
SmallCopySet::Three(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
}
}
}
};GenericTypeVisitable)]
89#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<T: Copy + Debug + Hash + Eq>
::rustc_data_structures::stable_hash::StableHash for
SmallCopySet<T> where
[T; 1]: ::rustc_data_structures::stable_hash::StableHash,
[T; 2]: ::rustc_data_structures::stable_hash::StableHash,
[T; 3]: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
SmallCopySet::Empty => 0u8.stable_hash(__hcx, __hasher),
SmallCopySet::One(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
SmallCopySet::Two(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
SmallCopySet::Three(ref __binding_0) =>
3u8.stable_hash(__hcx, __hasher),
}
match *self {
SmallCopySet::Empty => {}
SmallCopySet::One(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
SmallCopySet::Two(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
SmallCopySet::Three(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
90pub enum SmallCopySet<T: Copy + Debug + Hash + Eq> {
91 Empty,
92 One([T; 1]),
93 Two([T; 2]),
94 Three([T; 3]),
95}
96
97impl<T: Copy + Debug + Hash + Eq> SmallCopySet<T> {
98 fn empty() -> Self {
99 Self::Empty
100 }
101
102 fn new(first: T) -> Self {
103 Self::One([first])
104 }
105
106 fn union(self, other: Self) -> Option<Self> {
123 match (self, other) {
124 (Self::Empty, other) | (other, Self::Empty) => Some(other),
125
126 (Self::One([a]), Self::One([b])) if a == b => Some(Self::One([a])),
127 (Self::One([a]), Self::One([b])) => Some(Self::Two([a, b])),
128 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c]))
129 if a == b && b == c =>
130 {
131 Some(Self::One([a]))
132 }
133 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if a == b => {
134 Some(Self::Two([a, c]))
135 }
136 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if a == c => {
137 Some(Self::Two([a, b]))
138 }
139 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) if b == c => {
140 Some(Self::Two([a, b]))
141 }
142 (Self::One([a]), Self::Two([b, c])) | (Self::Two([a, b]), Self::One([c])) => {
143 Some(Self::Three([a, b, c]))
144 }
145 _ => None,
149 }
150 }
151}
152
153impl<T: Copy + Debug + Hash + Eq> AsRef<[T]> for SmallCopySet<T> {
154 fn as_ref(&self) -> &[T] {
155 match self {
156 Self::Empty => &[],
157 Self::One(l) => l,
158 Self::Two(l) => l,
159 Self::Three(l) => l,
160 }
161 }
162}
163
164#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for RerunCondition<I> where I: Interner
{
}
#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for RerunCondition<I> where I: Interner
{
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for RerunCondition<I> where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
RerunCondition::Never =>
::core::fmt::Formatter::write_str(__f, "Never"),
RerunCondition::AnyOpaqueHasInferAsHidden =>
::core::fmt::Formatter::write_str(__f,
"AnyOpaqueHasInferAsHidden"),
RerunCondition::OpaqueInStorage(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f, "OpaqueInStorage");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __field_0)
=> {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f,
"OpaqueInStorageOrAnyOpaqueHasInferAsHidden");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
RerunCondition::Always =>
::core::fmt::Formatter::write_str(__f, "Always"),
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for RerunCondition<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
RerunCondition::Never => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
RerunCondition::AnyOpaqueHasInferAsHidden => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
RerunCondition::OpaqueInStorage(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __field_0)
=> {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
RerunCondition::Always => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for RerunCondition<I> where
I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
if ::core::mem::discriminant(self) ==
::core::mem::discriminant(__other) {
match (self, __other) {
(RerunCondition::OpaqueInStorage(ref __field_0),
RerunCondition::OpaqueInStorage(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __field_0),
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __other_field_0))
=>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
_ => true,
}
} else { false }
}
}
const _: () =
{
trait DeriveWhereAssertEq {
fn assert(&self);
}
impl<I: Interner> DeriveWhereAssertEq for RerunCondition<I> where
I: Interner {
fn assert(&self) {
struct __AssertEq<__T: ::core::cmp::Eq +
?::core::marker::Sized>(::core::marker::PhantomData<__T>);
let _: __AssertEq<SmallCopySet<I::LocalDefId>>;
let _: __AssertEq<SmallCopySet<I::LocalDefId>>;
}
}
};
#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for RerunCondition<I> where I: Interner { }#[derive_where(Copy, Clone, Debug, Hash, PartialEq, Eq; I: Interner)]
183#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for
RerunCondition<I> where I: Interner,
SmallCopySet<I::LocalDefId>: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
RerunCondition::Never => {}
RerunCondition::AnyOpaqueHasInferAsHidden => {}
RerunCondition::OpaqueInStorage(ref __binding_0) => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __binding_0)
=> {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
RerunCondition::Always => {}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for
RerunCondition<I> where I: Interner,
SmallCopySet<I::LocalDefId>: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
RerunCondition::Never => { RerunCondition::Never }
RerunCondition::AnyOpaqueHasInferAsHidden => {
RerunCondition::AnyOpaqueHasInferAsHidden
}
RerunCondition::OpaqueInStorage(__binding_0) => {
RerunCondition::OpaqueInStorage(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(__binding_0)
=> {
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
RerunCondition::Always => { RerunCondition::Always }
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
RerunCondition::Never => { RerunCondition::Never }
RerunCondition::AnyOpaqueHasInferAsHidden => {
RerunCondition::AnyOpaqueHasInferAsHidden
}
RerunCondition::OpaqueInStorage(__binding_0) => {
RerunCondition::OpaqueInStorage(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(__binding_0)
=> {
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
RerunCondition::Always => { RerunCondition::Always }
}
}
}
};TypeFoldable_Generic, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for RerunCondition<I>
where
SmallCopySet<I::LocalDefId>: ::rustc_type_ir::GenericTypeVisitable<__V>,
SmallCopySet<I::LocalDefId>: ::rustc_type_ir::GenericTypeVisitable<__V>
{
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
RerunCondition::Never => {}
RerunCondition::AnyOpaqueHasInferAsHidden => {}
RerunCondition::OpaqueInStorage(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __binding_0)
=> {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
RerunCondition::Always => {}
}
}
}
};GenericTypeVisitable)]
184#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
RerunCondition<I> where
SmallCopySet<I::LocalDefId>: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
RerunCondition::Never => 0u8.stable_hash(__hcx, __hasher),
RerunCondition::AnyOpaqueHasInferAsHidden =>
1u8.stable_hash(__hcx, __hasher),
RerunCondition::OpaqueInStorage(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
RerunCondition::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(ref __binding_0)
=> 3u8.stable_hash(__hcx, __hasher),
RerunCondition::Always => 4u8.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))]
185pub enum RerunCondition<I: Interner> {
186 Never,
187
188 AnyOpaqueHasInferAsHidden,
190 OpaqueInStorage(SmallCopySet<I::LocalDefId>),
192
193 OpaqueInStorageOrAnyOpaqueHasInferAsHidden(SmallCopySet<I::LocalDefId>),
197
198 Always,
199}
200
201impl<I: Interner> RerunCondition<I> {
202 fn merge(self, other: Self) -> Self {
219 let merged = match (self, other) {
220 (Self::Never, other) | (other, Self::Never) => other,
221 (Self::Always, _) | (_, Self::Always) => Self::Always,
222
223 (Self::OpaqueInStorage(a), Self::OpaqueInStorage(b)) => {
224 a.union(b).map(Self::OpaqueInStorage).unwrap_or(Self::Always)
225 }
226 (Self::AnyOpaqueHasInferAsHidden, Self::AnyOpaqueHasInferAsHidden) => {
227 Self::AnyOpaqueHasInferAsHidden
228 }
229 (
230 Self::AnyOpaqueHasInferAsHidden,
231 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
232 )
233 | (
234 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
235 Self::AnyOpaqueHasInferAsHidden,
236 ) => Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
237
238 (
239 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a),
240 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b),
241 ) => a
242 .union(b)
243 .map(Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden)
244 .unwrap_or(Self::Always),
245
246 (Self::OpaqueInStorage(a), Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b))
247 | (Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(b), Self::OpaqueInStorage(a)) => a
248 .union(b)
249 .map(Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden)
250 .unwrap_or(Self::Always),
251
252 (Self::OpaqueInStorage(a), Self::AnyOpaqueHasInferAsHidden)
253 | (Self::AnyOpaqueHasInferAsHidden, Self::OpaqueInStorage(a)) => {
254 Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(a)
255 }
256 };
257 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs:257",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(257u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("merging rerun state {0:?} + {1:?} => {2:?}",
self, other, merged) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("merging rerun state {self:?} + {other:?} => {merged:?}");
258 merged
259 }
260
261 #[must_use]
262 fn should_bail(&self) -> Result<(), RerunNonErased> {
263 match self {
264 Self::Always => Err(RerunNonErased(())),
265 Self::Never
266 | Self::OpaqueInStorage(_)
267 | Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(_)
268 | Self::AnyOpaqueHasInferAsHidden => Ok(()),
269 }
270 }
271
272 #[must_use]
275 fn might_rerun(&self) -> bool {
276 match self {
277 Self::Never => false,
278 Self::Always
279 | Self::OpaqueInStorageOrAnyOpaqueHasInferAsHidden(_)
280 | Self::OpaqueInStorage(_)
281 | Self::AnyOpaqueHasInferAsHidden => true,
282 }
283 }
284}
285
286#[derive(#[automatically_derived]impl ::core::marker::Copy for RerunReason { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for RerunReason {
}
#[automatically_derived]impl ::core::clone::Clone for RerunReason {
#[inline]
fn clone(&self) -> Self { *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::debug_c_like_enum_write_str(f,
"NormalizeOpaqueTypeRemoteCrate NormalizeOpaqueType MayUseUnstableFeature EvaluateConst SkipErasedAttempt SelfTyInfer FetchEligibleAssocItem AutoTraitLeakage TryStallCoroutine",
match self {
RerunReason::NormalizeOpaqueTypeRemoteCrate => 0usize,
RerunReason::NormalizeOpaqueType => 31usize,
RerunReason::MayUseUnstableFeature => 51usize,
RerunReason::EvaluateConst => 73usize,
RerunReason::SkipErasedAttempt => 87usize,
RerunReason::SelfTyInfer => 105usize,
RerunReason::FetchEligibleAssocItem => 117usize,
RerunReason::AutoTraitLeakage => 140usize,
RerunReason::TryStallCoroutine => 157usize,
})
}
}Debug, #[automatically_derived]impl ::core::hash::Hash for RerunReason {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
RerunReason {
}
#[automatically_derived]impl ::core::cmp::PartialEq for RerunReason {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for RerunReason { }Eq)]
289#[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, const _: () =
{
unsafe impl<__V> ::rustc_type_ir::GenericTypeVisitable<__V> for
RerunReason {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
RerunReason::NormalizeOpaqueTypeRemoteCrate => {}
RerunReason::NormalizeOpaqueType => {}
RerunReason::MayUseUnstableFeature => {}
RerunReason::EvaluateConst => {}
RerunReason::SkipErasedAttempt => {}
RerunReason::SelfTyInfer => {}
RerunReason::FetchEligibleAssocItem => {}
RerunReason::AutoTraitLeakage => {}
RerunReason::TryStallCoroutine => {}
}
}
}
};GenericTypeVisitable)]
290#[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) {
match *self {
RerunReason::NormalizeOpaqueTypeRemoteCrate =>
0u8.stable_hash(__hcx, __hasher),
RerunReason::NormalizeOpaqueType =>
1u8.stable_hash(__hcx, __hasher),
RerunReason::MayUseUnstableFeature =>
2u8.stable_hash(__hcx, __hasher),
RerunReason::EvaluateConst =>
3u8.stable_hash(__hcx, __hasher),
RerunReason::SkipErasedAttempt =>
4u8.stable_hash(__hcx, __hasher),
RerunReason::SelfTyInfer =>
5u8.stable_hash(__hcx, __hasher),
RerunReason::FetchEligibleAssocItem =>
6u8.stable_hash(__hcx, __hasher),
RerunReason::AutoTraitLeakage =>
7u8.stable_hash(__hcx, __hasher),
RerunReason::TryStallCoroutine =>
8u8.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))]
291pub enum RerunReason {
292 NormalizeOpaqueTypeRemoteCrate,
293 NormalizeOpaqueType,
294 MayUseUnstableFeature,
295 EvaluateConst,
296 SkipErasedAttempt,
297 SelfTyInfer,
298 FetchEligibleAssocItem,
299 AutoTraitLeakage,
300 TryStallCoroutine,
301}
302
303#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for AccessedOpaques<I> where
I: Interner {
}
#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for AccessedOpaques<I> where
I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for AccessedOpaques<I> where I: Interner
{
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
AccessedOpaques {
reason: ref __field_reason, rerun: ref __field_rerun } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f,
"AccessedOpaques");
::core::fmt::DebugStruct::field(&mut __builder, "reason",
__field_reason);
::core::fmt::DebugStruct::field(&mut __builder, "rerun",
__field_rerun);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for AccessedOpaques<I> where I: Interner
{
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
AccessedOpaques {
reason: ref __field_reason, rerun: ref __field_rerun } => {
::core::hash::Hash::hash(__field_reason, __state);
::core::hash::Hash::hash(__field_rerun, __state);
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for AccessedOpaques<I> where
I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(AccessedOpaques {
reason: ref __field_reason, rerun: ref __field_rerun },
AccessedOpaques {
reason: ref __other_field_reason,
rerun: ref __other_field_rerun }) =>
true &&
::core::cmp::PartialEq::eq(__field_reason,
__other_field_reason) &&
::core::cmp::PartialEq::eq(__field_rerun,
__other_field_rerun),
}
}
}
const _: () =
{
trait DeriveWhereAssertEq {
fn assert(&self);
}
impl<I: Interner> DeriveWhereAssertEq for AccessedOpaques<I> where
I: Interner {
fn assert(&self) {
struct __AssertEq<__T: ::core::cmp::Eq +
?::core::marker::Sized>(::core::marker::PhantomData<__T>);
let _: __AssertEq<Option<RerunReason>>;
let _: __AssertEq<RerunCondition<I>>;
}
}
};
#[automatically_derived]
impl<I: Interner> ::core::cmp::Eq for AccessedOpaques<I> where I: Interner { }#[derive_where(Copy, Clone, Debug, Hash, PartialEq, Eq; I: Interner)]
304#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for AccessedOpaques<I>
where
Option<RerunReason>: ::rustc_type_ir::GenericTypeVisitable<__V>,
RerunCondition<I>: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
AccessedOpaques {
reason: ref __binding_0, rerun: ref __binding_1 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
}
}
}
};GenericTypeVisitable)]
305#[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))]
306pub struct AccessedOpaques<I: Interner> {
307 #[cfg_attr(feature = "nightly", type_visitable(ignore))]
308 #[type_foldable(identity)]
309 pub reason: Option<RerunReason>,
310 pub rerun: RerunCondition<I>,
311}
312
313impl<I: Interner> Default for AccessedOpaques<I> {
314 fn default() -> Self {
315 Self { reason: None, rerun: RerunCondition::Never }
316 }
317}
318
319impl<I: Interner> AccessedOpaques<I> {
320 pub fn update(&mut self, other: Self) -> Result<(), RerunNonErased> {
321 *self = Self {
322 reason: other.reason.or(self.reason),
324 rerun: self.rerun.merge(other.rerun),
326 };
327
328 self.should_bail()
329 }
330
331 #[must_use]
332 pub fn might_rerun(&self) -> bool {
333 self.rerun.might_rerun()
334 }
335
336 #[must_use]
337 pub fn should_bail(&self) -> Result<(), RerunNonErased> {
338 self.rerun.should_bail()
339 }
340
341 pub fn rerun_always(&mut self, reason: RerunReason) -> Result<Infallible, RerunNonErased> {
342 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs:342",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(342u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("set rerun always")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("set rerun always");
343 match self.update(AccessedOpaques { reason: Some(reason), rerun: RerunCondition::Always }) {
344 Ok(_) => ::core::panicking::unreachable_default_msg()unreachable!(),
345 Err(e) => Err(e),
346 }
347 }
348
349 pub fn rerun_if_in_post_analysis(&mut self, reason: RerunReason) -> Result<(), RerunNonErased> {
350 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs:350",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(350u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("set rerun if post analysis")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("set rerun if post analysis");
351 self.update(AccessedOpaques {
352 reason: Some(reason),
353 rerun: RerunCondition::OpaqueInStorage(SmallCopySet::empty()),
354 })
355 }
356
357 pub fn rerun_if_opaque_in_opaque_type_storage(
358 &mut self,
359 reason: RerunReason,
360 defid: I::LocalOpaqueTyId,
361 ) -> Result<(), RerunNonErased> {
362 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs:362",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(362u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("set rerun if opaque type {0:?} in storage",
defid) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("set rerun if opaque type {defid:?} in storage");
363 self.update(AccessedOpaques {
364 reason: Some(reason),
365 rerun: RerunCondition::OpaqueInStorage(SmallCopySet::new(defid.into())),
366 })
367 }
368
369 pub fn rerun_if_any_opaque_has_infer_as_hidden_type(
370 &mut self,
371 reason: RerunReason,
372 ) -> Result<(), RerunNonErased> {
373 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs:373",
"rustc_type_ir::solve", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/249c1e4e31111b54ad2483cfd4cea06c7020c653/compiler/rustc_type_ir/src/solve/mod.rs"),
::tracing_core::__macro_support::Option::Some(373u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::solve"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("set rerun if any opaque in the storage has a hidden type that is an infer var")
as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("set rerun if any opaque in the storage has a hidden type that is an infer var");
374 self.update(AccessedOpaques {
375 reason: Some(reason),
376 rerun: RerunCondition::AnyOpaqueHasInferAsHidden,
377 })
378 }
379}
380
381#[automatically_derived]
impl<I: Interner, P> ::core::clone::Clone for Goal<I, P> where I: Interner,
P: ::core::clone::Clone {
#[inline]
fn clone(&self) -> Self {
match self {
Goal {
param_env: ref __field_param_env,
predicate: ref __field_predicate } =>
Goal {
param_env: ::core::clone::Clone::clone(__field_param_env),
predicate: ::core::clone::Clone::clone(__field_predicate),
},
}
}
}
#[automatically_derived]
impl<I: Interner, P> ::core::hash::Hash for Goal<I, P> where I: Interner,
P: ::core::hash::Hash {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
Goal {
param_env: ref __field_param_env,
predicate: ref __field_predicate } => {
::core::hash::Hash::hash(__field_param_env, __state);
::core::hash::Hash::hash(__field_predicate, __state);
}
}
}
}
#[automatically_derived]
impl<I: Interner, P> ::core::cmp::PartialEq for Goal<I, P> where I: Interner,
P: ::core::cmp::PartialEq {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(Goal {
param_env: ref __field_param_env,
predicate: ref __field_predicate }, Goal {
param_env: ref __other_field_param_env,
predicate: ref __other_field_predicate }) =>
true &&
::core::cmp::PartialEq::eq(__field_param_env,
__other_field_param_env) &&
::core::cmp::PartialEq::eq(__field_predicate,
__other_field_predicate),
}
}
}
#[automatically_derived]
impl<I: Interner, P> ::core::fmt::Debug for Goal<I, P> where I: Interner,
P: ::core::fmt::Debug {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
Goal {
param_env: ref __field_param_env,
predicate: ref __field_predicate } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Goal");
::core::fmt::DebugStruct::field(&mut __builder, "param_env",
__field_param_env);
::core::fmt::DebugStruct::field(&mut __builder, "predicate",
__field_predicate);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}
#[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)]
387#[derive_where(Copy; I: Interner, P: Copy)]
388#[derive(const _: () =
{
impl<I: Interner, P> ::rustc_type_ir::TypeVisitable<I> for Goal<I, P>
where I: Interner, I::ParamEnv: ::rustc_type_ir::TypeVisitable<I>,
P: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
Goal {
param_env: ref __binding_0, predicate: ref __binding_1 } =>
{
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<I: Interner, P> ::rustc_type_ir::TypeFoldable<I> for Goal<I, P>
where I: Interner, P: ::rustc_type_ir::TypeFoldable<I>,
I::ParamEnv: ::rustc_type_ir::TypeFoldable<I>,
P: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
Goal { param_env: __binding_0, predicate: __binding_1 } => {
Goal {
param_env: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
predicate: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
Goal { param_env: __binding_0, predicate: __binding_1 } => {
Goal {
param_env: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
predicate: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
impl<I: Interner, P, J> ::rustc_type_ir::lift::Lift<J> for Goal<I, P>
where J: Interner, I: ::rustc_type_ir::LiftInto<J>,
P: ::rustc_type_ir::lift::Lift<J> {
type Lifted =
Goal<J, <P as ::rustc_type_ir::lift::Lift<J>>::Lifted>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
Goal { param_env: __binding_0, predicate: __binding_1 } => {
Goal {
param_env: __binding_0.lift_to_interner(interner),
predicate: __binding_1.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic, const _: () =
{
unsafe impl<I: Interner, P, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for Goal<I, P> where
I::ParamEnv: ::rustc_type_ir::GenericTypeVisitable<__V>,
P: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
Goal {
param_env: ref __binding_0, predicate: ref __binding_1 } =>
{
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
}
}
}
};GenericTypeVisitable)]
389#[cfg_attr(
390 feature = "nightly",
391 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) {
let Goal {
param_env: ref __binding_0, predicate: ref __binding_1 } =
*self;
::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)
392)]
393pub struct Goal<I: Interner, P> {
394 pub param_env: I::ParamEnv,
395 pub predicate: P,
396}
397
398impl<I: Interner, P: Eq> Eq for Goal<I, P> {}
399
400impl<I: Interner, P> Goal<I, P> {
401 pub fn new(cx: I, param_env: I::ParamEnv, predicate: impl Upcast<I, P>) -> Goal<I, P> {
402 Goal { param_env, predicate: predicate.upcast(cx) }
403 }
404
405 pub fn with<Q>(self, cx: I, predicate: impl Upcast<I, Q>) -> Goal<I, Q> {
407 Goal { param_env: self.param_env, predicate: predicate.upcast(cx) }
408 }
409}
410
411#[derive(#[automatically_derived]impl ::core::marker::Copy for GoalSource { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for GoalSource {
}
#[automatically_derived]impl ::core::clone::Clone for GoalSource {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::fmt::Debug for GoalSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_c_like_enum_write_str(f,
"Misc ImplWhereBound AliasBoundConstCondition AliasWellFormed Normalization",
match self {
GoalSource::Misc => 0usize,
GoalSource::ImplWhereBound => 5usize,
GoalSource::AliasBoundConstCondition => 20usize,
GoalSource::AliasWellFormed => 45usize,
GoalSource::Normalization => 61usize,
})
}
}Debug, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
GoalSource {
}
#[automatically_derived]impl ::core::cmp::PartialEq for GoalSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for GoalSource { }Eq, #[automatically_derived]impl ::core::hash::Hash for GoalSource {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash)]
419#[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) {
match *self {
GoalSource::Misc => 0u8.stable_hash(__hcx, __hasher),
GoalSource::ImplWhereBound =>
1u8.stable_hash(__hcx, __hasher),
GoalSource::AliasBoundConstCondition =>
2u8.stable_hash(__hcx, __hasher),
GoalSource::AliasWellFormed =>
3u8.stable_hash(__hcx, __hasher),
GoalSource::Normalization =>
4u8.stable_hash(__hcx, __hasher),
}
match *self {
GoalSource::Misc => {}
GoalSource::ImplWhereBound => {}
GoalSource::AliasBoundConstCondition => {}
GoalSource::AliasWellFormed => {}
GoalSource::Normalization => {}
}
}
}
};StableHash))]
420pub enum GoalSource {
421 Misc,
422 ImplWhereBound,
424 AliasBoundConstCondition,
426 AliasWellFormed,
433 Normalization,
435}
436
437#[automatically_derived]
impl<I: Interner, P> ::core::clone::Clone for QueryInput<I, P> where
I: Interner, Goal<I, P>: ::core::clone::Clone {
#[inline]
fn clone(&self) -> Self {
match self {
QueryInput {
goal: ref __field_goal,
predefined_opaques_in_body: ref __field_predefined_opaques_in_body
} =>
QueryInput {
goal: ::core::clone::Clone::clone(__field_goal),
predefined_opaques_in_body: ::core::clone::Clone::clone(__field_predefined_opaques_in_body),
},
}
}
}
#[automatically_derived]
impl<I: Interner, P> ::core::hash::Hash for QueryInput<I, P> where
I: Interner, Goal<I, P>: ::core::hash::Hash {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
QueryInput {
goal: ref __field_goal,
predefined_opaques_in_body: ref __field_predefined_opaques_in_body
} => {
::core::hash::Hash::hash(__field_goal, __state);
::core::hash::Hash::hash(__field_predefined_opaques_in_body,
__state);
}
}
}
}
#[automatically_derived]
impl<I: Interner, P> ::core::cmp::PartialEq for QueryInput<I, P> where
I: Interner, Goal<I, P>: ::core::cmp::PartialEq {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(QueryInput {
goal: ref __field_goal,
predefined_opaques_in_body: ref __field_predefined_opaques_in_body
}, QueryInput {
goal: ref __other_field_goal,
predefined_opaques_in_body: ref __other_field_predefined_opaques_in_body
}) =>
true &&
::core::cmp::PartialEq::eq(__field_goal, __other_field_goal)
&&
::core::cmp::PartialEq::eq(__field_predefined_opaques_in_body,
__other_field_predefined_opaques_in_body),
}
}
}
#[automatically_derived]
impl<I: Interner, P> ::core::fmt::Debug for QueryInput<I, P> where
I: Interner, Goal<I, P>: ::core::fmt::Debug {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
QueryInput {
goal: ref __field_goal,
predefined_opaques_in_body: ref __field_predefined_opaques_in_body
} => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "QueryInput");
::core::fmt::DebugStruct::field(&mut __builder, "goal",
__field_goal);
::core::fmt::DebugStruct::field(&mut __builder,
"predefined_opaques_in_body",
__field_predefined_opaques_in_body);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}
#[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>)]
438#[derive_where(Copy; I: Interner, Goal<I, P>: Copy)]
439#[derive(const _: () =
{
impl<I: Interner, P> ::rustc_type_ir::TypeVisitable<I> for
QueryInput<I, P> where I: Interner,
Goal<I, P>: ::rustc_type_ir::TypeVisitable<I>,
I::PredefinedOpaques: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
QueryInput {
goal: ref __binding_0,
predefined_opaques_in_body: ref __binding_1 } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
impl<I: Interner, P> ::rustc_type_ir::TypeFoldable<I> for
QueryInput<I, P> where I: Interner,
P: ::rustc_type_ir::TypeFoldable<I>,
Goal<I, P>: ::rustc_type_ir::TypeFoldable<I>,
I::PredefinedOpaques: ::rustc_type_ir::TypeFoldable<I> {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
QueryInput {
goal: __binding_0, predefined_opaques_in_body: __binding_1 }
=> {
QueryInput {
goal: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
predefined_opaques_in_body: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
QueryInput {
goal: __binding_0, predefined_opaques_in_body: __binding_1 }
=> {
QueryInput {
goal: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
predefined_opaques_in_body: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable_Generic, const _: () =
{
unsafe impl<I: Interner, P, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for QueryInput<I, P>
where Goal<I, P>: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::PredefinedOpaques: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
QueryInput {
goal: ref __binding_0,
predefined_opaques_in_body: ref __binding_1 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
}
}
}
}
};GenericTypeVisitable)]
440#[cfg_attr(
441 feature = "nightly",
442 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) {
let QueryInput {
goal: ref __binding_0,
predefined_opaques_in_body: ref __binding_1 } = *self;
::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)
443)]
444pub struct QueryInput<I: Interner, P> {
445 pub goal: Goal<I, P>,
446 pub predefined_opaques_in_body: I::PredefinedOpaques,
447}
448
449impl<I: Interner, P: Eq> Eq for QueryInput<I, P> {}
450
451#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for CandidatePreferenceMode {
}
#[automatically_derived]impl ::core::clone::Clone for CandidatePreferenceMode
{
#[inline]
fn clone(&self) -> Self { *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)]
454pub enum CandidatePreferenceMode {
455 Default,
457 Marker,
459}
460
461impl CandidatePreferenceMode {
462 pub fn compute<I: Interner>(cx: I, trait_id: I::TraitId) -> CandidatePreferenceMode {
464 let is_sizedness_or_auto_or_default_goal = cx.trait_is_auto(trait_id)
465 || cx.is_implicit_trait(trait_id, ty::IncludeSizedImplicitBounds::Yes);
466 if is_sizedness_or_auto_or_default_goal {
467 CandidatePreferenceMode::Marker
468 } else {
469 CandidatePreferenceMode::Default
470 }
471 }
472}
473
474#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for CandidateSource<I> where
I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for CandidateSource<I> where
I: Interner {
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for CandidateSource<I> where I: Interner
{
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
CandidateSource::Impl(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
CandidateSource::BuiltinImpl(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
CandidateSource::ParamEnv(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
CandidateSource::AliasBound(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
CandidateSource::CoherenceUnknowable => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for CandidateSource<I> where
I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
if ::core::mem::discriminant(self) ==
::core::mem::discriminant(__other) {
match (self, __other) {
(CandidateSource::Impl(ref __field_0),
CandidateSource::Impl(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(CandidateSource::BuiltinImpl(ref __field_0),
CandidateSource::BuiltinImpl(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(CandidateSource::ParamEnv(ref __field_0),
CandidateSource::ParamEnv(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(CandidateSource::AliasBound(ref __field_0),
CandidateSource::AliasBound(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
_ => true,
}
} else { false }
}
}
#[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)]
476pub enum CandidateSource<I: Interner> {
477 Impl(I::ImplId),
489 BuiltinImpl(BuiltinImplSource),
497 ParamEnv(ParamEnvSource),
510 AliasBound(AliasBoundKind),
531 CoherenceUnknowable,
536}
537
538impl<I: Interner> Eq for CandidateSource<I> {}
539
540#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for ParamEnvSource {
}
#[automatically_derived]impl ::core::clone::Clone for ParamEnvSource {
#[inline]
fn clone(&self) -> Self { *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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
ParamEnvSource {
}
#[automatically_derived]impl ::core::cmp::PartialEq for ParamEnvSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for ParamEnvSource { }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)]
541pub enum ParamEnvSource {
542 NonGlobal,
544 Global,
546}
547
548#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for AliasBoundKind {
}
#[automatically_derived]impl ::core::clone::Clone for AliasBoundKind {
#[inline]
fn clone(&self) -> Self { *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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
AliasBoundKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for AliasBoundKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for AliasBoundKind { }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)]
549#[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, const _: () =
{
unsafe impl<__V> ::rustc_type_ir::GenericTypeVisitable<__V> for
AliasBoundKind {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
AliasBoundKind::SelfBounds => {}
AliasBoundKind::NonSelfBounds => {}
}
}
}
};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)]
550pub enum AliasBoundKind {
551 SelfBounds,
553 NonSelfBounds,
555}
556
557#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for BuiltinImplSource {
}
#[automatically_derived]impl ::core::clone::Clone for BuiltinImplSource {
#[inline]
fn clone(&self) -> Self {
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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Object(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::TraitUpcasting(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
BuiltinImplSource {
}
#[automatically_derived]impl ::core::cmp::PartialEq for BuiltinImplSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Object(__self_0), Self::Object(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::TraitUpcasting(__self_0),
Self::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 {
Self::Trivial => ::core::fmt::Formatter::write_str(f, "Trivial"),
Self::Misc => ::core::fmt::Formatter::write_str(f, "Misc"),
Self::Object(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Object", &__self_0),
Self::TraitUpcasting(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TraitUpcasting", &__self_0),
}
}
}Debug)]
558#[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) {
match *self {
BuiltinImplSource::Trivial =>
0u8.stable_hash(__hcx, __hasher),
BuiltinImplSource::Misc => 1u8.stable_hash(__hcx, __hasher),
BuiltinImplSource::Object(ref __binding_0) =>
2u8.stable_hash(__hcx, __hasher),
BuiltinImplSource::TraitUpcasting(ref __binding_0) =>
3u8.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))]
559pub enum BuiltinImplSource {
560 Trivial,
563 Misc,
566 Object(usize),
569 TraitUpcasting(usize),
574}
575
576#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for FetchEligibleAssocItemResponse<I>
where I: Interner {
}
#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for FetchEligibleAssocItemResponse<I>
where I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[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)]
577pub enum FetchEligibleAssocItemResponse<I: Interner> {
578 Err(I::ErrorGuaranteed),
579 Found(I::ImplOrTraitAssocTermId),
580 NotFound(TypingMode<I, CantBeErased>),
581 NotFoundBecauseErased,
582}
583
584#[derive(#[automatically_derived]impl ::core::marker::Copy for IsIdentity { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for IsIdentity {
}
#[automatically_derived]impl ::core::clone::Clone for IsIdentity {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]impl ::core::fmt::Debug for IsIdentity {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
IsIdentity::No => "No",
IsIdentity::ModuloRegions => "ModuloRegions",
IsIdentity::Yes => "Yes",
})
}
}Debug, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
IsIdentity {
}
#[automatically_derived]impl ::core::cmp::PartialEq for IsIdentity {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for IsIdentity { }Eq, #[automatically_derived]impl ::core::cmp::PartialOrd for IsIdentity {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]impl ::core::cmp::Ord for IsIdentity {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]impl ::core::hash::Hash for IsIdentity {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash)]
586#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for IsIdentity {
#[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 {
IsIdentity::No => 0u8.stable_hash(__hcx, __hasher),
IsIdentity::ModuloRegions =>
1u8.stable_hash(__hcx, __hasher),
IsIdentity::Yes => 2u8.stable_hash(__hcx, __hasher),
}
match *self {
IsIdentity::No => {}
IsIdentity::ModuloRegions => {}
IsIdentity::Yes => {}
}
}
}
};StableHash_NoContext))]
587pub enum IsIdentity {
588 No,
589 ModuloRegions,
590 Yes,
591}
592
593#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for Response<I> where I: Interner {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl<I: Interner> ::core::marker::Copy for Response<I> where I: Interner { }
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for Response<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
Response {
certainty: ref __field_certainty,
var_values: ref __field_var_values,
var_values_is_identity: ref __field_var_values_is_identity,
external_constraints: ref __field_external_constraints } => {
::core::hash::Hash::hash(__field_certainty, __state);
::core::hash::Hash::hash(__field_var_values, __state);
::core::hash::Hash::hash(__field_var_values_is_identity,
__state);
::core::hash::Hash::hash(__field_external_constraints,
__state);
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for Response<I> where I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(Response {
certainty: ref __field_certainty,
var_values: ref __field_var_values,
var_values_is_identity: ref __field_var_values_is_identity,
external_constraints: ref __field_external_constraints },
Response {
certainty: ref __other_field_certainty,
var_values: ref __other_field_var_values,
var_values_is_identity: ref __other_field_var_values_is_identity,
external_constraints: ref __other_field_external_constraints
}) =>
true &&
::core::cmp::PartialEq::eq(__field_certainty,
__other_field_certainty) &&
::core::cmp::PartialEq::eq(__field_var_values,
__other_field_var_values) &&
::core::cmp::PartialEq::eq(__field_var_values_is_identity,
__other_field_var_values_is_identity) &&
::core::cmp::PartialEq::eq(__field_external_constraints,
__other_field_external_constraints),
}
}
}
#[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,
var_values_is_identity: ref __field_var_values_is_identity,
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,
"var_values_is_identity", __field_var_values_is_identity);
::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)]
594#[derive(const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeVisitable<I> for Response<I>
where I: Interner,
I::GenericArgs: ::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,
var_values_is_identity: ref __binding_2,
external_constraints: ref __binding_3 } => {
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_2,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_type_ir::VisitorResult::branch(::rustc_type_ir::TypeVisitable::visit_with(__binding_3,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_type_ir::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for Response<I> where
Certainty: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::GenericArgs: ::rustc_type_ir::GenericTypeVisitable<__V>,
IsIdentity: ::rustc_type_ir::GenericTypeVisitable<__V>,
I::ExternalConstraints: ::rustc_type_ir::GenericTypeVisitable<__V>
{
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
Response {
certainty: ref __binding_0,
var_values: ref __binding_1,
var_values_is_identity: ref __binding_2,
external_constraints: ref __binding_3 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_2,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_3,
__visitor);
}
}
}
}
}
};GenericTypeVisitable, const _: () =
{
impl<I: Interner> ::rustc_type_ir::TypeFoldable<I> for Response<I>
where I: Interner,
I::GenericArgs: ::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,
var_values_is_identity: __binding_2,
external_constraints: __binding_3 } => {
Response {
certainty: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
var_values: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
var_values_is_identity: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
external_constraints: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_3,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
Response {
certainty: __binding_0,
var_values: __binding_1,
var_values_is_identity: __binding_2,
external_constraints: __binding_3 } => {
Response {
certainty: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
var_values: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
var_values_is_identity: ::rustc_type_ir::TypeFoldable::fold_with(__binding_2,
__folder),
external_constraints: ::rustc_type_ir::TypeFoldable::fold_with(__binding_3,
__folder),
}
}
}
}
}
};TypeFoldable_Generic)]
595#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
Response<I> where
I::GenericArgs: ::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,
var_values_is_identity: ref __binding_2,
external_constraints: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
596pub struct Response<I: Interner> {
597 pub certainty: Certainty,
598 pub var_values: I::GenericArgs,
599 pub var_values_is_identity: IsIdentity,
601 pub external_constraints: I::ExternalConstraints,
603}
604
605impl<I: Interner> Response<I> {
606 pub fn update_var_values_is_identity(&mut self) {
607 self.var_values_is_identity = IsIdentity::Yes;
609
610 let mut bv = ty::BoundVar::ZERO;
611 for arg in self.var_values.iter() {
612 match arg.kind() {
613 ty::GenericArgKind::Lifetime(r) => {
614 if let ty::ReBound(ty::BoundVarIndexKind::Canonical, br) = r.kind()
615 && bv == br.var()
616 {
617 bv = bv + 1;
618 } else {
619 self.var_values_is_identity = IsIdentity::ModuloRegions;
622 }
623 }
624 ty::GenericArgKind::Type(ty) => {
625 if let ty::Bound(ty::BoundVarIndexKind::Canonical, bt) = ty.kind()
626 && bv == bt.var()
627 {
628 bv = bv + 1;
629 } else {
630 self.var_values_is_identity = IsIdentity::No;
631 break;
632 }
633 }
634 ty::GenericArgKind::Const(ct) => {
635 if let ty::ConstKind::Bound(ty::BoundVarIndexKind::Canonical, bc) = ct.kind()
636 && bv == bc.var()
637 {
638 bv = bv + 1;
639 } else {
640 self.var_values_is_identity = IsIdentity::No;
641 break;
642 }
643 }
644 }
645 }
646 }
647}
648
649impl<I: Interner> Eq for Response<I> {}
650
651#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for ExternalRegionConstraints<I> where
I: Interner {
#[inline]
fn clone(&self) -> Self {
match self {
ExternalRegionConstraints::Old(ref __field_0) =>
ExternalRegionConstraints::Old {
0: ::core::clone::Clone::clone(__field_0),
},
ExternalRegionConstraints::NextGen(ref __field_0) =>
ExternalRegionConstraints::NextGen {
0: ::core::clone::Clone::clone(__field_0),
},
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for ExternalRegionConstraints<I> where
I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
ExternalRegionConstraints::Old(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
ExternalRegionConstraints::NextGen(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for ExternalRegionConstraints<I>
where I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
if ::core::mem::discriminant(self) ==
::core::mem::discriminant(__other) {
match (self, __other) {
(ExternalRegionConstraints::Old(ref __field_0),
ExternalRegionConstraints::Old(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
(ExternalRegionConstraints::NextGen(ref __field_0),
ExternalRegionConstraints::NextGen(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
_ => unsafe { ::core::hint::unreachable_unchecked() },
}
} else { false }
}
}
#[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)]
652#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for
ExternalRegionConstraints<I> where
Vec<(ty::RegionConstraint<I>,
VisibleForLeakCheck)>: ::rustc_type_ir::GenericTypeVisitable<__V>,
RegionConstraint<I>: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
ExternalRegionConstraints::Old(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
ExternalRegionConstraints::NextGen(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
}
}
}
};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)]
653#[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) {
match *self {
ExternalRegionConstraints::Old(ref __binding_0) =>
0u8.stable_hash(__hcx, __hasher),
ExternalRegionConstraints::NextGen(ref __binding_0) =>
1u8.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))]
654pub enum ExternalRegionConstraints<I: Interner> {
655 Old(Vec<(ty::RegionConstraint<I>, VisibleForLeakCheck)>),
657 NextGen(RegionConstraint<I>),
660}
661
662impl<I: Interner> ExternalRegionConstraints<I> {
663 pub fn is_empty(&self) -> bool {
664 match self {
665 Self::Old(r) => r.is_empty(),
666 Self::NextGen(r) => r.is_true(),
667 }
668 }
669}
670
671#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for ExternalConstraintsData<I> where
I: Interner {
#[inline]
fn clone(&self) -> Self {
match self {
ExternalConstraintsData {
region_constraints: ref __field_region_constraints,
opaque_types: ref __field_opaque_types,
normalization_nested_goals: ref __field_normalization_nested_goals
} =>
ExternalConstraintsData {
region_constraints: ::core::clone::Clone::clone(__field_region_constraints),
opaque_types: ::core::clone::Clone::clone(__field_opaque_types),
normalization_nested_goals: ::core::clone::Clone::clone(__field_normalization_nested_goals),
},
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for ExternalConstraintsData<I> where
I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
ExternalConstraintsData {
region_constraints: ref __field_region_constraints,
opaque_types: ref __field_opaque_types,
normalization_nested_goals: ref __field_normalization_nested_goals
} => {
::core::hash::Hash::hash(__field_region_constraints, __state);
::core::hash::Hash::hash(__field_opaque_types, __state);
::core::hash::Hash::hash(__field_normalization_nested_goals,
__state);
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for ExternalConstraintsData<I> where
I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(ExternalConstraintsData {
region_constraints: ref __field_region_constraints,
opaque_types: ref __field_opaque_types,
normalization_nested_goals: ref __field_normalization_nested_goals
}, ExternalConstraintsData {
region_constraints: ref __other_field_region_constraints,
opaque_types: ref __other_field_opaque_types,
normalization_nested_goals: ref __other_field_normalization_nested_goals
}) =>
true &&
::core::cmp::PartialEq::eq(__field_region_constraints,
__other_field_region_constraints) &&
::core::cmp::PartialEq::eq(__field_opaque_types,
__other_field_opaque_types) &&
::core::cmp::PartialEq::eq(__field_normalization_nested_goals,
__other_field_normalization_nested_goals),
}
}
}
#[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)]
673#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for
ExternalConstraintsData<I> where
ExternalRegionConstraints<I>: ::rustc_type_ir::GenericTypeVisitable<__V>,
Vec<(ty::OpaqueTypeKey<I>,
I::Ty)>: ::rustc_type_ir::GenericTypeVisitable<__V>,
NestedNormalizationGoals<I>: ::rustc_type_ir::GenericTypeVisitable<__V>
{
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
ExternalConstraintsData {
region_constraints: ref __binding_0,
opaque_types: ref __binding_1,
normalization_nested_goals: ref __binding_2 } => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_1,
__visitor);
}
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_2,
__visitor);
}
}
}
}
}
};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)]
674#[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))]
675pub struct ExternalConstraintsData<I: Interner> {
676 pub region_constraints: ExternalRegionConstraints<I>,
677 pub opaque_types: Vec<(ty::OpaqueTypeKey<I>, I::Ty)>,
678 pub normalization_nested_goals: NestedNormalizationGoals<I>,
679}
680
681impl<I: Interner> Eq for ExternalConstraintsData<I> {}
682
683impl<I: Interner> ExternalConstraintsData<I> {
684 pub fn new(cx: I) -> Self {
685 let region_constraints = match cx.assumptions_on_binders() {
686 true => ExternalRegionConstraints::NextGen(RegionConstraint::new_true()),
687 false => ExternalRegionConstraints::Old(::alloc::vec::Vec::new()vec![]),
688 };
689
690 Self {
691 region_constraints,
692 opaque_types: ::alloc::vec::Vec::new()vec![],
693 normalization_nested_goals: NestedNormalizationGoals::default(),
694 }
695 }
696
697 pub fn is_empty(&self) -> bool {
698 let ExternalConstraintsData {
699 region_constraints,
700 opaque_types,
701 normalization_nested_goals,
702 } = self;
703 region_constraints.is_empty()
704 && opaque_types.is_empty()
705 && normalization_nested_goals.is_empty()
706 }
707}
708
709#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for VisibleForLeakCheck {
}
#[automatically_derived]impl ::core::clone::Clone for VisibleForLeakCheck {
#[inline]
fn clone(&self) -> Self { *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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
VisibleForLeakCheck {
}
#[automatically_derived]impl ::core::cmp::PartialEq for VisibleForLeakCheck {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for VisibleForLeakCheck { }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)]
715#[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) {
match *self {
VisibleForLeakCheck::Yes =>
0u8.stable_hash(__hcx, __hasher),
VisibleForLeakCheck::No => 1u8.stable_hash(__hcx, __hasher),
VisibleForLeakCheck::Unreachable =>
2u8.stable_hash(__hcx, __hasher),
}
match *self {
VisibleForLeakCheck::Yes => {}
VisibleForLeakCheck::No => {}
VisibleForLeakCheck::Unreachable => {}
}
}
}
};StableHash_NoContext))]
716pub enum VisibleForLeakCheck {
717 Yes,
718 No,
719 Unreachable,
720}
721
722impl VisibleForLeakCheck {
723 pub fn and(self, other: VisibleForLeakCheck) -> VisibleForLeakCheck {
724 match (self, other) {
725 (VisibleForLeakCheck::Unreachable, _) | (_, VisibleForLeakCheck::Unreachable) => {
728 VisibleForLeakCheck::Unreachable
729 }
730 (VisibleForLeakCheck::No, _) | (_, VisibleForLeakCheck::No) => VisibleForLeakCheck::No,
731 (VisibleForLeakCheck::Yes, VisibleForLeakCheck::Yes) => VisibleForLeakCheck::Yes,
732 }
733 }
734
735 pub fn or(self, other: VisibleForLeakCheck) -> VisibleForLeakCheck {
736 match (self, other) {
737 (VisibleForLeakCheck::Unreachable, _) | (_, VisibleForLeakCheck::Unreachable) => {
740 VisibleForLeakCheck::Unreachable
741 }
742 (VisibleForLeakCheck::Yes, _) | (_, VisibleForLeakCheck::Yes) => {
743 VisibleForLeakCheck::Yes
744 }
745 (VisibleForLeakCheck::No, VisibleForLeakCheck::No) => VisibleForLeakCheck::No,
746 }
747 }
748}
749
750#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for NestedNormalizationGoals<I> where
I: Interner {
#[inline]
fn clone(&self) -> Self {
match self {
NestedNormalizationGoals(ref __field_0) =>
NestedNormalizationGoals {
0: ::core::clone::Clone::clone(__field_0),
},
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for NestedNormalizationGoals<I> where
I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
NestedNormalizationGoals(ref __field_0) => {
::core::hash::Hash::hash(__field_0, __state);
}
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::cmp::PartialEq for NestedNormalizationGoals<I> where
I: Interner {
#[inline]
fn eq(&self, __other: &Self) -> ::core::primitive::bool {
match (self, __other) {
(NestedNormalizationGoals(ref __field_0),
NestedNormalizationGoals(ref __other_field_0)) =>
true &&
::core::cmp::PartialEq::eq(__field_0, __other_field_0),
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for NestedNormalizationGoals<I> where
I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
NestedNormalizationGoals(ref __field_0) => {
let mut __builder =
::core::fmt::Formatter::debug_tuple(__f,
"NestedNormalizationGoals");
::core::fmt::DebugTuple::field(&mut __builder, __field_0);
::core::fmt::DebugTuple::finish(&mut __builder)
}
}
}
}
#[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)]
751#[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, const _: () =
{
unsafe impl<I: Interner, __V>
::rustc_type_ir::GenericTypeVisitable<__V> for
NestedNormalizationGoals<I> where
Vec<(GoalSource,
Goal<I,
I::Predicate>)>: ::rustc_type_ir::GenericTypeVisitable<__V> {
fn generic_visit_with(&self, __visitor: &mut __V) {
match *self {
NestedNormalizationGoals(ref __binding_0) => {
{
::rustc_type_ir::GenericTypeVisitable::<__V>::generic_visit_with(__binding_0,
__visitor);
}
}
}
}
}
};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)]
752#[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))]
753pub struct NestedNormalizationGoals<I: Interner>(pub Vec<(GoalSource, Goal<I, I::Predicate>)>);
754
755impl<I: Interner> Eq for NestedNormalizationGoals<I> {}
756
757impl<I: Interner> NestedNormalizationGoals<I> {
758 pub fn empty() -> Self {
759 NestedNormalizationGoals(::alloc::vec::Vec::new()vec![])
760 }
761
762 pub fn is_empty(&self) -> bool {
763 self.0.is_empty()
764 }
765}
766
767#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for Certainty {
}
#[automatically_derived]impl ::core::clone::Clone for Certainty {
#[inline]
fn clone(&self) -> Self {
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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Maybe(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for Certainty
{
}
#[automatically_derived]impl ::core::cmp::PartialEq for Certainty {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Maybe(__self_0), Self::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 {
Self::Yes => ::core::fmt::Formatter::write_str(f, "Yes"),
Self::Maybe(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Maybe",
&__self_0),
}
}
}Debug)]
768#[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) {
match *self {
Certainty::Yes => 0u8.stable_hash(__hcx, __hasher),
Certainty::Maybe(ref __binding_0) =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
Certainty::Yes => {}
Certainty::Maybe(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash))]
769pub enum Certainty {
770 Yes,
771 Maybe(MaybeInfo),
772}
773
774#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for MaybeInfo {
}
#[automatically_derived]impl ::core::clone::Clone for MaybeInfo {
#[inline]
fn clone(&self) -> Self {
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::marker::StructuralPartialEq for MaybeInfo
{
}
#[automatically_derived]impl ::core::cmp::PartialEq for MaybeInfo {
#[inline]
fn eq(&self, other: &Self) -> 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 opaque_types_jank stalled_on_coroutines",
&self.cause, &self.opaque_types_jank,
&&self.stalled_on_coroutines)
}
}Debug)]
775#[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))]
776pub struct MaybeInfo {
777 pub cause: MaybeCause,
778 pub opaque_types_jank: OpaqueTypesJank,
779 pub stalled_on_coroutines: StalledOnCoroutines,
780}
781
782impl MaybeInfo {
783 pub const AMBIGUOUS: MaybeInfo = MaybeInfo {
784 cause: MaybeCause::Ambiguity,
785 opaque_types_jank: OpaqueTypesJank::AllGood,
786 stalled_on_coroutines: StalledOnCoroutines::No,
787 };
788
789 fn and(self, other: MaybeInfo) -> MaybeInfo {
790 MaybeInfo {
791 cause: self.cause.and(other.cause),
792 opaque_types_jank: self.opaque_types_jank.and(other.opaque_types_jank),
793 stalled_on_coroutines: self.stalled_on_coroutines.and(other.stalled_on_coroutines),
794 }
795 }
796
797 pub fn or(self, other: MaybeInfo) -> MaybeInfo {
798 MaybeInfo {
799 cause: self.cause.or(other.cause),
800 opaque_types_jank: self.opaque_types_jank.or(other.opaque_types_jank),
801 stalled_on_coroutines: self.stalled_on_coroutines.or(other.stalled_on_coroutines),
802 }
803 }
804}
805
806#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for OpaqueTypesJank {
}
#[automatically_derived]impl ::core::clone::Clone for OpaqueTypesJank {
#[inline]
fn clone(&self) -> Self { *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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
OpaqueTypesJank {
}
#[automatically_derived]impl ::core::cmp::PartialEq for OpaqueTypesJank {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for OpaqueTypesJank { }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)]
835#[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) {
match *self {
OpaqueTypesJank::AllGood =>
0u8.stable_hash(__hcx, __hasher),
OpaqueTypesJank::ErrorIfRigidSelfTy =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
OpaqueTypesJank::AllGood => {}
OpaqueTypesJank::ErrorIfRigidSelfTy => {}
}
}
}
};StableHash))]
836pub enum OpaqueTypesJank {
837 AllGood,
838 ErrorIfRigidSelfTy,
839}
840impl OpaqueTypesJank {
841 fn and(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
842 match (self, other) {
843 (OpaqueTypesJank::AllGood, OpaqueTypesJank::AllGood) => OpaqueTypesJank::AllGood,
844 (OpaqueTypesJank::ErrorIfRigidSelfTy, _) | (_, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
845 OpaqueTypesJank::ErrorIfRigidSelfTy
846 }
847 }
848 }
849
850 pub fn or(self, other: OpaqueTypesJank) -> OpaqueTypesJank {
851 match (self, other) {
852 (OpaqueTypesJank::ErrorIfRigidSelfTy, OpaqueTypesJank::ErrorIfRigidSelfTy) => {
853 OpaqueTypesJank::ErrorIfRigidSelfTy
854 }
855 (OpaqueTypesJank::AllGood, _) | (_, OpaqueTypesJank::AllGood) => {
856 OpaqueTypesJank::AllGood
857 }
858 }
859 }
860}
861
862#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for StalledOnCoroutines {
}
#[automatically_derived]impl ::core::clone::Clone for StalledOnCoroutines {
#[inline]
fn clone(&self) -> Self { *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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
StalledOnCoroutines {
}
#[automatically_derived]impl ::core::cmp::PartialEq for StalledOnCoroutines {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for StalledOnCoroutines { }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)]
863#[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) {
match *self {
StalledOnCoroutines::Yes =>
0u8.stable_hash(__hcx, __hasher),
StalledOnCoroutines::No => 1u8.stable_hash(__hcx, __hasher),
}
match *self {
StalledOnCoroutines::Yes => {}
StalledOnCoroutines::No => {}
}
}
}
};StableHash_NoContext))]
864pub enum StalledOnCoroutines {
865 Yes,
866 No,
867}
868
869impl StalledOnCoroutines {
870 fn and(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
871 match (self, other) {
872 (StalledOnCoroutines::No, StalledOnCoroutines::No) => StalledOnCoroutines::No,
873 (StalledOnCoroutines::Yes, _) | (_, StalledOnCoroutines::Yes) => {
874 StalledOnCoroutines::Yes
875 }
876 }
877 }
878
879 pub fn or(self, other: StalledOnCoroutines) -> StalledOnCoroutines {
880 StalledOnCoroutines::and(self, other)
884 }
885}
886
887impl Certainty {
888 pub const AMBIGUOUS: Certainty = Certainty::Maybe(MaybeInfo::AMBIGUOUS);
889
890 pub fn and(self, other: Certainty) -> Certainty {
903 match (self, other) {
904 (Certainty::Yes, Certainty::Yes) => Certainty::Yes,
905 (Certainty::Yes, Certainty::Maybe { .. }) => other,
906 (Certainty::Maybe { .. }, Certainty::Yes) => self,
907 (Certainty::Maybe(a_maybe), Certainty::Maybe(b_maybe)) => {
908 Certainty::Maybe(a_maybe.and(b_maybe))
909 }
910 }
911 }
912
913 pub const fn overflow(suggest_increasing_limit: bool) -> Certainty {
914 Certainty::Maybe(MaybeInfo {
915 cause: MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: false },
916 opaque_types_jank: OpaqueTypesJank::AllGood,
917 stalled_on_coroutines: StalledOnCoroutines::No,
918 })
919 }
920
921 pub fn is_yes(&self) -> bool {
922 match self {
923 Certainty::Yes => true,
924 Certainty::Maybe(_) => false,
925 }
926 }
927
928 pub fn is_overflow(&self) -> bool {
929 match self {
930 Certainty::Maybe(MaybeInfo { cause: MaybeCause::Overflow { .. }, .. }) => true,
931 _ => false,
932 }
933 }
934}
935
936#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for MaybeCause {
}
#[automatically_derived]impl ::core::clone::Clone for MaybeCause {
#[inline]
fn clone(&self) -> Self {
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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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::marker::StructuralPartialEq for
MaybeCause {
}
#[automatically_derived]impl ::core::cmp::PartialEq for MaybeCause {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Overflow {
suggest_increasing_limit: __self_0,
keep_constraints: __self_1 }, Self::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 {
Self::Ambiguity =>
::core::fmt::Formatter::write_str(f, "Ambiguity"),
Self::Overflow {
suggest_increasing_limit: __self_0, keep_constraints: __self_1
} =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Overflow suggest_increasing_limit keep_constraints",
__self_0, &__self_1),
}
}
}Debug)]
938#[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) {
match *self {
MaybeCause::Ambiguity => 0u8.stable_hash(__hcx, __hasher),
MaybeCause::Overflow {
suggest_increasing_limit: ref __binding_0,
keep_constraints: ref __binding_1 } =>
1u8.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))]
939pub enum MaybeCause {
940 Ambiguity,
944 Overflow { suggest_increasing_limit: bool, keep_constraints: bool },
946}
947
948impl MaybeCause {
949 fn and(self, other: MaybeCause) -> MaybeCause {
950 match (self, other) {
951 (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
952 (MaybeCause::Ambiguity, MaybeCause::Overflow { .. }) => other,
953 (MaybeCause::Overflow { .. }, MaybeCause::Ambiguity) => self,
954 (
955 MaybeCause::Overflow {
956 suggest_increasing_limit: limit_a,
957 keep_constraints: keep_a,
958 },
959 MaybeCause::Overflow {
960 suggest_increasing_limit: limit_b,
961 keep_constraints: keep_b,
962 },
963 ) => MaybeCause::Overflow {
964 suggest_increasing_limit: limit_a && limit_b,
965 keep_constraints: keep_a && keep_b,
966 },
967 }
968 }
969
970 pub fn or(self, other: MaybeCause) -> MaybeCause {
971 match (self, other) {
972 (MaybeCause::Ambiguity, MaybeCause::Ambiguity) => MaybeCause::Ambiguity,
973
974 (
976 MaybeCause::Ambiguity,
977 MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
978 ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
979 (
980 MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
981 MaybeCause::Ambiguity,
982 ) => MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: true },
983
984 (
985 MaybeCause::Overflow {
986 suggest_increasing_limit: limit_a,
987 keep_constraints: keep_a,
988 },
989 MaybeCause::Overflow {
990 suggest_increasing_limit: limit_b,
991 keep_constraints: keep_b,
992 },
993 ) => MaybeCause::Overflow {
994 suggest_increasing_limit: limit_a || limit_b,
995 keep_constraints: keep_a || keep_b,
996 },
997 }
998 }
999}
1000
1001#[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)]
1003pub enum AdtDestructorKind {
1004 NotConst,
1005 Const,
1006}
1007
1008#[derive(#[automatically_derived]impl ::core::marker::Copy for SizedTraitKind { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for SizedTraitKind {
}
#[automatically_derived]impl ::core::clone::Clone for SizedTraitKind {
#[inline]
fn clone(&self) -> Self { *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 { }Eq, #[automatically_derived]impl ::core::hash::Hash for SizedTraitKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
SizedTraitKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for SizedTraitKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq)]
1011#[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) {
match *self {
SizedTraitKind::Sized => 0u8.stable_hash(__hcx, __hasher),
SizedTraitKind::MetaSized =>
1u8.stable_hash(__hcx, __hasher),
}
match *self {
SizedTraitKind::Sized => {}
SizedTraitKind::MetaSized => {}
}
}
}
};StableHash))]
1012pub enum SizedTraitKind {
1013 Sized,
1015 MetaSized,
1017}
1018
1019impl SizedTraitKind {
1020 pub fn require_lang_item<I: Interner>(self, cx: I) -> I::TraitId {
1022 cx.require_trait_lang_item(match self {
1023 SizedTraitKind::Sized => SolverTraitLangItem::Sized,
1024 SizedTraitKind::MetaSized => SolverTraitLangItem::MetaSized,
1025 })
1026 }
1027}
1028
1029#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for SucceededInErased<I> where
I: Interner {
#[inline]
fn clone(&self) -> Self {
match self {
SucceededInErased::Yes {
accessed_opaques: ref __field_accessed_opaques } =>
SucceededInErased::Yes {
accessed_opaques: ::core::clone::Clone::clone(__field_accessed_opaques),
},
SucceededInErased::No => SucceededInErased::No,
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for SucceededInErased<I> where
I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
SucceededInErased::Yes {
accessed_opaques: ref __field_accessed_opaques } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Yes");
::core::fmt::DebugStruct::field(&mut __builder,
"accessed_opaques", __field_accessed_opaques);
::core::fmt::DebugStruct::finish(&mut __builder)
}
SucceededInErased::No =>
::core::fmt::Formatter::write_str(__f, "No"),
}
}
}#[derive_where(Clone, Debug; I: Interner)]
1030pub enum SucceededInErased<I: Interner> {
1031 Yes {
1034 accessed_opaques: AccessedOpaques<I>,
1035 },
1036 No,
1037}
1038
1039#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for GoalStalledOnOpaques<I> where
I: Interner {
#[inline]
fn clone(&self) -> Self {
match self {
GoalStalledOnOpaques::No => GoalStalledOnOpaques::No,
GoalStalledOnOpaques::Yes {
num_opaques_in_storage: ref __field_num_opaques_in_storage,
previously_succeeded_in_erased: ref __field_previously_succeeded_in_erased
} =>
GoalStalledOnOpaques::Yes {
num_opaques_in_storage: ::core::clone::Clone::clone(__field_num_opaques_in_storage),
previously_succeeded_in_erased: ::core::clone::Clone::clone(__field_previously_succeeded_in_erased),
},
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for GoalStalledOnOpaques<I> where
I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
GoalStalledOnOpaques::No =>
::core::fmt::Formatter::write_str(__f, "No"),
GoalStalledOnOpaques::Yes {
num_opaques_in_storage: ref __field_num_opaques_in_storage,
previously_succeeded_in_erased: ref __field_previously_succeeded_in_erased
} => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Yes");
::core::fmt::DebugStruct::field(&mut __builder,
"num_opaques_in_storage", __field_num_opaques_in_storage);
::core::fmt::DebugStruct::field(&mut __builder,
"previously_succeeded_in_erased",
__field_previously_succeeded_in_erased);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Debug; I: Interner)]
1040pub enum GoalStalledOnOpaques<I: Interner> {
1041 No,
1045 Yes {
1046 num_opaques_in_storage: usize,
1047 previously_succeeded_in_erased: SucceededInErased<I>,
1048 },
1049}
1050
1051#[automatically_derived]
impl<I: Interner> ::core::clone::Clone for GoalStalledOn<I> where I: Interner
{
#[inline]
fn clone(&self) -> Self {
match self {
GoalStalledOn {
stalled_vars: ref __field_stalled_vars,
sub_roots: ref __field_sub_roots,
stalled_maybe_info: ref __field_stalled_maybe_info,
opaques: ref __field_opaques } =>
GoalStalledOn {
stalled_vars: ::core::clone::Clone::clone(__field_stalled_vars),
sub_roots: ::core::clone::Clone::clone(__field_sub_roots),
stalled_maybe_info: ::core::clone::Clone::clone(__field_stalled_maybe_info),
opaques: ::core::clone::Clone::clone(__field_opaques),
},
}
}
}
#[automatically_derived]
impl<I: Interner> ::core::fmt::Debug for GoalStalledOn<I> where I: Interner {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
GoalStalledOn {
stalled_vars: ref __field_stalled_vars,
sub_roots: ref __field_sub_roots,
stalled_maybe_info: ref __field_stalled_maybe_info,
opaques: ref __field_opaques } => {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "GoalStalledOn");
::core::fmt::DebugStruct::field(&mut __builder,
"stalled_vars", __field_stalled_vars);
::core::fmt::DebugStruct::field(&mut __builder, "sub_roots",
__field_sub_roots);
::core::fmt::DebugStruct::field(&mut __builder,
"stalled_maybe_info", __field_stalled_maybe_info);
::core::fmt::DebugStruct::field(&mut __builder, "opaques",
__field_opaques);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Debug; I: Interner)]
1053pub struct GoalStalledOn<I: Interner> {
1054 pub stalled_vars: ThinVec<TyOrConstInferVar>,
1056 pub sub_roots: ThinVec<TyVid>,
1058 pub stalled_maybe_info: MaybeInfo,
1061 pub opaques: GoalStalledOnOpaques<I>,
1062}
1063
1064#[derive(#[automatically_derived]impl<I: ::core::clone::Clone + Interner>
::core::clone::Clone for ComputeGoalFastPathOutcome<I> {
#[inline]
fn clone(&self) -> Self {
match self {
Self::NoFastPath => ComputeGoalFastPathOutcome::NoFastPath,
Self::TriviallyHolds =>
ComputeGoalFastPathOutcome::TriviallyHolds,
Self::TriviallyStalled { stalled_on: __self_0 } =>
ComputeGoalFastPathOutcome::TriviallyStalled {
stalled_on: ::core::clone::Clone::clone(__self_0),
},
}
}
}Clone, #[automatically_derived]impl<I: ::core::fmt::Debug + Interner>
::core::fmt::Debug for ComputeGoalFastPathOutcome<I> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::NoFastPath =>
::core::fmt::Formatter::write_str(f, "NoFastPath"),
Self::TriviallyHolds =>
::core::fmt::Formatter::write_str(f, "TriviallyHolds"),
Self::TriviallyStalled { stalled_on: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TriviallyStalled stalled_on", &__self_0),
}
}
}Debug)]
1067pub enum ComputeGoalFastPathOutcome<I: Interner> {
1068 NoFastPath,
1070 TriviallyHolds,
1072 TriviallyStalled { stalled_on: GoalStalledOn<I> },
1075}
1076
1077#[derive(#[automatically_derived]impl ::core::marker::Copy for TyOrConstInferVar { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for TyOrConstInferVar {
}
#[automatically_derived]impl ::core::clone::Clone for TyOrConstInferVar {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<TyVid>;
let _: ::core::clone::AssertParamIsClone<IntVid>;
let _: ::core::clone::AssertParamIsClone<FloatVid>;
let _: ::core::clone::AssertParamIsClone<ConstVid>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for TyOrConstInferVar {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Ty(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Ty",
&__self_0),
Self::TyInt(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "TyInt",
&__self_0),
Self::TyFloat(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TyFloat", &__self_0),
Self::Const(__self_0) =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
&__self_0),
}
}
}Debug, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
TyOrConstInferVar {
}
#[automatically_derived]impl ::core::cmp::PartialEq for TyOrConstInferVar {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Ty(__self_0), Self::Ty(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::TyInt(__self_0), Self::TyInt(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::TyFloat(__self_0), Self::TyFloat(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Const(__self_0), Self::Const(__arg1_0)) =>
__self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]impl ::core::cmp::Eq for TyOrConstInferVar {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<TyVid>;
let _: ::core::cmp::AssertParamIsEq<IntVid>;
let _: ::core::cmp::AssertParamIsEq<FloatVid>;
let _: ::core::cmp::AssertParamIsEq<ConstVid>;
}
}Eq)]
1081pub enum TyOrConstInferVar {
1082 Ty(TyVid),
1084 TyInt(IntVid),
1086 TyFloat(FloatVid),
1088
1089 Const(ConstVid),
1091}
1092
1093impl TyOrConstInferVar {
1094 pub fn as_type<I: Interner>(&self, interner: I) -> Option<I::Ty> {
1095 match self {
1096 Self::Ty(vid) => Some(I::Ty::new_var(interner, *vid)),
1097 Self::TyInt(_) | Self::TyFloat(_) | Self::Const(_) => None,
1098 }
1099 }
1100
1101 pub fn maybe_from_generic_arg<I: Interner>(arg: I::GenericArg) -> Option<Self> {
1105 match arg.kind() {
1106 GenericArgKind::Type(ty) => Self::maybe_from_ty::<I>(ty),
1107 GenericArgKind::Const(ct) => Self::maybe_from_const::<I>(ct),
1108 GenericArgKind::Lifetime(_) => None,
1109 }
1110 }
1111
1112 pub fn maybe_from_term<I: Interner>(term: I::Term) -> Option<Self> {
1116 match term.kind() {
1117 TermKind::Ty(ty) => Self::maybe_from_ty::<I>(ty),
1118 TermKind::Const(ct) => Self::maybe_from_const::<I>(ct),
1119 }
1120 }
1121
1122 fn maybe_from_ty<I: Interner>(ty: I::Ty) -> Option<Self> {
1125 match ty.kind() {
1126 ty::Infer(ty::TyVar(v)) => Some(TyOrConstInferVar::Ty(v)),
1127 ty::Infer(ty::IntVar(v)) => Some(TyOrConstInferVar::TyInt(v)),
1128 ty::Infer(ty::FloatVar(v)) => Some(TyOrConstInferVar::TyFloat(v)),
1129 _ => None,
1130 }
1131 }
1132
1133 fn maybe_from_const<I: Interner>(ct: Const<I>) -> Option<Self> {
1136 match ct.kind() {
1137 ty::ConstKind::Infer(InferConst::Var(v)) => Some(TyOrConstInferVar::Const(v)),
1138 _ => None,
1139 }
1140 }
1141}