1use std::fmt;
2use std::hash::Hash;
3use std::marker::PhantomData;
4use std::ops::{ControlFlow, Deref};
5
6use derive_where::derive_where;
7#[cfg(feature = "nightly")]
8use rustc_macros::{Decodable_NoContext, Encodable_NoContext, StableHash, StableHash_NoContext};
9use rustc_type_ir_macros::{
10 GenericTypeVisitable, Lift_Generic, TypeFoldable_Generic, TypeVisitable_Generic,
11};
12use tracing::instrument;
13
14use crate::data_structures::SsoHashSet;
15use crate::fold::{FallibleTypeFolder, TypeFoldable, TypeFolder, TypeSuperFoldable};
16use crate::inherent::*;
17use crate::visit::{Flags, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor};
18use crate::{self as ty, DebruijnIndex, Interner, UniverseIndex, Unnormalized};
19
20#[automatically_derived]
impl<I: Interner, T> ::core::fmt::Debug for Binder<I, T> where I: Interner,
T: ::core::fmt::Debug {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
Binder {
value: ref __field_value, bound_vars: ref __field_bound_vars }
=> {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "Binder");
::core::fmt::DebugStruct::field(&mut __builder, "value",
__field_value);
::core::fmt::DebugStruct::field(&mut __builder, "bound_vars",
__field_bound_vars);
::core::fmt::DebugStruct::finish(&mut __builder)
}
}
}
}#[derive_where(Clone, Copy, Hash, PartialEq, Debug; I: Interner, T)]
29#[derive(GenericTypeVisitable, const _: () =
{
impl<I: Interner, T, J> ::rustc_type_ir::lift::Lift<J> for
Binder<I, T> where J: Interner, I: ::rustc_type_ir::LiftInto<J>,
T: ::rustc_type_ir::lift::Lift<J> {
type Lifted =
Binder<J, <T as ::rustc_type_ir::lift::Lift<J>>::Lifted>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
Binder { value: __binding_0, bound_vars: __binding_1 } => {
Binder {
value: __binding_0.lift_to_interner(interner),
bound_vars: __binding_1.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic)]
30#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner, T> ::rustc_data_structures::stable_hash::StableHash
for Binder<I, T> where
T: ::rustc_data_structures::stable_hash::StableHash,
I::BoundVarKinds: ::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 {
Binder { value: ref __binding_0, bound_vars: ref __binding_1
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
31pub struct Binder<I: Interner, T> {
32 value: T,
33 bound_vars: I::BoundVarKinds,
34}
35
36impl<I: Interner, T: Eq> Eq for Binder<I, T> {}
37
38#[cfg(feature = "nightly")]
39macro_rules! impl_binder_encode_decode {
40 ($($t:ty),+ $(,)?) => {
41 $(
42 impl<I: Interner, E: rustc_serialize::Encoder> rustc_serialize::Encodable<E> for ty::Binder<I, $t>
43 where
44 $t: rustc_serialize::Encodable<E>,
45 I::BoundVarKinds: rustc_serialize::Encodable<E>,
46 {
47 fn encode(&self, e: &mut E) {
48 self.bound_vars().encode(e);
49 self.as_ref().skip_binder().encode(e);
50 }
51 }
52 impl<I: Interner, D: rustc_serialize::Decoder> rustc_serialize::Decodable<D> for ty::Binder<I, $t>
53 where
54 $t: TypeVisitable<I> + rustc_serialize::Decodable<D>,
55 I::BoundVarKinds: rustc_serialize::Decodable<D>,
56 {
57 fn decode(decoder: &mut D) -> Self {
58 let bound_vars = rustc_serialize::Decodable::decode(decoder);
59 ty::Binder::bind_with_vars(rustc_serialize::Decodable::decode(decoder), bound_vars)
60 }
61 }
62 )*
63 }
64}
65
66#[cfg(feature = "nightly")]
67impl<I: Interner, E: rustc_serialize::Encoder> rustc_serialize::Encodable<E>
for ty::Binder<I, ty::HostEffectPredicate<I>> where
ty::HostEffectPredicate<I>: rustc_serialize::Encodable<E>,
I::BoundVarKinds: rustc_serialize::Encodable<E> {
fn encode(&self, e: &mut E) {
self.bound_vars().encode(e);
self.as_ref().skip_binder().encode(e);
}
}
impl<I: Interner, D: rustc_serialize::Decoder> rustc_serialize::Decodable<D>
for ty::Binder<I, ty::HostEffectPredicate<I>> where
ty::HostEffectPredicate<I>: TypeVisitable<I> +
rustc_serialize::Decodable<D>,
I::BoundVarKinds: rustc_serialize::Decodable<D> {
fn decode(decoder: &mut D) -> Self {
let bound_vars = rustc_serialize::Decodable::decode(decoder);
ty::Binder::bind_with_vars(rustc_serialize::Decodable::decode(decoder),
bound_vars)
}
}impl_binder_encode_decode! {
68 ty::FnSig<I>,
69 ty::FnSigTys<I>,
70 ty::TraitPredicate<I>,
71 ty::ExistentialPredicate<I>,
72 ty::TraitRef<I>,
73 ty::ExistentialTraitRef<I>,
74 ty::HostEffectPredicate<I>,
75}
76
77impl<I: Interner, T> Binder<I, T>
78where
79 T: TypeVisitable<I>,
80{
81 #[track_caller]
86 pub fn dummy(value: T) -> Binder<I, T> {
87 if !!value.has_escaping_bound_vars() {
{
::core::panicking::panic_fmt(format_args!("`{0:?}` has escaping bound vars, so it cannot be wrapped in a dummy binder.",
value));
}
};assert!(
88 !value.has_escaping_bound_vars(),
89 "`{value:?}` has escaping bound vars, so it cannot be wrapped in a dummy binder."
90 );
91 Binder { value, bound_vars: Default::default() }
92 }
93
94 pub fn bind_with_vars(value: T, bound_vars: I::BoundVarKinds) -> Binder<I, T> {
95 if truecfg!(debug_assertions) {
96 let mut validator = ValidateBoundVars::new(bound_vars);
97 let _ = value.visit_with(&mut validator);
98 }
99 Binder { value, bound_vars }
100 }
101}
102
103impl<I: Interner, T: TypeFoldable<I>> TypeFoldable<I> for Binder<I, T> {
104 fn try_fold_with<F: FallibleTypeFolder<I>>(self, folder: &mut F) -> Result<Self, F::Error> {
105 folder.try_fold_binder(self)
106 }
107
108 fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self {
109 folder.fold_binder(self)
110 }
111}
112
113impl<I: Interner, T: TypeVisitable<I>> TypeVisitable<I> for Binder<I, T> {
114 fn visit_with<V: TypeVisitor<I>>(&self, visitor: &mut V) -> V::Result {
115 visitor.visit_binder(self)
116 }
117}
118
119impl<I: Interner, T: TypeFoldable<I>> TypeSuperFoldable<I> for Binder<I, T> {
120 fn try_super_fold_with<F: FallibleTypeFolder<I>>(
121 self,
122 folder: &mut F,
123 ) -> Result<Self, F::Error> {
124 self.try_map_bound(|t| t.try_fold_with(folder))
125 }
126
127 fn super_fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self {
128 self.map_bound(|t| t.fold_with(folder))
129 }
130}
131
132impl<I: Interner, T: TypeVisitable<I>> TypeSuperVisitable<I> for Binder<I, T> {
133 fn super_visit_with<V: TypeVisitor<I>>(&self, visitor: &mut V) -> V::Result {
134 self.as_ref().skip_binder().visit_with(visitor)
135 }
136}
137
138impl<I: Interner, T> Binder<I, T> {
139 pub fn skip_binder(self) -> T {
153 self.value
154 }
155
156 pub fn bound_vars(&self) -> I::BoundVarKinds {
157 self.bound_vars
158 }
159
160 pub fn as_ref(&self) -> Binder<I, &T> {
161 Binder { value: &self.value, bound_vars: self.bound_vars }
162 }
163
164 pub fn as_deref(&self) -> Binder<I, &T::Target>
165 where
166 T: Deref,
167 {
168 Binder { value: &self.value, bound_vars: self.bound_vars }
169 }
170
171 pub fn map_bound_ref<F, U: TypeVisitable<I>>(&self, f: F) -> Binder<I, U>
172 where
173 F: FnOnce(&T) -> U,
174 {
175 self.as_ref().map_bound(f)
176 }
177
178 pub fn map_bound<F, U: TypeVisitable<I>>(self, f: F) -> Binder<I, U>
179 where
180 F: FnOnce(T) -> U,
181 {
182 let Binder { value, bound_vars } = self;
183 let value = f(value);
184 if truecfg!(debug_assertions) {
185 let mut validator = ValidateBoundVars::new(bound_vars);
186 let _ = value.visit_with(&mut validator);
187 }
188 Binder { value, bound_vars }
189 }
190
191 pub fn try_map_bound<F, U: TypeVisitable<I>, E>(self, f: F) -> Result<Binder<I, U>, E>
192 where
193 F: FnOnce(T) -> Result<U, E>,
194 {
195 let Binder { value, bound_vars } = self;
196 let value = f(value)?;
197 if truecfg!(debug_assertions) {
198 let mut validator = ValidateBoundVars::new(bound_vars);
199 let _ = value.visit_with(&mut validator);
200 }
201 Ok(Binder { value, bound_vars })
202 }
203
204 pub fn rebind<U>(&self, value: U) -> Binder<I, U>
214 where
215 U: TypeVisitable<I>,
216 {
217 Binder::bind_with_vars(value, self.bound_vars)
218 }
219
220 pub fn no_bound_vars(self) -> Option<T>
231 where
232 T: TypeVisitable<I>,
233 {
234 if self.value.has_escaping_bound_vars() { None } else { Some(self.skip_binder()) }
236 }
237}
238
239impl<I: Interner, T> Binder<I, Option<T>> {
240 pub fn transpose(self) -> Option<Binder<I, T>> {
241 let Binder { value, bound_vars } = self;
242 value.map(|value| Binder { value, bound_vars })
243 }
244}
245
246impl<I: Interner, T: IntoIterator> Binder<I, T> {
247 pub fn iter(self) -> impl Iterator<Item = Binder<I, T::Item>> {
248 let Binder { value, bound_vars } = self;
249 value.into_iter().map(move |value| Binder { value, bound_vars })
250 }
251}
252
253pub struct ValidateBoundVars<I: Interner> {
254 bound_vars: I::BoundVarKinds,
255 binder_index: ty::DebruijnIndex,
256 visited: SsoHashSet<(ty::DebruijnIndex, I::Ty)>,
260}
261
262impl<I: Interner> ValidateBoundVars<I> {
263 pub fn new(bound_vars: I::BoundVarKinds) -> Self {
264 ValidateBoundVars {
265 bound_vars,
266 binder_index: ty::INNERMOST,
267 visited: SsoHashSet::default(),
268 }
269 }
270}
271
272impl<I: Interner> TypeVisitor<I> for ValidateBoundVars<I> {
273 type Result = ControlFlow<()>;
274
275 fn visit_binder<T: TypeVisitable<I>>(&mut self, t: &Binder<I, T>) -> Self::Result {
276 self.binder_index.shift_in(1);
277 let result = t.super_visit_with(self);
278 self.binder_index.shift_out(1);
279 result
280 }
281
282 fn visit_ty(&mut self, t: I::Ty) -> Self::Result {
283 if t.outer_exclusive_binder() < self.binder_index
284 || !self.visited.insert((self.binder_index, t))
285 {
286 return ControlFlow::Break(());
287 }
288 match t.kind() {
289 ty::Bound(ty::BoundVarIndexKind::Bound(debruijn), bound_ty)
290 if debruijn == self.binder_index =>
291 {
292 let idx = bound_ty.var().as_usize();
293 if self.bound_vars.len() <= idx {
294 {
::core::panicking::panic_fmt(format_args!("Not enough bound vars: {0:?} not found in {1:?}",
t, self.bound_vars));
};panic!("Not enough bound vars: {:?} not found in {:?}", t, self.bound_vars);
295 }
296 bound_ty.assert_eq(self.bound_vars.get(idx).unwrap());
297 }
298 _ => {}
299 };
300
301 t.super_visit_with(self)
302 }
303
304 fn visit_const(&mut self, c: I::Const) -> Self::Result {
305 if c.outer_exclusive_binder() < self.binder_index {
306 return ControlFlow::Break(());
307 }
308 match c.kind() {
309 ty::ConstKind::Bound(debruijn, bound_const)
310 if debruijn == ty::BoundVarIndexKind::Bound(self.binder_index) =>
311 {
312 let idx = bound_const.var().as_usize();
313 if self.bound_vars.len() <= idx {
314 {
::core::panicking::panic_fmt(format_args!("Not enough bound vars: {0:?} not found in {1:?}",
c, self.bound_vars));
};panic!("Not enough bound vars: {:?} not found in {:?}", c, self.bound_vars);
315 }
316 bound_const.assert_eq(self.bound_vars.get(idx).unwrap());
317 }
318 _ => {}
319 };
320
321 c.super_visit_with(self)
322 }
323
324 fn visit_region(&mut self, r: I::Region) -> Self::Result {
325 match r.kind() {
326 ty::ReBound(index, br) if index == ty::BoundVarIndexKind::Bound(self.binder_index) => {
327 let idx = br.var().as_usize();
328 if self.bound_vars.len() <= idx {
329 {
::core::panicking::panic_fmt(format_args!("Not enough bound vars: {0:?} not found in {1:?}",
r, self.bound_vars));
};panic!("Not enough bound vars: {:?} not found in {:?}", r, self.bound_vars);
330 }
331 br.assert_eq(self.bound_vars.get(idx).unwrap());
332 }
333
334 _ => (),
335 };
336
337 ControlFlow::Continue(())
338 }
339}
340
341#[automatically_derived]
impl<I: Interner, T> ::core::fmt::Debug for EarlyBinder<I, T> where
I: Interner, T: ::core::fmt::Debug {
fn fmt(&self, __f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
match self {
EarlyBinder { value: ref __field_value, _tcx: ref __field__tcx }
=> {
let mut __builder =
::core::fmt::Formatter::debug_struct(__f, "EarlyBinder");
::core::fmt::DebugStruct::field(&mut __builder, "value",
__field_value);
::core::fmt::DebugStruct::finish_non_exhaustive(&mut __builder)
}
}
}
}#[derive_where(Clone, Copy, PartialOrd, Ord, PartialEq, Hash, Debug; I: Interner, T)]
347#[derive(GenericTypeVisitable)]
348#[cfg_attr(
349 feature = "nightly",
350 derive(const _: () =
{
impl<I: Interner, T, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for EarlyBinder<I, T> where
T: ::rustc_serialize::Encodable<__E>,
PhantomData<fn() -> I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
EarlyBinder { value: ref __binding_0, _tcx: ref __binding_1
} => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, T, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for EarlyBinder<I, T> where
T: ::rustc_serialize::Decodable<__D>,
PhantomData<fn() -> I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
EarlyBinder {
value: ::rustc_serialize::Decodable::decode(__decoder),
_tcx: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner, T> ::rustc_data_structures::stable_hash::StableHash
for EarlyBinder<I, T> where
T: ::rustc_data_structures::stable_hash::StableHash,
PhantomData<fn()
-> 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 {
EarlyBinder { value: ref __binding_0, _tcx: ref __binding_1
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
351)]
352pub struct EarlyBinder<I: Interner, T> {
353 value: T,
354 #[derive_where(skip(Debug))]
355 _tcx: PhantomData<fn() -> I>,
356}
357
358impl<I: Interner, T: Eq> Eq for EarlyBinder<I, T> {}
359
360#[cfg(feature = "nightly")]
362macro_rules! generate { ($( $tt:tt )*) => { $( $tt )* } }
363
364#[cfg(feature = "nightly")]
365generate!(
366 impl<I: Interner, T> !TypeFoldable<I> for ty::EarlyBinder<I, T> {}
368 impl<I: Interner, T> !TypeVisitable<I> for ty::EarlyBinder<I, T> {}
370);
371
372impl<I: Interner, T: TypeFoldable<I>> EarlyBinder<I, T> {
373 pub fn bind(cx: I, value: T) -> EarlyBinder<I, T> {
374 let value = ty::set_aliases_to_non_rigid(cx, value).skip_normalization();
376 EarlyBinder { value, _tcx: PhantomData }
377 }
378}
379
380impl<I: Interner, T: IntoIterator<Item: TypeVisitable<I>> + Clone> EarlyBinder<I, T> {
381 pub fn bind_iter(value: T) -> EarlyBinder<I, T> {
382 #[cfg(debug_assertions)]
383 {
384 value.clone().into_iter().for_each(|v| if !!v.has_rigid_aliases() {
::core::panicking::panic("assertion failed: !v.has_rigid_aliases()")
}assert!(!v.has_rigid_aliases()));
385 }
386
387 EarlyBinder { value, _tcx: PhantomData }
388 }
389}
390
391impl<I: Interner, T: TypeVisitable<I>> EarlyBinder<I, T> {
392 pub fn bind_no_rigid_aliases(value: T) -> EarlyBinder<I, T> {
393 if true {
if !!value.has_rigid_aliases() {
::core::panicking::panic("assertion failed: !value.has_rigid_aliases()")
};
};debug_assert!(!value.has_rigid_aliases());
394 EarlyBinder { value, _tcx: PhantomData }
395 }
396}
397
398impl<I: Interner, T> EarlyBinder<I, T> {
399 pub fn as_ref(&self) -> EarlyBinder<I, &T> {
400 EarlyBinder { value: &self.value, _tcx: PhantomData }
401 }
402
403 pub fn map_bound_ref<F, U>(&self, f: F) -> EarlyBinder<I, U>
404 where
405 F: FnOnce(&T) -> U,
406 {
407 self.as_ref().map_bound(f)
408 }
409
410 pub fn map_bound<F, U>(self, f: F) -> EarlyBinder<I, U>
411 where
412 F: FnOnce(T) -> U,
413 {
414 let value = f(self.value);
415 EarlyBinder { value, _tcx: PhantomData }
416 }
417
418 pub fn try_map_bound<F, U, E>(self, f: F) -> Result<EarlyBinder<I, U>, E>
419 where
420 F: FnOnce(T) -> Result<U, E>,
421 {
422 let value = f(self.value)?;
423 Ok(EarlyBinder { value, _tcx: PhantomData })
424 }
425
426 pub fn rebind<U>(&self, value: U) -> EarlyBinder<I, U> {
427 EarlyBinder { value, _tcx: PhantomData }
428 }
429
430 pub fn skip_binder(self) -> T {
447 self.value
448 }
449}
450
451impl<I: Interner> EarlyBinder<I, ty::TraitRef<I>> {
452 pub fn def_id(&self) -> I::TraitId {
453 self.value.def_id
454 }
455}
456
457impl<I: Interner, T> EarlyBinder<I, Option<T>> {
458 pub fn transpose(self) -> Option<EarlyBinder<I, T>> {
459 self.value.map(|value| EarlyBinder { value, _tcx: PhantomData })
460 }
461}
462
463impl<I: Interner, Iter: IntoIterator> EarlyBinder<I, Iter>
464where
465 Iter::Item: TypeFoldable<I>,
466{
467 pub fn iter_instantiated<A>(self, cx: I, args: A) -> IterInstantiated<I, Iter, A>
468 where
469 A: SliceLike<Item = I::GenericArg>,
470 {
471 IterInstantiated { it: self.value.into_iter(), cx, args }
472 }
473
474 pub fn iter_identity(self) -> impl Iterator<Item = Unnormalized<I, Iter::Item>> {
477 self.value.into_iter().map(Unnormalized::new)
478 }
479}
480
481pub struct IterInstantiated<I: Interner, Iter: IntoIterator, A> {
482 it: Iter::IntoIter,
483 cx: I,
484 args: A,
485}
486
487impl<I: Interner, Iter: IntoIterator, A> Iterator for IterInstantiated<I, Iter, A>
488where
489 Iter::Item: TypeFoldable<I>,
490 A: SliceLike<Item = I::GenericArg>,
491{
492 type Item = Unnormalized<I, Iter::Item>;
493
494 fn next(&mut self) -> Option<Self::Item> {
495 Some(
496 EarlyBinder { value: self.it.next()?, _tcx: PhantomData }
497 .instantiate(self.cx, self.args),
498 )
499 }
500
501 fn size_hint(&self) -> (usize, Option<usize>) {
502 self.it.size_hint()
503 }
504}
505
506impl<I: Interner, Iter: IntoIterator, A> DoubleEndedIterator for IterInstantiated<I, Iter, A>
507where
508 Iter::IntoIter: DoubleEndedIterator,
509 Iter::Item: TypeFoldable<I>,
510 A: SliceLike<Item = I::GenericArg>,
511{
512 fn next_back(&mut self) -> Option<Self::Item> {
513 Some(
514 EarlyBinder { value: self.it.next_back()?, _tcx: PhantomData }
515 .instantiate(self.cx, self.args),
516 )
517 }
518}
519
520impl<I: Interner, Iter: IntoIterator, A> ExactSizeIterator for IterInstantiated<I, Iter, A>
521where
522 Iter::IntoIter: ExactSizeIterator,
523 Iter::Item: TypeFoldable<I>,
524 A: SliceLike<Item = I::GenericArg>,
525{
526}
527
528impl<'s, I: Interner, Iter: IntoIterator> EarlyBinder<I, Iter>
529where
530 Iter::Item: Deref,
531 <Iter::Item as Deref>::Target: Copy + TypeFoldable<I>,
532{
533 pub fn iter_instantiated_copied(
534 self,
535 cx: I,
536 args: &'s [I::GenericArg],
537 ) -> IterInstantiatedCopied<'s, I, Iter> {
538 IterInstantiatedCopied { it: self.value.into_iter(), cx, args }
539 }
540
541 pub fn iter_identity_copied(self) -> IterIdentityCopied<I, Iter> {
544 IterIdentityCopied { it: self.value.into_iter(), _tcx: PhantomData }
545 }
546}
547
548pub struct IterInstantiatedCopied<'a, I: Interner, Iter: IntoIterator> {
549 it: Iter::IntoIter,
550 cx: I,
551 args: &'a [I::GenericArg],
552}
553
554impl<'a, I: Interner, Iter: IntoIterator<IntoIter: Clone>> Clone
555 for IterInstantiatedCopied<'a, I, Iter>
556{
557 fn clone(&self) -> IterInstantiatedCopied<'a, I, Iter> {
558 IterInstantiatedCopied { it: self.it.clone(), cx: self.cx, args: self.args }
559 }
560}
561
562impl<I: Interner, Iter: IntoIterator> Iterator for IterInstantiatedCopied<'_, I, Iter>
563where
564 Iter::Item: Deref,
565 <Iter::Item as Deref>::Target: Copy + TypeFoldable<I>,
566{
567 type Item = Unnormalized<I, <Iter::Item as Deref>::Target>;
568
569 fn next(&mut self) -> Option<Self::Item> {
570 self.it.next().map(|value| {
571 EarlyBinder { value: *value, _tcx: PhantomData }.instantiate(self.cx, self.args)
572 })
573 }
574
575 fn size_hint(&self) -> (usize, Option<usize>) {
576 self.it.size_hint()
577 }
578}
579
580impl<I: Interner, Iter: IntoIterator> DoubleEndedIterator for IterInstantiatedCopied<'_, I, Iter>
581where
582 Iter::IntoIter: DoubleEndedIterator,
583 Iter::Item: Deref,
584 <Iter::Item as Deref>::Target: Copy + TypeFoldable<I>,
585{
586 fn next_back(&mut self) -> Option<Self::Item> {
587 self.it.next_back().map(|value| {
588 EarlyBinder { value: *value, _tcx: PhantomData }.instantiate(self.cx, self.args)
589 })
590 }
591}
592
593impl<I: Interner, Iter: IntoIterator> ExactSizeIterator for IterInstantiatedCopied<'_, I, Iter>
594where
595 Iter::IntoIter: ExactSizeIterator,
596 Iter::Item: Deref,
597 <Iter::Item as Deref>::Target: Copy + TypeFoldable<I>,
598{
599}
600
601pub struct IterIdentityCopied<I: Interner, Iter: IntoIterator> {
602 it: Iter::IntoIter,
603 _tcx: PhantomData<fn() -> I>,
604}
605
606impl<I: Interner, Iter: IntoIterator<IntoIter: Clone>> Clone for IterIdentityCopied<I, Iter> {
607 fn clone(&self) -> IterIdentityCopied<I, Iter> {
608 IterIdentityCopied { it: self.it.clone(), _tcx: self._tcx }
609 }
610}
611
612impl<I: Interner, Iter: IntoIterator> Iterator for IterIdentityCopied<I, Iter>
613where
614 Iter::Item: Deref,
615 <Iter::Item as Deref>::Target: Copy,
616{
617 type Item = Unnormalized<I, <Iter::Item as Deref>::Target>;
618
619 fn next(&mut self) -> Option<Self::Item> {
620 self.it.next().map(|i| Unnormalized::new(*i))
621 }
622
623 fn size_hint(&self) -> (usize, Option<usize>) {
624 self.it.size_hint()
625 }
626}
627
628impl<I: Interner, Iter: IntoIterator> DoubleEndedIterator for IterIdentityCopied<I, Iter>
629where
630 Iter::IntoIter: DoubleEndedIterator,
631 Iter::Item: Deref,
632 <Iter::Item as Deref>::Target: Copy,
633{
634 fn next_back(&mut self) -> Option<Self::Item> {
635 self.it.next_back().map(|i| Unnormalized::new(*i))
636 }
637}
638
639impl<I: Interner, Iter: IntoIterator> ExactSizeIterator for IterIdentityCopied<I, Iter>
640where
641 Iter::IntoIter: ExactSizeIterator,
642 Iter::Item: Deref,
643 <Iter::Item as Deref>::Target: Copy,
644{
645}
646pub struct EarlyBinderIter<I, T> {
647 t: T,
648 _tcx: PhantomData<I>,
649}
650
651impl<I: Interner, T: IntoIterator> EarlyBinder<I, T> {
652 pub fn transpose_iter(self) -> EarlyBinderIter<I, T::IntoIter> {
653 EarlyBinderIter { t: self.value.into_iter(), _tcx: PhantomData }
654 }
655}
656
657impl<I: Interner, T: Iterator> Iterator for EarlyBinderIter<I, T> {
658 type Item = EarlyBinder<I, T::Item>;
659
660 fn next(&mut self) -> Option<Self::Item> {
661 self.t.next().map(|value| EarlyBinder { value, _tcx: PhantomData })
662 }
663
664 fn size_hint(&self) -> (usize, Option<usize>) {
665 self.t.size_hint()
666 }
667}
668
669impl<I: Interner, T: TypeFoldable<I>> ty::EarlyBinder<I, T> {
670 pub fn instantiate<A>(self, cx: I, args: A) -> Unnormalized<I, T>
671 where
672 A: SliceLike<Item = I::GenericArg>,
673 {
674 if args.is_empty() {
678 if !!self.value.has_param() {
{
::core::panicking::panic_fmt(format_args!("{0:?} has parameters, but no args were provided in instantiate",
self.value));
}
};assert!(
679 !self.value.has_param(),
680 "{:?} has parameters, but no args were provided in instantiate",
681 self.value,
682 );
683 return Unnormalized::new(self.value);
684 }
685 let mut folder = ArgFolder { cx, args: args.as_slice(), binders_passed: 0 };
686 Unnormalized::new(self.value.fold_with(&mut folder))
687 }
688
689 pub fn instantiate_identity(self) -> Unnormalized<I, T> {
698 Unnormalized::new(self.value)
707 }
708
709 pub fn no_bound_vars(self) -> Option<T> {
711 if !self.value.has_param() { Some(self.value) } else { None }
712 }
713}
714
715struct ArgFolder<'a, I: Interner> {
719 cx: I,
720 args: &'a [I::GenericArg],
721
722 binders_passed: u32,
724}
725
726impl<'a, I: Interner> TypeFolder<I> for ArgFolder<'a, I> {
727 #[inline]
728 fn cx(&self) -> I {
729 self.cx
730 }
731
732 fn fold_binder<T: TypeFoldable<I>>(&mut self, t: ty::Binder<I, T>) -> ty::Binder<I, T> {
733 self.binders_passed += 1;
734 let t = t.super_fold_with(self);
735 self.binders_passed -= 1;
736 t
737 }
738
739 fn fold_region(&mut self, r: I::Region) -> I::Region {
740 match r.kind() {
746 ty::ReEarlyParam(data) => {
747 let rk = self.args.get(data.index() as usize).map(|arg| arg.kind());
748 match rk {
749 Some(ty::GenericArgKind::Lifetime(lt)) => self.shift_region_through_binders(lt),
750 Some(other) => self.region_param_expected(data, r, other),
751 None => self.region_param_out_of_range(data, r),
752 }
753 }
754 ty::ReBound(..)
755 | ty::ReLateParam(_)
756 | ty::ReStatic
757 | ty::RePlaceholder(_)
758 | ty::ReErased
759 | ty::ReError(_) => r,
760 ty::ReVar(_) => { ::core::panicking::panic_fmt(format_args!("unexpected region: {0:?}", r)); }panic!("unexpected region: {r:?}"),
761 }
762 }
763
764 fn fold_ty(&mut self, t: I::Ty) -> I::Ty {
765 if !t.has_param() {
766 return t;
767 }
768
769 match t.kind() {
770 ty::Param(p) => self.ty_for_param(p, t),
771 _ => t.super_fold_with(self),
772 }
773 }
774
775 fn fold_const(&mut self, c: I::Const) -> I::Const {
776 if let ty::ConstKind::Param(p) = c.kind() {
777 self.const_for_param(p, c)
778 } else {
779 c.super_fold_with(self)
780 }
781 }
782
783 fn fold_predicate(&mut self, p: I::Predicate) -> I::Predicate {
784 if p.has_param() { p.super_fold_with(self) } else { p }
785 }
786
787 fn fold_clauses(&mut self, c: I::Clauses) -> I::Clauses {
788 if c.has_param() { c.super_fold_with(self) } else { c }
789 }
790}
791
792impl<'a, I: Interner> ArgFolder<'a, I> {
793 fn ty_for_param(&self, p: I::ParamTy, source_ty: I::Ty) -> I::Ty {
794 let opt_ty = self.args.get(p.index() as usize).map(|arg| arg.kind());
796 let ty = match opt_ty {
797 Some(ty::GenericArgKind::Type(ty)) => ty,
798 Some(kind) => self.type_param_expected(p, source_ty, kind),
799 None => self.type_param_out_of_range(p, source_ty),
800 };
801
802 self.shift_vars_through_binders(ty)
803 }
804
805 #[cold]
806 #[inline(never)]
807 fn type_param_expected(&self, p: I::ParamTy, ty: I::Ty, kind: ty::GenericArgKind<I>) -> ! {
808 {
::core::panicking::panic_fmt(format_args!("expected type for `{0:?}` ({1:?}/{2}) but found {3:?} when instantiating, args={4:?}",
p, ty, p.index(), kind, self.args));
}panic!(
809 "expected type for `{:?}` ({:?}/{}) but found {:?} when instantiating, args={:?}",
810 p,
811 ty,
812 p.index(),
813 kind,
814 self.args,
815 )
816 }
817
818 #[cold]
819 #[inline(never)]
820 fn type_param_out_of_range(&self, p: I::ParamTy, ty: I::Ty) -> ! {
821 {
::core::panicking::panic_fmt(format_args!("type parameter `{0:?}` ({1:?}/{2}) out of range when instantiating, args={3:?}",
p, ty, p.index(), self.args));
}panic!(
822 "type parameter `{:?}` ({:?}/{}) out of range when instantiating, args={:?}",
823 p,
824 ty,
825 p.index(),
826 self.args,
827 )
828 }
829
830 fn const_for_param(&self, p: I::ParamConst, source_ct: I::Const) -> I::Const {
831 let opt_ct = self.args.get(p.index() as usize).map(|arg| arg.kind());
833 let ct = match opt_ct {
834 Some(ty::GenericArgKind::Const(ct)) => ct,
835 Some(kind) => self.const_param_expected(p, source_ct, kind),
836 None => self.const_param_out_of_range(p, source_ct),
837 };
838
839 self.shift_vars_through_binders(ct)
840 }
841
842 #[cold]
843 #[inline(never)]
844 fn const_param_expected(
845 &self,
846 p: I::ParamConst,
847 ct: I::Const,
848 kind: ty::GenericArgKind<I>,
849 ) -> ! {
850 {
::core::panicking::panic_fmt(format_args!("expected const for `{0:?}` ({1:?}/{2}) but found {3:?} when instantiating args={4:?}",
p, ct, p.index(), kind, self.args));
}panic!(
851 "expected const for `{:?}` ({:?}/{}) but found {:?} when instantiating args={:?}",
852 p,
853 ct,
854 p.index(),
855 kind,
856 self.args,
857 )
858 }
859
860 #[cold]
861 #[inline(never)]
862 fn const_param_out_of_range(&self, p: I::ParamConst, ct: I::Const) -> ! {
863 {
::core::panicking::panic_fmt(format_args!("const parameter `{0:?}` ({1:?}/{2}) out of range when instantiating args={3:?}",
p, ct, p.index(), self.args));
}panic!(
864 "const parameter `{:?}` ({:?}/{}) out of range when instantiating args={:?}",
865 p,
866 ct,
867 p.index(),
868 self.args,
869 )
870 }
871
872 #[cold]
873 #[inline(never)]
874 fn region_param_expected(
875 &self,
876 ebr: I::EarlyParamRegion,
877 r: I::Region,
878 kind: ty::GenericArgKind<I>,
879 ) -> ! {
880 {
::core::panicking::panic_fmt(format_args!("expected region for `{0:?}` ({1:?}/{2}) but found {3:?} when instantiating args={4:?}",
ebr, r, ebr.index(), kind, self.args));
}panic!(
881 "expected region for `{:?}` ({:?}/{}) but found {:?} when instantiating args={:?}",
882 ebr,
883 r,
884 ebr.index(),
885 kind,
886 self.args,
887 )
888 }
889
890 #[cold]
891 #[inline(never)]
892 fn region_param_out_of_range(&self, ebr: I::EarlyParamRegion, r: I::Region) -> ! {
893 {
::core::panicking::panic_fmt(format_args!("region parameter `{0:?}` ({1:?}/{2}) out of range when instantiating args={3:?}",
ebr, r, ebr.index(), self.args));
}panic!(
894 "region parameter `{:?}` ({:?}/{}) out of range when instantiating args={:?}",
895 ebr,
896 r,
897 ebr.index(),
898 self.args,
899 )
900 }
901
902 x;#[instrument(level = "trace", skip(self), fields(binders_passed = self.binders_passed), ret)]
945 fn shift_vars_through_binders<T: TypeFoldable<I>>(&self, val: T) -> T {
946 if self.binders_passed == 0 || !val.has_escaping_bound_vars() {
947 val
948 } else {
949 ty::shift_vars(self.cx, val, self.binders_passed)
950 }
951 }
952
953 fn shift_region_through_binders(&self, region: I::Region) -> I::Region {
954 if self.binders_passed == 0 || !region.has_escaping_bound_vars() {
955 region
956 } else {
957 ty::shift_region(self.cx, region, self.binders_passed)
958 }
959 }
960}
961
962#[derive(#[automatically_derived]
impl ::core::clone::Clone for BoundVarIndexKind {
#[inline]
fn clone(&self) -> BoundVarIndexKind {
let _: ::core::clone::AssertParamIsClone<DebruijnIndex>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BoundVarIndexKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for BoundVarIndexKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
BoundVarIndexKind::Bound(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Bound",
&__self_0),
BoundVarIndexKind::Canonical =>
::core::fmt::Formatter::write_str(f, "Canonical"),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for BoundVarIndexKind {
#[inline]
fn eq(&self, other: &BoundVarIndexKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(BoundVarIndexKind::Bound(__self_0),
BoundVarIndexKind::Bound(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BoundVarIndexKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<DebruijnIndex>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for BoundVarIndexKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
BoundVarIndexKind::Bound(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash)]
982#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<__E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for BoundVarIndexKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
BoundVarIndexKind::Bound(ref __binding_0) => { 0usize }
BoundVarIndexKind::Canonical => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
BoundVarIndexKind::Bound(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
BoundVarIndexKind::Canonical => {}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<__D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for BoundVarIndexKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
BoundVarIndexKind::Bound(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => { BoundVarIndexKind::Canonical }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundVarIndexKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable_NoContext, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
BoundVarIndexKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
BoundVarIndexKind::Bound(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
BoundVarIndexKind::Canonical => {}
}
}
}
};StableHash))]
983#[derive(const _: () =
{
impl<I> ::rustc_type_ir::TypeVisitable<I> for BoundVarIndexKind where
I: Interner {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
BoundVarIndexKind::Bound(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);
}
}
}
}
BoundVarIndexKind::Canonical => {}
}
<__V::Result as ::rustc_type_ir::VisitorResult>::output()
}
}
};TypeVisitable_Generic, GenericTypeVisitable, const _: () =
{
impl<I> ::rustc_type_ir::TypeFoldable<I> for BoundVarIndexKind where
I: Interner {
fn try_fold_with<__F: ::rustc_type_ir::FallibleTypeFolder<I>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
BoundVarIndexKind::Bound(__binding_0) => {
BoundVarIndexKind::Bound(::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
BoundVarIndexKind::Canonical => {
BoundVarIndexKind::Canonical
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
BoundVarIndexKind::Bound(__binding_0) => {
BoundVarIndexKind::Bound(::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder))
}
BoundVarIndexKind::Canonical => {
BoundVarIndexKind::Canonical
}
}
}
}
};TypeFoldable_Generic)]
984pub enum BoundVarIndexKind {
985 Bound(DebruijnIndex),
986 Canonical,
987}
988
989#[automatically_derived]
impl<I: Interner, T> ::core::hash::Hash for Placeholder<I, T> where
I: Interner, T: ::core::hash::Hash {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
Placeholder {
universe: ref __field_universe,
bound: ref __field_bound,
_tcx: ref __field__tcx } => {
::core::hash::Hash::hash(__field_universe, __state);
::core::hash::Hash::hash(__field_bound, __state);
::core::hash::Hash::hash(__field__tcx, __state);
}
}
}
}#[derive_where(Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash; I: Interner, T)]
993#[derive(const _: () =
{
impl<I: Interner, T> ::rustc_type_ir::TypeVisitable<I> for
Placeholder<I, T> where I: Interner,
T: ::rustc_type_ir::TypeVisitable<I> {
fn visit_with<__V: ::rustc_type_ir::TypeVisitor<I>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
Placeholder {
universe: ref __binding_0, bound: 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, T> ::rustc_type_ir::TypeFoldable<I> for
Placeholder<I, T> where I: Interner,
T: ::rustc_type_ir::TypeFoldable<I>,
T: ::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 {
Placeholder {
universe: __binding_0, bound: __binding_1, _tcx: __binding_2
} => {
Placeholder {
universe: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
bound: ::rustc_type_ir::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
_tcx: __binding_2,
}
}
})
}
fn fold_with<__F: ::rustc_type_ir::TypeFolder<I>>(self,
__folder: &mut __F) -> Self {
match self {
Placeholder {
universe: __binding_0, bound: __binding_1, _tcx: __binding_2
} => {
Placeholder {
universe: ::rustc_type_ir::TypeFoldable::fold_with(__binding_0,
__folder),
bound: ::rustc_type_ir::TypeFoldable::fold_with(__binding_1,
__folder),
_tcx: __binding_2,
}
}
}
}
}
};TypeFoldable_Generic, GenericTypeVisitable, const _: () =
{
impl<I: Interner, T, J> ::rustc_type_ir::lift::Lift<J> for
Placeholder<I, T> where J: Interner,
I: ::rustc_type_ir::LiftInto<J>, T: ::rustc_type_ir::lift::Lift<J>
{
type Lifted =
Placeholder<J, <T as ::rustc_type_ir::lift::Lift<J>>::Lifted>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
Placeholder {
universe: __binding_0, bound: __binding_1, _tcx: __binding_2
} => {
Placeholder {
universe: __binding_0,
bound: __binding_1.lift_to_interner(interner),
_tcx: PhantomData,
}
}
}
}
}
};Lift_Generic)]
994#[cfg_attr(
995 feature = "nightly",
996 derive(const _: () =
{
impl<I: Interner, T, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for Placeholder<I, T> where
T: ::rustc_serialize::Encodable<__E>,
PhantomData<fn() -> I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
Placeholder {
universe: ref __binding_0,
bound: ref __binding_1,
_tcx: ref __binding_2 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, T, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for Placeholder<I, T> where
T: ::rustc_serialize::Decodable<__D>,
PhantomData<fn() -> I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
Placeholder {
universe: ::rustc_serialize::Decodable::decode(__decoder),
bound: ::rustc_serialize::Decodable::decode(__decoder),
_tcx: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner, T> ::rustc_data_structures::stable_hash::StableHash
for Placeholder<I, T> where
T: ::rustc_data_structures::stable_hash::StableHash,
PhantomData<fn()
-> 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 {
Placeholder {
universe: ref __binding_0,
bound: ref __binding_1,
_tcx: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
997)]
998pub struct Placeholder<I: Interner, T> {
999 #[lift(identity)]
1000 pub universe: UniverseIndex,
1001 pub bound: T,
1002 #[type_foldable(identity)]
1003 #[type_visitable(ignore)]
1004 _tcx: PhantomData<fn() -> I>,
1005}
1006
1007impl<I: Interner, T: fmt::Debug> fmt::Debug for ty::Placeholder<I, T> {
1008 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1009 if self.universe == ty::UniverseIndex::ROOT {
1010 f.write_fmt(format_args!("!{0:?}", self.bound))write!(f, "!{:?}", self.bound)
1011 } else {
1012 f.write_fmt(format_args!("!{0}_{1:?}", self.universe.index(), self.bound))write!(f, "!{}_{:?}", self.universe.index(), self.bound)
1013 }
1014 }
1015}
1016
1017#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for BoundRegionKind<I> where I: Interner
{
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
BoundRegionKind::Anon => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
BoundRegionKind::NamedForPrinting(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
BoundRegionKind::Named(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
BoundRegionKind::ClosureEnv => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Eq, Hash; I: Interner)]
1018#[derive(const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
BoundRegionKind<I> where J: Interner,
I: ::rustc_type_ir::LiftInto<J> {
type Lifted = BoundRegionKind<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
BoundRegionKind::Anon => { BoundRegionKind::Anon }
BoundRegionKind::NamedForPrinting(__binding_0) => {
BoundRegionKind::NamedForPrinting(__binding_0.lift_to_interner(interner))
}
BoundRegionKind::Named(__binding_0) => {
BoundRegionKind::Named(__binding_0.lift_to_interner(interner))
}
BoundRegionKind::ClosureEnv => {
BoundRegionKind::ClosureEnv
}
}
}
}
};Lift_Generic, GenericTypeVisitable)]
1019#[cfg_attr(
1020 feature = "nightly",
1021 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for BoundRegionKind<I> where
I::Symbol: ::rustc_serialize::Encodable<__E>,
I::DefId: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
BoundRegionKind::Anon => { 0usize }
BoundRegionKind::NamedForPrinting(ref __binding_0) => {
1usize
}
BoundRegionKind::Named(ref __binding_0) => { 2usize }
BoundRegionKind::ClosureEnv => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
BoundRegionKind::Anon => {}
BoundRegionKind::NamedForPrinting(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
BoundRegionKind::Named(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
BoundRegionKind::ClosureEnv => {}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for BoundRegionKind<I> where
I::Symbol: ::rustc_serialize::Decodable<__D>,
I::DefId: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { BoundRegionKind::Anon }
1usize => {
BoundRegionKind::NamedForPrinting(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
BoundRegionKind::Named(::rustc_serialize::Decodable::decode(__decoder))
}
3usize => { BoundRegionKind::ClosureEnv }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundRegionKind`, expected 0..4, actual {0}",
n));
}
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
BoundRegionKind<I> where
I::Symbol: ::rustc_data_structures::stable_hash::StableHash,
I::DefId: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
BoundRegionKind::Anon => {}
BoundRegionKind::NamedForPrinting(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
BoundRegionKind::Named(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
BoundRegionKind::ClosureEnv => {}
}
}
}
};StableHash_NoContext)
1022)]
1023pub enum BoundRegionKind<I: Interner> {
1024 Anon,
1026
1027 NamedForPrinting(I::Symbol),
1031
1032 Named(I::DefId),
1034
1035 ClosureEnv,
1038}
1039
1040impl<I: Interner> fmt::Debug for ty::BoundRegionKind<I> {
1041 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1042 match *self {
1043 ty::BoundRegionKind::Anon => f.write_fmt(format_args!("BrAnon"))write!(f, "BrAnon"),
1044 ty::BoundRegionKind::NamedForPrinting(name) => {
1045 f.write_fmt(format_args!("BrNamedForPrinting({0:?})", name))write!(f, "BrNamedForPrinting({:?})", name)
1046 }
1047 ty::BoundRegionKind::Named(did) => {
1048 f.write_fmt(format_args!("BrNamed({0:?})", did))write!(f, "BrNamed({did:?})")
1049 }
1050 ty::BoundRegionKind::ClosureEnv => f.write_fmt(format_args!("BrEnv"))write!(f, "BrEnv"),
1051 }
1052 }
1053}
1054
1055impl<I: Interner> BoundRegionKind<I> {
1056 pub fn is_named(&self, tcx: I) -> bool {
1057 self.get_name(tcx).is_some()
1058 }
1059
1060 pub fn get_name(&self, tcx: I) -> Option<I::Symbol> {
1061 match *self {
1062 ty::BoundRegionKind::Named(def_id) => {
1063 let name = tcx.item_name(def_id);
1064 if name.is_kw_underscore_lifetime() { None } else { Some(name) }
1065 }
1066 ty::BoundRegionKind::NamedForPrinting(name) => Some(name),
1067 _ => None,
1068 }
1069 }
1070
1071 pub fn get_id(&self) -> Option<I::DefId> {
1072 match *self {
1073 ty::BoundRegionKind::Named(id) => Some(id),
1074 _ => None,
1075 }
1076 }
1077}
1078
1079#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for BoundTyKind<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
BoundTyKind::Anon => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
BoundTyKind::Param(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Eq, Debug, Hash; I: Interner)]
1080#[derive(const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for BoundTyKind<I>
where J: Interner, I: ::rustc_type_ir::LiftInto<J> {
type Lifted = BoundTyKind<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
BoundTyKind::Anon => { BoundTyKind::Anon }
BoundTyKind::Param(__binding_0) => {
BoundTyKind::Param(__binding_0.lift_to_interner(interner))
}
}
}
}
};Lift_Generic, GenericTypeVisitable)]
1081#[cfg_attr(
1082 feature = "nightly",
1083 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for BoundTyKind<I> where
I::DefId: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
BoundTyKind::Anon => { 0usize }
BoundTyKind::Param(ref __binding_0) => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
BoundTyKind::Anon => {}
BoundTyKind::Param(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for BoundTyKind<I> where
I::DefId: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { BoundTyKind::Anon }
1usize => {
BoundTyKind::Param(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundTyKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
BoundTyKind<I> where
I::DefId: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
BoundTyKind::Anon => {}
BoundTyKind::Param(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
1084)]
1085pub enum BoundTyKind<I: Interner> {
1086 Anon,
1087 Param(I::DefId),
1088}
1089
1090#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for BoundVariableKind<I> where
I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
BoundVariableKind::Ty(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
BoundVariableKind::Region(ref __field_0) => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
::core::hash::Hash::hash(__field_0, __state);
}
BoundVariableKind::Const => {
::core::hash::Hash::hash(&::core::mem::discriminant(self),
__state);
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Eq, Debug, Hash; I: Interner)]
1091#[derive(const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for
BoundVariableKind<I> where J: Interner,
I: ::rustc_type_ir::LiftInto<J> {
type Lifted = BoundVariableKind<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
BoundVariableKind::Ty(__binding_0) => {
BoundVariableKind::Ty(__binding_0.lift_to_interner(interner))
}
BoundVariableKind::Region(__binding_0) => {
BoundVariableKind::Region(__binding_0.lift_to_interner(interner))
}
BoundVariableKind::Const => { BoundVariableKind::Const }
}
}
}
};Lift_Generic, GenericTypeVisitable)]
1092#[cfg_attr(
1093 feature = "nightly",
1094 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for BoundVariableKind<I> where
BoundTyKind<I>: ::rustc_serialize::Encodable<__E>,
BoundRegionKind<I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
BoundVariableKind::Ty(ref __binding_0) => { 0usize }
BoundVariableKind::Region(ref __binding_0) => { 1usize }
BoundVariableKind::Const => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
BoundVariableKind::Ty(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
BoundVariableKind::Region(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
BoundVariableKind::Const => {}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for BoundVariableKind<I> where
BoundTyKind<I>: ::rustc_serialize::Decodable<__D>,
BoundRegionKind<I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
BoundVariableKind::Ty(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
BoundVariableKind::Region(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => { BoundVariableKind::Const }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundVariableKind`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
BoundVariableKind<I> where
BoundTyKind<I>: ::rustc_data_structures::stable_hash::StableHash,
BoundRegionKind<I>: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
BoundVariableKind::Ty(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
BoundVariableKind::Region(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
BoundVariableKind::Const => {}
}
}
}
};StableHash_NoContext)
1095)]
1096pub enum BoundVariableKind<I: Interner> {
1097 Ty(BoundTyKind<I>),
1098 Region(BoundRegionKind<I>),
1099 Const,
1100}
1101
1102impl<I: Interner> BoundVariableKind<I> {
1103 pub fn expect_region(self) -> BoundRegionKind<I> {
1104 match self {
1105 BoundVariableKind::Region(lt) => lt,
1106 _ => {
::core::panicking::panic_fmt(format_args!("expected a region, but found another kind"));
}panic!("expected a region, but found another kind"),
1107 }
1108 }
1109
1110 pub fn expect_ty(self) -> BoundTyKind<I> {
1111 match self {
1112 BoundVariableKind::Ty(ty) => ty,
1113 _ => {
::core::panicking::panic_fmt(format_args!("expected a type, but found another kind"));
}panic!("expected a type, but found another kind"),
1114 }
1115 }
1116
1117 pub fn expect_const(self) {
1118 match self {
1119 BoundVariableKind::Const => (),
1120 _ => {
::core::panicking::panic_fmt(format_args!("expected a const, but found another kind"));
}panic!("expected a const, but found another kind"),
1121 }
1122 }
1123}
1124
1125#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for BoundRegion<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
BoundRegion { var: ref __field_var, kind: ref __field_kind } => {
::core::hash::Hash::hash(__field_var, __state);
::core::hash::Hash::hash(__field_kind, __state);
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Eq, Hash; I: Interner)]
1126#[derive(GenericTypeVisitable)]
1127#[cfg_attr(
1128 feature = "nightly",
1129 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for BoundRegion<I> where
BoundRegionKind<I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
BoundRegion { var: ref __binding_0, kind: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
BoundRegion<I> where
BoundRegionKind<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 {
BoundRegion { var: ref __binding_0, kind: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for BoundRegion<I> where
BoundRegionKind<I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
BoundRegion {
var: ::rustc_serialize::Decodable::decode(__decoder),
kind: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext)
1130)]
1131pub struct BoundRegion<I: Interner> {
1132 pub var: ty::BoundVar,
1133 pub kind: BoundRegionKind<I>,
1134}
1135
1136impl<I: Interner> core::fmt::Debug for BoundRegion<I> {
1137 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1138 match self.kind {
1139 BoundRegionKind::Anon => f.write_fmt(format_args!("{0:?}", self.var))write!(f, "{:?}", self.var),
1140 BoundRegionKind::ClosureEnv => f.write_fmt(format_args!("{0:?}.Env", self.var))write!(f, "{:?}.Env", self.var),
1141 BoundRegionKind::Named(def) => {
1142 f.write_fmt(format_args!("{0:?}.Named({1:?})", self.var, def))write!(f, "{:?}.Named({:?})", self.var, def)
1143 }
1144 BoundRegionKind::NamedForPrinting(symbol) => {
1145 f.write_fmt(format_args!("{0:?}.NamedAnon({1:?})", self.var, symbol))write!(f, "{:?}.NamedAnon({:?})", self.var, symbol)
1146 }
1147 }
1148 }
1149}
1150
1151impl<I: Interner> BoundRegion<I> {
1152 pub fn var(self) -> ty::BoundVar {
1153 self.var
1154 }
1155
1156 pub fn assert_eq(self, var: BoundVariableKind<I>) {
1157 {
match (&self.kind, &var.expect_region()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
}assert_eq!(self.kind, var.expect_region())
1158 }
1159}
1160
1161pub type PlaceholderRegion<I> = ty::Placeholder<I, BoundRegion<I>>;
1162
1163impl<I: Interner> PlaceholderRegion<I> {
1164 pub fn universe(self) -> UniverseIndex {
1165 self.universe
1166 }
1167
1168 pub fn var(self) -> ty::BoundVar {
1169 self.bound.var()
1170 }
1171
1172 pub fn with_updated_universe(self, ui: UniverseIndex) -> Self {
1173 Self { universe: ui, bound: self.bound, _tcx: PhantomData }
1174 }
1175
1176 pub fn new(ui: UniverseIndex, bound: BoundRegion<I>) -> Self {
1177 Self { universe: ui, bound, _tcx: PhantomData }
1178 }
1179
1180 pub fn new_anon(ui: UniverseIndex, var: ty::BoundVar) -> Self {
1181 let bound = BoundRegion { var, kind: BoundRegionKind::Anon };
1182 Self { universe: ui, bound, _tcx: PhantomData }
1183 }
1184}
1185
1186#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for BoundTy<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
BoundTy { var: ref __field_var, kind: ref __field_kind } => {
::core::hash::Hash::hash(__field_var, __state);
::core::hash::Hash::hash(__field_kind, __state);
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Eq, Hash; I: Interner)]
1187#[derive(GenericTypeVisitable, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for BoundTy<I>
where J: Interner, I: ::rustc_type_ir::LiftInto<J> {
type Lifted = BoundTy<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
BoundTy { var: __binding_0, kind: __binding_1 } => {
BoundTy {
var: __binding_0,
kind: __binding_1.lift_to_interner(interner),
}
}
}
}
}
};Lift_Generic)]
1188#[cfg_attr(
1189 feature = "nightly",
1190 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for BoundTy<I> where
BoundTyKind<I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
BoundTy { var: ref __binding_0, kind: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for BoundTy<I> where
BoundTyKind<I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
BoundTy {
var: ::rustc_serialize::Decodable::decode(__decoder),
kind: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
BoundTy<I> where
BoundTyKind<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 {
BoundTy { var: ref __binding_0, kind: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
1191)]
1192pub struct BoundTy<I: Interner> {
1193 #[lift(identity)]
1194 pub var: ty::BoundVar,
1195 pub kind: BoundTyKind<I>,
1196}
1197
1198impl<I: Interner> fmt::Debug for ty::BoundTy<I> {
1199 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1200 match self.kind {
1201 ty::BoundTyKind::Anon => f.write_fmt(format_args!("{0:?}", self.var))write!(f, "{:?}", self.var),
1202 ty::BoundTyKind::Param(def_id) => f.write_fmt(format_args!("{0:?}", def_id))write!(f, "{def_id:?}"),
1203 }
1204 }
1205}
1206
1207impl<I: Interner> BoundTy<I> {
1208 pub fn var(self) -> ty::BoundVar {
1209 self.var
1210 }
1211
1212 pub fn assert_eq(self, var: BoundVariableKind<I>) {
1213 {
match (&self.kind, &var.expect_ty()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
}assert_eq!(self.kind, var.expect_ty())
1214 }
1215}
1216
1217pub type PlaceholderType<I> = ty::Placeholder<I, BoundTy<I>>;
1218
1219impl<I: Interner> PlaceholderType<I> {
1220 pub fn universe(self) -> UniverseIndex {
1221 self.universe
1222 }
1223
1224 pub fn var(self) -> ty::BoundVar {
1225 self.bound.var
1226 }
1227
1228 pub fn with_updated_universe(self, ui: UniverseIndex) -> Self {
1229 Self { universe: ui, bound: self.bound, _tcx: PhantomData }
1230 }
1231
1232 pub fn new(ui: UniverseIndex, bound: BoundTy<I>) -> Self {
1233 Self { universe: ui, bound, _tcx: PhantomData }
1234 }
1235
1236 pub fn new_anon(ui: UniverseIndex, var: ty::BoundVar) -> Self {
1237 let bound = BoundTy { var, kind: BoundTyKind::Anon };
1238 Self { universe: ui, bound, _tcx: PhantomData }
1239 }
1240}
1241
1242#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for BoundConst<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
BoundConst { var: ref __field_var, _tcx: ref __field__tcx } => {
::core::hash::Hash::hash(__field_var, __state);
::core::hash::Hash::hash(__field__tcx, __state);
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Debug, Eq, Hash; I: Interner)]
1243#[derive(GenericTypeVisitable)]
1244#[cfg_attr(
1245 feature = "nightly",
1246 derive(const _: () =
{
impl<I: Interner, __E: ::rustc_serialize::Encoder>
::rustc_serialize::Encodable<__E> for BoundConst<I> where
PhantomData<fn() -> I>: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
match *self {
BoundConst { var: ref __binding_0, _tcx: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable_NoContext, const _: () =
{
impl<I: Interner, __D: ::rustc_serialize::Decoder>
::rustc_serialize::Decodable<__D> for BoundConst<I> where
PhantomData<fn() -> I>: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
BoundConst {
var: ::rustc_serialize::Decodable::decode(__decoder),
_tcx: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable_NoContext, const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
BoundConst<I> where
PhantomData<fn()
-> 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 {
BoundConst { var: ref __binding_0, _tcx: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext)
1247)]
1248pub struct BoundConst<I: Interner> {
1249 pub var: ty::BoundVar,
1250 #[derive_where(skip(Debug))]
1251 pub _tcx: PhantomData<fn() -> I>,
1252}
1253
1254impl<I: Interner> BoundConst<I> {
1255 pub fn var(self) -> ty::BoundVar {
1256 self.var
1257 }
1258
1259 pub fn assert_eq(self, var: BoundVariableKind<I>) {
1260 var.expect_const()
1261 }
1262
1263 pub fn new(var: ty::BoundVar) -> Self {
1264 Self { var, _tcx: PhantomData }
1265 }
1266}
1267
1268pub type PlaceholderConst<I> = ty::Placeholder<I, BoundConst<I>>;
1269
1270impl<I: Interner> PlaceholderConst<I> {
1271 pub fn universe(self) -> UniverseIndex {
1272 self.universe
1273 }
1274
1275 pub fn var(self) -> ty::BoundVar {
1276 self.bound.var
1277 }
1278
1279 pub fn with_updated_universe(self, ui: UniverseIndex) -> Self {
1280 Self { universe: ui, bound: self.bound, _tcx: PhantomData }
1281 }
1282
1283 pub fn new(ui: UniverseIndex, bound: BoundConst<I>) -> Self {
1284 Self { universe: ui, bound, _tcx: PhantomData }
1285 }
1286
1287 pub fn new_anon(ui: UniverseIndex, var: ty::BoundVar) -> Self {
1288 let bound = BoundConst::new(var);
1289 Self { universe: ui, bound, _tcx: PhantomData }
1290 }
1291
1292 pub fn find_const_ty_from_env(self, env: I::ParamEnv) -> I::Ty {
1293 let mut candidates = env.caller_bounds().iter().filter_map(|clause| {
1294 match clause.kind().skip_binder() {
1296 ty::ClauseKind::ConstArgHasType(placeholder_ct, ty) => {
1297 if !!(placeholder_ct, ty).has_escaping_bound_vars() {
::core::panicking::panic("assertion failed: !(placeholder_ct, ty).has_escaping_bound_vars()")
};assert!(!(placeholder_ct, ty).has_escaping_bound_vars());
1298
1299 match placeholder_ct.kind() {
1300 ty::ConstKind::Placeholder(placeholder_ct) if placeholder_ct == self => {
1301 Some(ty)
1302 }
1303 _ => None,
1304 }
1305 }
1306 _ => None,
1307 }
1308 });
1309
1310 let ty = candidates.next().unwrap_or_else(|| {
1317 {
::core::panicking::panic_fmt(format_args!("cannot find `{0:?}` in param-env: {1:#?}",
self, env));
};panic!("cannot find `{self:?}` in param-env: {env:#?}");
1318 });
1319 if !candidates.next().is_none() {
{
::core::panicking::panic_fmt(format_args!("did not expect duplicate `ConstParamHasTy` for `{0:?}` in param-env: {1:#?}",
self, env));
}
};assert!(
1320 candidates.next().is_none(),
1321 "did not expect duplicate `ConstParamHasTy` for `{self:?}` in param-env: {env:#?}"
1322 );
1323 ty
1324 }
1325}