@@ -16,7 +16,7 @@ use crate::fold::{FallibleTypeFolder, TypeFoldable, TypeFolder, TypeSuperFoldabl
1616use crate :: inherent:: * ;
1717use crate :: lift:: Lift ;
1818use crate :: visit:: { Flags , TypeSuperVisitable , TypeVisitable , TypeVisitableExt , TypeVisitor } ;
19- use crate :: { self as ty, DebruijnIndex , Interner , UniverseIndex } ;
19+ use crate :: { self as ty, DebruijnIndex , Interner , UniverseIndex , Unnormalized } ;
2020
2121/// `Binder` is a binder for higher-ranked lifetimes or types. It is part of the
2222/// compiler's representation for things like `for<'a> Fn(&'a isize)`
@@ -459,8 +459,8 @@ where
459459
460460 /// Similar to [`instantiate_identity`](EarlyBinder::instantiate_identity),
461461 /// but on an iterator of `TypeFoldable` values.
462- pub fn iter_identity ( self ) -> Iter :: IntoIter {
463- self . value . into_iter ( )
462+ pub fn iter_identity ( self ) -> impl Iterator < Item = Unnormalized < Iter :: Item > > {
463+ self . value . into_iter ( ) . map ( Unnormalized :: new )
464464 }
465465}
466466
@@ -475,7 +475,7 @@ where
475475 Iter :: Item : TypeFoldable < I > ,
476476 A : SliceLike < Item = I :: GenericArg > ,
477477{
478- type Item = Iter :: Item ;
478+ type Item = Unnormalized < Iter :: Item > ;
479479
480480 fn next ( & mut self ) -> Option < Self :: Item > {
481481 Some (
@@ -526,8 +526,8 @@ where
526526
527527 /// Similar to [`instantiate_identity`](EarlyBinder::instantiate_identity),
528528 /// but on an iterator of values that deref to a `TypeFoldable`.
529- pub fn iter_identity_copied ( self ) -> IterIdentityCopied < Iter > {
530- IterIdentityCopied { it : self . value . into_iter ( ) }
529+ pub fn iter_identity_copied ( self ) -> IterIdentityCopied < I , Iter > {
530+ IterIdentityCopied { it : self . value . into_iter ( ) , _tcx : PhantomData }
531531 }
532532}
533533
@@ -542,7 +542,7 @@ where
542542 Iter :: Item : Deref ,
543543 <Iter :: Item as Deref >:: Target : Copy + TypeFoldable < I > ,
544544{
545- type Item = < Iter :: Item as Deref >:: Target ;
545+ type Item = Unnormalized < < Iter :: Item as Deref >:: Target > ;
546546
547547 fn next ( & mut self ) -> Option < Self :: Item > {
548548 self . it . next ( ) . map ( |value| {
@@ -576,38 +576,39 @@ where
576576{
577577}
578578
579- pub struct IterIdentityCopied < Iter : IntoIterator > {
579+ pub struct IterIdentityCopied < I : Interner , Iter : IntoIterator > {
580580 it : Iter :: IntoIter ,
581+ _tcx : PhantomData < fn ( ) -> I > ,
581582}
582583
583- impl < Iter : IntoIterator > Iterator for IterIdentityCopied < Iter >
584+ impl < I : Interner , Iter : IntoIterator > Iterator for IterIdentityCopied < I , Iter >
584585where
585586 Iter :: Item : Deref ,
586587 <Iter :: Item as Deref >:: Target : Copy ,
587588{
588- type Item = < Iter :: Item as Deref >:: Target ;
589+ type Item = Unnormalized < < Iter :: Item as Deref >:: Target > ;
589590
590591 fn next ( & mut self ) -> Option < Self :: Item > {
591- self . it . next ( ) . map ( |i| * i )
592+ self . it . next ( ) . map ( |i| Unnormalized :: new ( * i ) )
592593 }
593594
594595 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
595596 self . it . size_hint ( )
596597 }
597598}
598599
599- impl < Iter : IntoIterator > DoubleEndedIterator for IterIdentityCopied < Iter >
600+ impl < I : Interner , Iter : IntoIterator > DoubleEndedIterator for IterIdentityCopied < I , Iter >
600601where
601602 Iter :: IntoIter : DoubleEndedIterator ,
602603 Iter :: Item : Deref ,
603604 <Iter :: Item as Deref >:: Target : Copy ,
604605{
605606 fn next_back ( & mut self ) -> Option < Self :: Item > {
606- self . it . next_back ( ) . map ( |i| * i )
607+ self . it . next_back ( ) . map ( |i| Unnormalized :: new ( * i ) )
607608 }
608609}
609610
610- impl < Iter : IntoIterator > ExactSizeIterator for IterIdentityCopied < Iter >
611+ impl < I : Interner , Iter : IntoIterator > ExactSizeIterator for IterIdentityCopied < I , Iter >
611612where
612613 Iter :: IntoIter : ExactSizeIterator ,
613614 Iter :: Item : Deref ,
@@ -638,7 +639,7 @@ impl<I: Interner, T: Iterator> Iterator for EarlyBinderIter<I, T> {
638639}
639640
640641impl < I : Interner , T : TypeFoldable < I > > ty:: EarlyBinder < I , T > {
641- pub fn instantiate < A > ( self , cx : I , args : A ) -> T
642+ pub fn instantiate < A > ( self , cx : I , args : A ) -> Unnormalized < T >
642643 where
643644 A : SliceLike < Item = I :: GenericArg > ,
644645 {
@@ -651,10 +652,10 @@ impl<I: Interner, T: TypeFoldable<I>> ty::EarlyBinder<I, T> {
651652 "{:?} has parameters, but no args were provided in instantiate" ,
652653 self . value,
653654 ) ;
654- return self . value ;
655+ return Unnormalized :: new ( self . value ) ;
655656 }
656657 let mut folder = ArgFolder { cx, args : args. as_slice ( ) , binders_passed : 0 } ;
657- self . value . fold_with ( & mut folder)
658+ Unnormalized :: new ( self . value . fold_with ( & mut folder) )
658659 }
659660
660661 /// Makes the identity replacement `T0 => T0, ..., TN => TN`.
@@ -665,8 +666,8 @@ impl<I: Interner, T: TypeFoldable<I>> ty::EarlyBinder<I, T> {
665666 /// - Outside of `foo`, `T` is bound (represented by the presence of `EarlyBinder`).
666667 /// - Inside of the body of `foo`, we treat `T` as a placeholder by calling
667668 /// `instantiate_identity` to discharge the `EarlyBinder`.
668- pub fn instantiate_identity ( self ) -> T {
669- self . value
669+ pub fn instantiate_identity ( self ) -> Unnormalized < T > {
670+ Unnormalized :: new ( self . value )
670671 }
671672
672673 /// Returns the inner value, but only if it contains no bound vars.
0 commit comments