@@ -100,22 +100,16 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
100
100
return true ;
101
101
}
102
102
103
- // Type-changing assignments can happen for (at least) two reasons:
104
- // 1. `&mut T` -> `&T` gets optimized from a reborrow to a mere assignment.
105
- // 2. Subtyping is used. While all normal lifetimes are erased, higher-ranked types
106
- // with their late-bound lifetimes are still around and can lead to type differences .
107
- // Normalize both of them away.
108
- // Also see the related but slightly different post-monomorphization method in `interpret/eval_context.rs`.
103
+ // Type-changing assignments can happen when subtyping is used. While
104
+ // all normal lifetimes are erased, higher-ranked types with their
105
+ // late-bound lifetimes are still around and can lead to type
106
+ // differences. Normalize both of them away .
107
+ // Also see the related but slightly different post-monomorphization
108
+ // method in `interpret/eval_context.rs`.
109
109
let normalize = |ty : Ty < ' tcx > | {
110
110
ty. fold_with ( & mut BottomUpFolder {
111
111
tcx : self . tcx ,
112
- // Normalize all references to immutable.
113
- ty_op : |ty| match ty. kind {
114
- ty:: Ref ( _, pointee, _) => {
115
- self . tcx . mk_imm_ref ( self . tcx . lifetimes . re_erased , pointee)
116
- }
117
- _ => ty,
118
- } ,
112
+ ty_op : |ty| ty,
119
113
// We just erase all late-bound lifetimes, but this is not fully correct (FIXME):
120
114
// lifetimes in invariant positions could matter (e.g. through associated types).
121
115
// But that just means we miss some potential incompatible types, it will not
0 commit comments