@@ -261,12 +261,24 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'_, 'tcx> {
261
261
self . interner ( ) . mk_re_late_bound ( self . binder_index , br)
262
262
}
263
263
264
- fn fold_ty ( & mut self , t : Ty < ' tcx > ) -> Ty < ' tcx > {
264
+ fn fold_ty ( & mut self , mut t : Ty < ' tcx > ) -> Ty < ' tcx > {
265
265
let kind = match * t. kind ( ) {
266
- ty:: Infer ( ty:: TyVar ( vid) ) => match self . infcx . probe_ty_var ( vid) {
267
- Ok ( t) => return self . fold_ty ( t) ,
268
- Err ( ui) => CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( ui) ) ,
269
- } ,
266
+ ty:: Infer ( ty:: TyVar ( mut vid) ) => {
267
+ // We need to canonicalize the *root* of our ty var.
268
+ // This is so that our canonical response correctly reflects
269
+ // any equated inference vars correctly!
270
+
271
+ let root_vid = self . infcx . root_var ( vid) ;
272
+ if root_vid != vid {
273
+ t = self . infcx . tcx . mk_ty_var ( root_vid) ;
274
+ vid = root_vid;
275
+ }
276
+
277
+ match self . infcx . probe_ty_var ( vid) {
278
+ Ok ( t) => return self . fold_ty ( t) ,
279
+ Err ( ui) => CanonicalVarKind :: Ty ( CanonicalTyVarKind :: General ( ui) ) ,
280
+ }
281
+ }
270
282
ty:: Infer ( ty:: IntVar ( _) ) => {
271
283
let nt = self . infcx . shallow_resolve ( t) ;
272
284
if nt != t {
@@ -338,13 +350,23 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'_, 'tcx> {
338
350
self . interner ( ) . mk_bound ( self . binder_index , bt)
339
351
}
340
352
341
- fn fold_const ( & mut self , c : ty:: Const < ' tcx > ) -> ty:: Const < ' tcx > {
353
+ fn fold_const ( & mut self , mut c : ty:: Const < ' tcx > ) -> ty:: Const < ' tcx > {
342
354
let kind = match c. kind ( ) {
343
- ty:: ConstKind :: Infer ( ty:: InferConst :: Var ( vid) ) => match self . infcx . probe_const_var ( vid)
344
- {
345
- Ok ( c) => return self . fold_const ( c) ,
346
- Err ( universe) => CanonicalVarKind :: Const ( universe, c. ty ( ) ) ,
347
- } ,
355
+ ty:: ConstKind :: Infer ( ty:: InferConst :: Var ( mut vid) ) => {
356
+ // We need to canonicalize the *root* of our const var.
357
+ // This is so that our canonical response correctly reflects
358
+ // any equated inference vars correctly!
359
+ let root_vid = self . infcx . root_const_var ( vid) ;
360
+ if root_vid != vid {
361
+ c = self . infcx . tcx . mk_const ( ty:: InferConst :: Var ( root_vid) , c. ty ( ) ) ;
362
+ vid = root_vid;
363
+ }
364
+
365
+ match self . infcx . probe_const_var ( vid) {
366
+ Ok ( c) => return self . fold_const ( c) ,
367
+ Err ( universe) => CanonicalVarKind :: Const ( universe, c. ty ( ) ) ,
368
+ }
369
+ }
348
370
ty:: ConstKind :: Infer ( ty:: InferConst :: Fresh ( _) ) => {
349
371
bug ! ( "fresh var during canonicalization: {c:?}" )
350
372
}
0 commit comments