Erase/anonymize regions while computing TypeId hash.
This commit is contained in:
parent
d07dd4ab44
commit
6dbd84640f
2 changed files with 10 additions and 0 deletions
|
|
@ -214,6 +214,11 @@ impl<'a, 'tcx> TyCtxt<'a, 'tcx, 'tcx> {
|
|||
let mut hasher = StableHasher::new();
|
||||
let mut hcx = StableHashingContext::new(self);
|
||||
|
||||
// We want the type_id be independent of the types free regions, so we
|
||||
// erase them. The erase_regions() call will also anonymize bound
|
||||
// regions, which is desirable too.
|
||||
let ty = self.erase_regions(&ty);
|
||||
|
||||
hcx.while_hashing_spans(false, |hcx| {
|
||||
hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| {
|
||||
ty.hash_stable(hcx, &mut hasher);
|
||||
|
|
|
|||
|
|
@ -45,6 +45,11 @@ fn main() {
|
|||
assert!(g != h);
|
||||
assert!(g != i);
|
||||
assert!(h != i);
|
||||
|
||||
// Make sure lifetime anonymization handles nesting correctly
|
||||
let j = TypeId::of::<fn(for<'a> fn(&'a isize) -> &'a usize)>();
|
||||
let k = TypeId::of::<fn(for<'b> fn(&'b isize) -> &'b usize)>();
|
||||
assert_eq!(j, k);
|
||||
}
|
||||
// Boxed unboxed closures
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue