@@ -296,10 +296,7 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
296296 Region :: new_anon_bound ( self . interner ( ) , self . binder_index , var)
297297 }
298298
299- fn fold_ty ( & mut self , t : I :: Ty ) -> I :: Ty
300- where
301- I :: Ty : TypeSuperFoldable < I > ,
302- {
299+ fn fold_ty ( & mut self , t : I :: Ty ) -> I :: Ty {
303300 let kind = match t. kind ( ) {
304301 ty:: Infer ( i) => match i {
305302 ty:: TyVar ( vid) => {
@@ -378,47 +375,48 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
378375 Ty :: new_anon_bound ( self . interner ( ) , self . binder_index , var)
379376 }
380377
381- fn fold_const ( & mut self , c : I :: Const ) -> I :: Const
382- where
383- I :: Const : TypeSuperFoldable < I > ,
384- {
378+ fn fold_const ( & mut self , c : I :: Const ) -> I :: Const {
379+ // We could canonicalize all consts with static types, but the only ones we
380+ // *really* need to worry about are the ones that we end up putting into `CanonicalVarKind`
381+ // since canonical vars can't reference other canonical vars.
382+ let ty = c
383+ . ty ( )
384+ . fold_with ( & mut RegionsToStatic { interner : self . interner ( ) , binder : ty:: INNERMOST } ) ;
385385 let kind = match c. kind ( ) {
386- ty:: ConstKind :: Infer ( i) => {
387- // FIXME: we should fold the ty too eventually
388- match i {
389- ty:: InferConst :: Var ( vid) => {
390- assert_eq ! (
391- self . infcx. root_ct_var( vid) ,
392- vid,
393- "region vid should have been resolved fully before canonicalization"
394- ) ;
395- assert_eq ! (
396- self . infcx. probe_ct_var( vid) ,
397- None ,
398- "region vid should have been resolved fully before canonicalization"
399- ) ;
400- CanonicalVarKind :: Const ( self . infcx . universe_of_ct ( vid) . unwrap ( ) , c. ty ( ) )
401- }
402- ty:: InferConst :: EffectVar ( _) => CanonicalVarKind :: Effect ,
403- ty:: InferConst :: Fresh ( _) => todo ! ( ) ,
386+ ty:: ConstKind :: Infer ( i) => match i {
387+ ty:: InferConst :: Var ( vid) => {
388+ assert_eq ! (
389+ self . infcx. root_ct_var( vid) ,
390+ vid,
391+ "region vid should have been resolved fully before canonicalization"
392+ ) ;
393+ assert_eq ! (
394+ self . infcx. probe_ct_var( vid) ,
395+ None ,
396+ "region vid should have been resolved fully before canonicalization"
397+ ) ;
398+ CanonicalVarKind :: Const ( self . infcx . universe_of_ct ( vid) . unwrap ( ) , ty)
404399 }
405- }
400+ ty:: InferConst :: EffectVar ( _) => CanonicalVarKind :: Effect ,
401+ ty:: InferConst :: Fresh ( _) => todo ! ( ) ,
402+ } ,
406403 ty:: ConstKind :: Placeholder ( placeholder) => match self . canonicalize_mode {
407404 CanonicalizeMode :: Input => CanonicalVarKind :: PlaceholderConst (
408405 PlaceholderLike :: new ( placeholder. universe ( ) , self . variables . len ( ) . into ( ) ) ,
409- c . ty ( ) ,
406+ ty ,
410407 ) ,
411408 CanonicalizeMode :: Response { .. } => {
412- CanonicalVarKind :: PlaceholderConst ( placeholder, c . ty ( ) )
409+ CanonicalVarKind :: PlaceholderConst ( placeholder, ty )
413410 }
414411 } ,
415412 ty:: ConstKind :: Param ( _) => match self . canonicalize_mode {
416413 CanonicalizeMode :: Input => CanonicalVarKind :: PlaceholderConst (
417414 PlaceholderLike :: new ( ty:: UniverseIndex :: ROOT , self . variables . len ( ) . into ( ) ) ,
418- c . ty ( ) ,
415+ ty ,
419416 ) ,
420417 CanonicalizeMode :: Response { .. } => panic ! ( "param ty in response: {c:?}" ) ,
421418 } ,
419+ // FIXME: See comment above -- we could fold the region separately or something.
422420 ty:: ConstKind :: Bound ( _, _)
423421 | ty:: ConstKind :: Unevaluated ( _)
424422 | ty:: ConstKind :: Value ( _)
@@ -435,6 +433,35 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
435433 } ) ,
436434 ) ;
437435
438- Const :: new_anon_bound ( self . interner ( ) , self . binder_index , var, c. ty ( ) )
436+ Const :: new_anon_bound ( self . interner ( ) , self . binder_index , var, ty)
437+ }
438+ }
439+
440+ struct RegionsToStatic < I > {
441+ interner : I ,
442+ binder : ty:: DebruijnIndex ,
443+ }
444+
445+ impl < I : Interner > TypeFolder < I > for RegionsToStatic < I > {
446+ fn interner ( & self ) -> I {
447+ self . interner
448+ }
449+
450+ fn fold_binder < T > ( & mut self , t : I :: Binder < T > ) -> I :: Binder < T >
451+ where
452+ T : TypeFoldable < I > ,
453+ I :: Binder < T > : TypeSuperFoldable < I > ,
454+ {
455+ self . binder . shift_in ( 1 ) ;
456+ let t = t. fold_with ( self ) ;
457+ self . binder . shift_out ( 1 ) ;
458+ t
459+ }
460+
461+ fn fold_region ( & mut self , r : I :: Region ) -> I :: Region {
462+ match r. kind ( ) {
463+ ty:: ReBound ( db, _) if self . binder > db => r,
464+ _ => Region :: new_static ( self . interner ( ) ) ,
465+ }
439466 }
440467}
0 commit comments