Revert "don't uniquify regions when canonicalizing"
This reverts commit 171f541470
.
This commit is contained in:
parent
0d95f91329
commit
99f60ec411
1 changed files with 14 additions and 11 deletions
|
@ -125,9 +125,8 @@ impl<'a, 'tcx> Canonicalizer<'a, 'tcx> {
|
||||||
// - var_infos: [E0, U1, E1, U1, E1, E6, U6], curr_compressed_uv: 1, next_orig_uv: 6
|
// - var_infos: [E0, U1, E1, U1, E1, E6, U6], curr_compressed_uv: 1, next_orig_uv: 6
|
||||||
// - var_infos: [E0, U1, E1, U1, E1, E2, U2], curr_compressed_uv: 2, next_orig_uv: -
|
// - var_infos: [E0, U1, E1, U1, E1, E2, U2], curr_compressed_uv: 2, next_orig_uv: -
|
||||||
//
|
//
|
||||||
// This algorithm runs in `O(nm)` where `n` is the number of different universe
|
// This algorithm runs in `O(n²)` where `n` is the number of different universe
|
||||||
// indices in the input and `m` is the number of canonical variables.
|
// indices in the input. This should be fine as `n` is expected to be small.
|
||||||
// This should be fine as both `n` and `m` are expected to be small.
|
|
||||||
let mut curr_compressed_uv = ty::UniverseIndex::ROOT;
|
let mut curr_compressed_uv = ty::UniverseIndex::ROOT;
|
||||||
let mut existential_in_new_uv = false;
|
let mut existential_in_new_uv = false;
|
||||||
let mut next_orig_uv = Some(ty::UniverseIndex::ROOT);
|
let mut next_orig_uv = Some(ty::UniverseIndex::ROOT);
|
||||||
|
@ -263,14 +262,18 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'_, 'tcx> {
|
||||||
ty::ReError(_) => return r,
|
ty::ReError(_) => return r,
|
||||||
};
|
};
|
||||||
|
|
||||||
let var = ty::BoundVar::from(
|
let existing_bound_var = match self.canonicalize_mode {
|
||||||
self.variables.iter().position(|&v| v == r.into()).unwrap_or_else(|| {
|
CanonicalizeMode::Input => None,
|
||||||
let var = self.variables.len();
|
CanonicalizeMode::Response { .. } => {
|
||||||
self.variables.push(r.into());
|
self.variables.iter().position(|&v| v == r.into()).map(ty::BoundVar::from)
|
||||||
self.primitive_var_infos.push(CanonicalVarInfo { kind });
|
}
|
||||||
var
|
};
|
||||||
}),
|
let var = existing_bound_var.unwrap_or_else(|| {
|
||||||
);
|
let var = ty::BoundVar::from(self.variables.len());
|
||||||
|
self.variables.push(r.into());
|
||||||
|
self.primitive_var_infos.push(CanonicalVarInfo { kind });
|
||||||
|
var
|
||||||
|
});
|
||||||
let br = ty::BoundRegion { var, kind: BrAnon(None) };
|
let br = ty::BoundRegion { var, kind: BrAnon(None) };
|
||||||
ty::Region::new_late_bound(self.interner(), self.binder_index, br)
|
ty::Region::new_late_bound(self.interner(), self.binder_index, br)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue