From d07dd4ab444bb14746c3cc80186c979e5c51c3a1 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Tue, 8 Aug 2017 17:56:28 +0200 Subject: [PATCH 1/2] Implement HashStable for Xyz<'gcx> instead of Xyz<'lcx>. --- src/librustc/ich/impls_mir.rs | 24 ++++++++++++------------ src/librustc/ich/impls_ty.rs | 32 +++++++++++++++++++------------- src/librustc/macros.rs | 16 ++++++++-------- src/librustc/ty/mod.rs | 2 +- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/librustc/ich/impls_mir.rs b/src/librustc/ich/impls_mir.rs index c20864183f4..faf579186e5 100644 --- a/src/librustc/ich/impls_mir.rs +++ b/src/librustc/ich/impls_mir.rs @@ -33,7 +33,7 @@ impl_stable_hash_for!(struct mir::UpvarDecl { debug_name, by_ref }); impl_stable_hash_for!(struct mir::BasicBlockData<'tcx> { statements, terminator, is_cleanup }); impl<'a, 'gcx, 'tcx> HashStable> -for mir::Terminator<'tcx> { +for mir::Terminator<'gcx> { #[inline] fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, @@ -125,7 +125,7 @@ impl<'a, 'gcx, 'tcx> HashStable> for mir::P } impl<'a, 'gcx, 'tcx> HashStable> -for mir::TerminatorKind<'tcx> { +for mir::TerminatorKind<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -186,7 +186,7 @@ for mir::TerminatorKind<'tcx> { } impl<'a, 'gcx, 'tcx> HashStable> -for mir::AssertMessage<'tcx> { +for mir::AssertMessage<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -207,7 +207,7 @@ for mir::AssertMessage<'tcx> { impl_stable_hash_for!(struct mir::Statement<'tcx> { source_info, kind }); impl<'a, 'gcx, 'tcx> HashStable> -for mir::StatementKind<'tcx> { +for mir::StatementKind<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -244,7 +244,7 @@ for mir::StatementKind<'tcx> { } impl<'a, 'gcx, 'tcx, T> HashStable> - for mir::ValidationOperand<'tcx, T> + for mir::ValidationOperand<'gcx, T> where T: HashStable> { fn hash_stable(&self, @@ -260,7 +260,7 @@ impl<'a, 'gcx, 'tcx, T> HashStable> impl_stable_hash_for!(enum mir::ValidationOp { Acquire, Release, Suspend(extent) }); -impl<'a, 'gcx, 'tcx> HashStable> for mir::Lvalue<'tcx> { +impl<'a, 'gcx, 'tcx> HashStable> for mir::Lvalue<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -280,7 +280,7 @@ impl<'a, 'gcx, 'tcx> HashStable> for mir::L } impl<'a, 'gcx, 'tcx, B, V, T> HashStable> -for mir::Projection<'tcx, B, V, T> +for mir::Projection<'gcx, B, V, T> where B: HashStable>, V: HashStable>, T: HashStable> @@ -299,7 +299,7 @@ for mir::Projection<'tcx, B, V, T> } impl<'a, 'gcx, 'tcx, V, T> HashStable> -for mir::ProjectionElem<'tcx, V, T> +for mir::ProjectionElem<'gcx, V, T> where V: HashStable>, T: HashStable> { @@ -335,7 +335,7 @@ for mir::ProjectionElem<'tcx, V, T> impl_stable_hash_for!(struct mir::VisibilityScopeData { span, parent_scope }); -impl<'a, 'gcx, 'tcx> HashStable> for mir::Operand<'tcx> { +impl<'a, 'gcx, 'tcx> HashStable> for mir::Operand<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -352,7 +352,7 @@ impl<'a, 'gcx, 'tcx> HashStable> for mir::O } } -impl<'a, 'gcx, 'tcx> HashStable> for mir::Rvalue<'tcx> { +impl<'a, 'gcx, 'tcx> HashStable> for mir::Rvalue<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -413,7 +413,7 @@ impl_stable_hash_for!(enum mir::CastKind { }); impl<'a, 'gcx, 'tcx> HashStable> -for mir::AggregateKind<'tcx> { +for mir::AggregateKind<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -469,7 +469,7 @@ impl_stable_hash_for!(enum mir::NullOp { impl_stable_hash_for!(struct mir::Constant<'tcx> { span, ty, literal }); -impl<'a, 'gcx, 'tcx> HashStable> for mir::Literal<'tcx> { +impl<'a, 'gcx, 'tcx> HashStable> for mir::Literal<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { diff --git a/src/librustc/ich/impls_ty.rs b/src/librustc/ich/impls_ty.rs index 5269ec90def..ec3f3c113e8 100644 --- a/src/librustc/ich/impls_ty.rs +++ b/src/librustc/ich/impls_ty.rs @@ -20,7 +20,7 @@ use syntax_pos::symbol::InternedString; use ty; impl<'a, 'gcx, 'tcx, T> HashStable> -for &'tcx ty::Slice +for &'gcx ty::Slice where T: HashStable> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, @@ -30,7 +30,7 @@ for &'tcx ty::Slice } impl<'a, 'gcx, 'tcx> HashStable> -for ty::subst::Kind<'tcx> { +for ty::subst::Kind<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -55,6 +55,11 @@ for ty::RegionKind { db.depth.hash_stable(hcx, hasher); i.hash_stable(hcx, hasher); } + ty::ReLateBound(db, ty::BrNamed(def_id, name)) => { + db.depth.hash_stable(hcx, hasher); + def_id.hash_stable(hcx, hasher); + name.hash_stable(hcx, hasher); + } ty::ReEarlyBound(ty::EarlyBoundRegion { def_id, index, name }) => { def_id.hash_stable(hcx, hasher); index.hash_stable(hcx, hasher); @@ -76,7 +81,7 @@ for ty::RegionKind { } impl<'a, 'gcx, 'tcx> HashStable> -for ty::adjustment::AutoBorrow<'tcx> { +for ty::adjustment::AutoBorrow<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -94,7 +99,7 @@ for ty::adjustment::AutoBorrow<'tcx> { } impl<'a, 'gcx, 'tcx> HashStable> -for ty::adjustment::Adjust<'tcx> { +for ty::adjustment::Adjust<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -128,7 +133,7 @@ impl_stable_hash_for!(enum ty::BorrowKind { }); impl<'a, 'gcx, 'tcx> HashStable> -for ty::UpvarCapture<'tcx> { +for ty::UpvarCapture<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -150,12 +155,13 @@ impl_stable_hash_for!(struct ty::FnSig<'tcx> { }); impl<'a, 'gcx, 'tcx, T> HashStable> for ty::Binder - where T: HashStable> + ty::fold::TypeFoldable<'tcx> + where T: HashStable> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { - hcx.tcx().anonymize_late_bound_regions(self).0.hash_stable(hcx, hasher); + let ty::Binder(ref inner) = *self; + inner.hash_stable(hcx, hasher); } } @@ -190,7 +196,7 @@ impl_stable_hash_for!(struct ty::ProjectionPredicate<'tcx> { projection_ty, ty } impl_stable_hash_for!(struct ty::ProjectionTy<'tcx> { substs, item_def_id }); -impl<'a, 'gcx, 'tcx> HashStable> for ty::Predicate<'tcx> { +impl<'a, 'gcx, 'tcx> HashStable> for ty::Predicate<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -256,7 +262,7 @@ impl_stable_hash_for!(struct ty::FieldDef { }); impl<'a, 'gcx, 'tcx> HashStable> -for ::middle::const_val::ConstVal<'tcx> { +for ::middle::const_val::ConstVal<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -483,7 +489,7 @@ impl_stable_hash_for!(enum ty::BoundRegion { }); impl<'a, 'gcx, 'tcx> HashStable> -for ty::TypeVariants<'tcx> +for ty::TypeVariants<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, @@ -574,7 +580,7 @@ impl_stable_hash_for!(struct ty::TypeAndMut<'tcx> { }); impl<'a, 'gcx, 'tcx> HashStable> -for ty::ExistentialPredicate<'tcx> +for ty::ExistentialPredicate<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, @@ -607,7 +613,7 @@ impl_stable_hash_for!(struct ty::ExistentialProjection<'tcx> { impl<'a, 'gcx, 'tcx> HashStable> -for ty::TypeckTables<'tcx> { +for ty::TypeckTables<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { @@ -689,7 +695,7 @@ impl_stable_hash_for!(struct ty::Instance<'tcx> { substs }); -impl<'a, 'gcx, 'tcx> HashStable> for ty::InstanceDef<'tcx> { +impl<'a, 'gcx, 'tcx> HashStable> for ty::InstanceDef<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { diff --git a/src/librustc/macros.rs b/src/librustc/macros.rs index f814f941b06..f3d66b49de5 100644 --- a/src/librustc/macros.rs +++ b/src/librustc/macros.rs @@ -73,10 +73,10 @@ macro_rules! __impl_stable_hash_field { #[macro_export] macro_rules! impl_stable_hash_for { (enum $enum_name:path { $( $variant:ident $( ( $($arg:ident),* ) )* ),* }) => { - impl<'a, 'gcx, 'tcx> ::rustc_data_structures::stable_hasher::HashStable<$crate::ich::StableHashingContext<'a, 'gcx, 'tcx>> for $enum_name { + impl<'a, 'tcx, 'lcx> ::rustc_data_structures::stable_hasher::HashStable<$crate::ich::StableHashingContext<'a, 'tcx, 'lcx>> for $enum_name { #[inline] fn hash_stable(&self, - __ctx: &mut $crate::ich::StableHashingContext<'a, 'gcx, 'tcx>, + __ctx: &mut $crate::ich::StableHashingContext<'a, 'tcx, 'lcx>, __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher) { use $enum_name::*; ::std::mem::discriminant(self).hash_stable(__ctx, __hasher); @@ -92,10 +92,10 @@ macro_rules! impl_stable_hash_for { } }; (struct $struct_name:path { $($field:ident),* }) => { - impl<'a, 'gcx, 'tcx> ::rustc_data_structures::stable_hasher::HashStable<$crate::ich::StableHashingContext<'a, 'gcx, 'tcx>> for $struct_name { + impl<'a, 'tcx, 'lcx> ::rustc_data_structures::stable_hasher::HashStable<$crate::ich::StableHashingContext<'a, 'tcx, 'lcx>> for $struct_name { #[inline] fn hash_stable(&self, - __ctx: &mut $crate::ich::StableHashingContext<'a, 'gcx, 'tcx>, + __ctx: &mut $crate::ich::StableHashingContext<'a, 'tcx, 'lcx>, __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher) { let $struct_name { $(ref $field),* @@ -106,10 +106,10 @@ macro_rules! impl_stable_hash_for { } }; (tuple_struct $struct_name:path { $($field:ident),* }) => { - impl<'a, 'gcx, 'tcx> ::rustc_data_structures::stable_hasher::HashStable<$crate::ich::StableHashingContext<'a, 'gcx, 'tcx>> for $struct_name { + impl<'a, 'tcx, 'lcx> ::rustc_data_structures::stable_hasher::HashStable<$crate::ich::StableHashingContext<'a, 'tcx, 'lcx>> for $struct_name { #[inline] fn hash_stable(&self, - __ctx: &mut $crate::ich::StableHashingContext<'a, 'gcx, 'tcx>, + __ctx: &mut $crate::ich::StableHashingContext<'a, 'tcx, 'lcx>, __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher) { let $struct_name ( $(ref $field),* @@ -125,11 +125,11 @@ macro_rules! impl_stable_hash_for { macro_rules! impl_stable_hash_for_spanned { ($T:path) => ( - impl<'a, 'gcx, 'tcx> HashStable> for ::syntax::codemap::Spanned<$T> + impl<'a, 'tcx, 'lcx> HashStable> for ::syntax::codemap::Spanned<$T> { #[inline] fn hash_stable(&self, - hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, + hcx: &mut StableHashingContext<'a, 'tcx, 'lcx>, hasher: &mut StableHasher) { self.node.hash_stable(hcx, hasher); self.span.hash_stable(hcx, hasher); diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index eef0bcc3753..93687d6299a 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -497,7 +497,7 @@ impl<'tcx> TyS<'tcx> { } } -impl<'a, 'gcx, 'tcx> HashStable> for ty::TyS<'tcx> { +impl<'a, 'gcx, 'tcx> HashStable> for ty::TyS<'gcx> { fn hash_stable(&self, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hasher: &mut StableHasher) { From 6dbd84640f7efa2e6d8a2bc13e9a30cbe5c3f96c Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Tue, 8 Aug 2017 18:11:39 +0200 Subject: [PATCH 2/2] Erase/anonymize regions while computing TypeId hash. --- src/librustc/ty/util.rs | 5 +++++ src/test/run-pass/type-id-higher-rank.rs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs index df4bbad3859..ca95ff5722a 100644 --- a/src/librustc/ty/util.rs +++ b/src/librustc/ty/util.rs @@ -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); diff --git a/src/test/run-pass/type-id-higher-rank.rs b/src/test/run-pass/type-id-higher-rank.rs index 827b05c0801..2865b5d04e5 100644 --- a/src/test/run-pass/type-id-higher-rank.rs +++ b/src/test/run-pass/type-id-higher-rank.rs @@ -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(&'a isize) -> &'a usize)>(); + let k = TypeId::of:: fn(&'b isize) -> &'b usize)>(); + assert_eq!(j, k); } // Boxed unboxed closures {