@@ -7,11 +7,7 @@ use rustc_middle::{
7
7
BasicBlock , Body , Location , Operand , Rvalue , Statement , StatementKind , Terminator ,
8
8
TerminatorKind ,
9
9
} ,
10
- ty:: {
11
- self ,
12
- relate:: { Relate , RelateResult , TypeRelation } ,
13
- ParamEnv , Ty , TyCtxt ,
14
- } ,
10
+ ty:: { self , fold:: BottomUpFolder , ParamEnv , Ty , TyCtxt , TypeFoldable } ,
15
11
} ;
16
12
17
13
#[ derive( Copy , Clone , Debug ) ]
@@ -49,79 +45,24 @@ pub fn equal_up_to_regions(
49
45
return true ;
50
46
}
51
47
52
- struct LifetimeIgnoreRelation < ' tcx > {
53
- tcx : TyCtxt < ' tcx > ,
54
- param_env : ty:: ParamEnv < ' tcx > ,
55
- }
56
-
57
- impl TypeRelation < ' tcx > for LifetimeIgnoreRelation < ' tcx > {
58
- fn tcx ( & self ) -> TyCtxt < ' tcx > {
59
- self . tcx
60
- }
61
-
62
- fn param_env ( & self ) -> ty:: ParamEnv < ' tcx > {
63
- self . param_env
64
- }
65
-
66
- fn tag ( & self ) -> & ' static str {
67
- "librustc_mir::transform::validate"
68
- }
69
-
70
- fn a_is_expected ( & self ) -> bool {
71
- true
72
- }
73
-
74
- fn relate_with_variance < T : Relate < ' tcx > > (
75
- & mut self ,
76
- _: ty:: Variance ,
77
- a : T ,
78
- b : T ,
79
- ) -> RelateResult < ' tcx , T > {
80
- // Ignore variance, require types to be exactly the same.
81
- self . relate ( a, b)
82
- }
83
-
84
- fn tys ( & mut self , a : Ty < ' tcx > , b : Ty < ' tcx > ) -> RelateResult < ' tcx , Ty < ' tcx > > {
85
- if a == b {
86
- // Short-circuit.
87
- return Ok ( a) ;
88
- }
89
- ty:: relate:: super_relate_tys ( self , a, b)
90
- }
91
-
92
- fn regions (
93
- & mut self ,
94
- a : ty:: Region < ' tcx > ,
95
- _b : ty:: Region < ' tcx > ,
96
- ) -> RelateResult < ' tcx , ty:: Region < ' tcx > > {
97
- // Ignore regions.
98
- Ok ( a)
99
- }
100
-
101
- fn consts (
102
- & mut self ,
103
- a : & ' tcx ty:: Const < ' tcx > ,
104
- b : & ' tcx ty:: Const < ' tcx > ,
105
- ) -> RelateResult < ' tcx , & ' tcx ty:: Const < ' tcx > > {
106
- ty:: relate:: super_relate_consts ( self , a, b)
107
- }
108
-
109
- fn binders < T > (
110
- & mut self ,
111
- a : ty:: Binder < T > ,
112
- b : ty:: Binder < T > ,
113
- ) -> RelateResult < ' tcx , ty:: Binder < T > >
114
- where
115
- T : Relate < ' tcx > ,
116
- {
117
- self . relate ( a. skip_binder ( ) , b. skip_binder ( ) ) ?;
118
- Ok ( a)
119
- }
120
- }
121
-
122
- // Instantiate and run relation.
123
- let mut relator: LifetimeIgnoreRelation < ' tcx > = LifetimeIgnoreRelation { tcx : tcx, param_env } ;
124
- relator. relate ( src, dest) . is_ok ( )
48
+ // Normalize lifetimes away on both sides, then compare.
49
+ let param_env = param_env. with_reveal_all_normalized ( tcx) ;
50
+ let normalize = |ty : Ty < ' tcx > | {
51
+ tcx. normalize_erasing_regions (
52
+ param_env,
53
+ ty. fold_with ( & mut BottomUpFolder {
54
+ tcx,
55
+ // We just erase all late-bound lifetimes, but this is not fully correct (FIXME):
56
+ // lifetimes in invariant positions could matter (e.g. through associated types).
57
+ // We rely on the fact that layout was confirmed to be equal above.
58
+ lt_op : |_| tcx. lifetimes . re_erased ,
59
+ // Leave consts and types unchanged.
60
+ ct_op : |ct| ct,
61
+ ty_op : |ty| ty,
62
+ } ) ,
63
+ )
64
+ } ;
65
+ normalize ( src) == normalize ( dest)
125
66
}
126
67
127
68
struct TypeChecker < ' a , ' tcx > {
0 commit comments