@@ -5,14 +5,17 @@ use rustc_middle::ty::{
5
5
self , ConstVid , FloatVid , IntVid , RegionVid , Ty , TyCtxt , TyVid , TypeFoldable , TypeFolder ,
6
6
TypeSuperFoldable ,
7
7
} ;
8
+ use rustc_span:: Span ;
8
9
use rustc_type_ir:: TypeVisitableExt ;
9
10
use tracing:: instrument;
10
11
use ut:: UnifyKey ;
11
12
12
13
use super :: VariableLengths ;
13
14
use crate :: infer:: type_variable:: TypeVariableOrigin ;
14
15
use crate :: infer:: unify_key:: { ConstVariableValue , ConstVidKey } ;
15
- use crate :: infer:: { ConstVariableOrigin , InferCtxt , RegionVariableOrigin , UnificationTable } ;
16
+ use crate :: infer:: {
17
+ ConstVariableOrigin , InferCtxt , InferCtxtInner , RegionVariableOrigin , UnificationTable ,
18
+ } ;
16
19
17
20
fn vars_since_snapshot < ' tcx , T > (
18
21
table : & UnificationTable < ' _ , ' tcx , T > ,
25
28
T :: from_index ( snapshot_var_len as u32 ) ..T :: from_index ( table. len ( ) as u32 )
26
29
}
27
30
31
+ fn float_vars_since_snapshot (
32
+ inner : & mut InferCtxtInner < ' _ > ,
33
+ snapshot_var_len : usize ,
34
+ ) -> ( Range < FloatVid > , Vec < Span > ) {
35
+ let range = vars_since_snapshot ( & inner. float_unification_table ( ) , snapshot_var_len) ;
36
+ ( range. clone ( ) , range. map ( |index| inner. float_origin_span_storage [ index] ) . collect ( ) )
37
+ }
38
+
28
39
fn const_vars_since_snapshot < ' tcx > (
29
40
table : & mut UnificationTable < ' _ , ' tcx , ConstVidKey < ' tcx > > ,
30
41
snapshot_var_len : usize ,
@@ -129,7 +140,7 @@ struct SnapshotVarData {
129
140
region_vars : ( Range < RegionVid > , Vec < RegionVariableOrigin > ) ,
130
141
type_vars : ( Range < TyVid > , Vec < TypeVariableOrigin > ) ,
131
142
int_vars : Range < IntVid > ,
132
- float_vars : Range < FloatVid > ,
143
+ float_vars : ( Range < FloatVid > , Vec < Span > ) ,
133
144
const_vars : ( Range < ConstVid > , Vec < ConstVariableOrigin > ) ,
134
145
}
135
146
@@ -142,8 +153,7 @@ impl SnapshotVarData {
142
153
let type_vars = inner. type_variables ( ) . vars_since_snapshot ( vars_pre_snapshot. type_var_len ) ;
143
154
let int_vars =
144
155
vars_since_snapshot ( & inner. int_unification_table ( ) , vars_pre_snapshot. int_var_len ) ;
145
- let float_vars =
146
- vars_since_snapshot ( & inner. float_unification_table ( ) , vars_pre_snapshot. float_var_len ) ;
156
+ let float_vars = float_vars_since_snapshot ( & mut inner, vars_pre_snapshot. float_var_len ) ;
147
157
148
158
let const_vars = const_vars_since_snapshot (
149
159
& mut inner. const_unification_table ( ) ,
@@ -157,7 +167,7 @@ impl SnapshotVarData {
157
167
region_vars. 0 . is_empty ( )
158
168
&& type_vars. 0 . is_empty ( )
159
169
&& int_vars. is_empty ( )
160
- && float_vars. is_empty ( )
170
+ && float_vars. 0 . is_empty ( )
161
171
&& const_vars. 0 . is_empty ( )
162
172
}
163
173
}
@@ -202,8 +212,10 @@ impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for InferenceFudger<'a, 'tcx> {
202
212
}
203
213
}
204
214
ty:: FloatVar ( vid) => {
205
- if self . snapshot_vars . float_vars . contains ( & vid) {
206
- self . infcx . next_float_var ( )
215
+ if self . snapshot_vars . float_vars . 0 . contains ( & vid) {
216
+ let idx = vid. as_usize ( ) - self . snapshot_vars . float_vars . 0 . start . as_usize ( ) ;
217
+ let span = self . snapshot_vars . float_vars . 1 [ idx] ;
218
+ self . infcx . next_float_var ( span)
207
219
} else {
208
220
ty
209
221
}
0 commit comments