@@ -296,10 +296,7 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
296
296
Region :: new_anon_bound ( self . interner ( ) , self . binder_index , var)
297
297
}
298
298
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 {
303
300
let kind = match t. kind ( ) {
304
301
ty:: Infer ( i) => match i {
305
302
ty:: TyVar ( vid) => {
@@ -378,47 +375,48 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
378
375
Ty :: new_anon_bound ( self . interner ( ) , self . binder_index , var)
379
376
}
380
377
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 } ) ;
385
385
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)
404
399
}
405
- }
400
+ ty:: InferConst :: EffectVar ( _) => CanonicalVarKind :: Effect ,
401
+ ty:: InferConst :: Fresh ( _) => todo ! ( ) ,
402
+ } ,
406
403
ty:: ConstKind :: Placeholder ( placeholder) => match self . canonicalize_mode {
407
404
CanonicalizeMode :: Input => CanonicalVarKind :: PlaceholderConst (
408
405
PlaceholderLike :: new ( placeholder. universe ( ) , self . variables . len ( ) . into ( ) ) ,
409
- c . ty ( ) ,
406
+ ty ,
410
407
) ,
411
408
CanonicalizeMode :: Response { .. } => {
412
- CanonicalVarKind :: PlaceholderConst ( placeholder, c . ty ( ) )
409
+ CanonicalVarKind :: PlaceholderConst ( placeholder, ty )
413
410
}
414
411
} ,
415
412
ty:: ConstKind :: Param ( _) => match self . canonicalize_mode {
416
413
CanonicalizeMode :: Input => CanonicalVarKind :: PlaceholderConst (
417
414
PlaceholderLike :: new ( ty:: UniverseIndex :: ROOT , self . variables . len ( ) . into ( ) ) ,
418
- c . ty ( ) ,
415
+ ty ,
419
416
) ,
420
417
CanonicalizeMode :: Response { .. } => panic ! ( "param ty in response: {c:?}" ) ,
421
418
} ,
419
+ // FIXME: See comment above -- we could fold the region separately or something.
422
420
ty:: ConstKind :: Bound ( _, _)
423
421
| ty:: ConstKind :: Unevaluated ( _)
424
422
| ty:: ConstKind :: Value ( _)
@@ -435,6 +433,35 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
435
433
} ) ,
436
434
) ;
437
435
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
+ }
439
466
}
440
467
}
0 commit comments