提交 73c3f55a 编写于 作者: B bors

Auto merge of #43743 - michaelwoerister:gcx-tcx-switcheroo, r=eddyb

Some assorted region hashing fixes.

This PR contains three changes.
1. It changes what we implement `HashStable` for. Previously, the trait was implemented for things in the local `TyCtxt`. That was OK, since we only invoked hashing with a `TyCtxt<'_,  'tcx, 'tcx>` where there is no difference. With query result hashing this becomes a problem though. So we now implement `HashStable` for things in `'gcx`.
2. The PR makes the regular `HashStable` implementation *not* anonymize late-bound regions anymore. It's a waste of computing resources and it's not clear that it would always be correct to do so.
3. The PR adds an option for stable hashing to treat all regions as erased and uses this new option when computing the `TypeId`. This should help with https://github.com/rust-lang/rust/issues/41875.

I did not add a test case for (3) since that's not possible yet. But it looks like @zackmdavis has something in the pipeline there `:)`.

r? @EddyB
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
impl_stable_hash_for!(struct mir::BasicBlockData<'tcx> { statements, terminator, is_cleanup }); impl_stable_hash_for!(struct mir::BasicBlockData<'tcx> { statements, terminator, is_cleanup });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for mir::Terminator<'tcx> { for mir::Terminator<'gcx> {
#[inline] #[inline]
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
...@@ -125,7 +125,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -125,7 +125,7 @@ fn hash_stable<W: StableHasherResult>(&self,
} }
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for mir::TerminatorKind<'tcx> { for mir::TerminatorKind<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -186,7 +186,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -186,7 +186,7 @@ fn hash_stable<W: StableHasherResult>(&self,
} }
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for mir::AssertMessage<'tcx> { for mir::AssertMessage<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -207,7 +207,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -207,7 +207,7 @@ fn hash_stable<W: StableHasherResult>(&self,
impl_stable_hash_for!(struct mir::Statement<'tcx> { source_info, kind }); impl_stable_hash_for!(struct mir::Statement<'tcx> { source_info, kind });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for mir::StatementKind<'tcx> { for mir::StatementKind<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -244,7 +244,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -244,7 +244,7 @@ fn hash_stable<W: StableHasherResult>(&self,
} }
impl<'a, 'gcx, 'tcx, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for mir::ValidationOperand<'tcx, T> for mir::ValidationOperand<'gcx, T>
where T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>> where T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
{ {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
...@@ -260,7 +260,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -260,7 +260,7 @@ fn hash_stable<W: StableHasherResult>(&self,
impl_stable_hash_for!(enum mir::ValidationOp { Acquire, Release, Suspend(extent) }); impl_stable_hash_for!(enum mir::ValidationOp { Acquire, Release, Suspend(extent) });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for mir::Lvalue<'tcx> { impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for mir::Lvalue<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -280,7 +280,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -280,7 +280,7 @@ fn hash_stable<W: StableHasherResult>(&self,
} }
impl<'a, 'gcx, 'tcx, B, V, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx, B, V, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for mir::Projection<'tcx, B, V, T> for mir::Projection<'gcx, B, V, T>
where B: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>, where B: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>,
V: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>, V: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>,
T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>> T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
...@@ -299,7 +299,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -299,7 +299,7 @@ fn hash_stable<W: StableHasherResult>(&self,
} }
impl<'a, 'gcx, 'tcx, V, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx, V, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for mir::ProjectionElem<'tcx, V, T> for mir::ProjectionElem<'gcx, V, T>
where V: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>, where V: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>,
T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>> T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
{ {
...@@ -335,7 +335,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -335,7 +335,7 @@ fn hash_stable<W: StableHasherResult>(&self,
impl_stable_hash_for!(struct mir::VisibilityScopeData { span, parent_scope }); impl_stable_hash_for!(struct mir::VisibilityScopeData { span, parent_scope });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for mir::Operand<'tcx> { impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for mir::Operand<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -352,7 +352,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -352,7 +352,7 @@ fn hash_stable<W: StableHasherResult>(&self,
} }
} }
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for mir::Rvalue<'tcx> { impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for mir::Rvalue<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -413,7 +413,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -413,7 +413,7 @@ fn hash_stable<W: StableHasherResult>(&self,
}); });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for mir::AggregateKind<'tcx> { for mir::AggregateKind<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -469,7 +469,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -469,7 +469,7 @@ fn hash_stable<W: StableHasherResult>(&self,
impl_stable_hash_for!(struct mir::Constant<'tcx> { span, ty, literal }); impl_stable_hash_for!(struct mir::Constant<'tcx> { span, ty, literal });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for mir::Literal<'tcx> { impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for mir::Literal<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
use ty; use ty;
impl<'a, 'gcx, 'tcx, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for &'tcx ty::Slice<T> for &'gcx ty::Slice<T>
where T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>> { where T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
...@@ -30,7 +30,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -30,7 +30,7 @@ fn hash_stable<W: StableHasherResult>(&self,
} }
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for ty::subst::Kind<'tcx> { for ty::subst::Kind<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -55,6 +55,11 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -55,6 +55,11 @@ fn hash_stable<W: StableHasherResult>(&self,
db.depth.hash_stable(hcx, hasher); db.depth.hash_stable(hcx, hasher);
i.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 }) => { ty::ReEarlyBound(ty::EarlyBoundRegion { def_id, index, name }) => {
def_id.hash_stable(hcx, hasher); def_id.hash_stable(hcx, hasher);
index.hash_stable(hcx, hasher); index.hash_stable(hcx, hasher);
...@@ -76,7 +81,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -76,7 +81,7 @@ fn hash_stable<W: StableHasherResult>(&self,
} }
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for ty::adjustment::AutoBorrow<'tcx> { for ty::adjustment::AutoBorrow<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -94,7 +99,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -94,7 +99,7 @@ fn hash_stable<W: StableHasherResult>(&self,
} }
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for ty::adjustment::Adjust<'tcx> { for ty::adjustment::Adjust<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -128,7 +133,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -128,7 +133,7 @@ fn hash_stable<W: StableHasherResult>(&self,
}); });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for ty::UpvarCapture<'tcx> { for ty::UpvarCapture<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -150,12 +155,13 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -150,12 +155,13 @@ fn hash_stable<W: StableHasherResult>(&self,
}); });
impl<'a, 'gcx, 'tcx, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ty::Binder<T> impl<'a, 'gcx, 'tcx, T> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ty::Binder<T>
where T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>> + ty::fold::TypeFoldable<'tcx> where T: HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
{ {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
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 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -190,7 +196,7 @@ fn hash_stable<W: StableHasherResult>(&self,
impl_stable_hash_for!(struct ty::ProjectionTy<'tcx> { substs, item_def_id }); impl_stable_hash_for!(struct ty::ProjectionTy<'tcx> { substs, item_def_id });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ty::Predicate<'tcx> { impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ty::Predicate<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -256,7 +262,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -256,7 +262,7 @@ fn hash_stable<W: StableHasherResult>(&self,
}); });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for ::middle::const_val::ConstVal<'tcx> { for ::middle::const_val::ConstVal<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -483,7 +489,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -483,7 +489,7 @@ fn hash_stable<W: StableHasherResult>(&self,
}); });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for ty::TypeVariants<'tcx> for ty::TypeVariants<'gcx>
{ {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
...@@ -574,7 +580,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -574,7 +580,7 @@ fn hash_stable<W: StableHasherResult>(&self,
}); });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for ty::ExistentialPredicate<'tcx> for ty::ExistentialPredicate<'gcx>
{ {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
...@@ -607,7 +613,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -607,7 +613,7 @@ fn hash_stable<W: StableHasherResult>(&self,
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>>
for ty::TypeckTables<'tcx> { for ty::TypeckTables<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
...@@ -687,7 +693,7 @@ fn hash_stable<W: StableHasherResult>(&self, ...@@ -687,7 +693,7 @@ fn hash_stable<W: StableHasherResult>(&self,
substs substs
}); });
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ty::InstanceDef<'tcx> { impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ty::InstanceDef<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
......
...@@ -73,10 +73,10 @@ pub fn from_u32(u: u32) -> Option<$name> { ...@@ -73,10 +73,10 @@ pub fn from_u32(u: u32) -> Option<$name> {
#[macro_export] #[macro_export]
macro_rules! impl_stable_hash_for { macro_rules! impl_stable_hash_for {
(enum $enum_name:path { $( $variant:ident $( ( $($arg:ident),* ) )* ),* }) => { (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] #[inline]
fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&self, fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&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<W>) { __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher<W>) {
use $enum_name::*; use $enum_name::*;
::std::mem::discriminant(self).hash_stable(__ctx, __hasher); ::std::mem::discriminant(self).hash_stable(__ctx, __hasher);
...@@ -92,10 +92,10 @@ fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&s ...@@ -92,10 +92,10 @@ fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&s
} }
}; };
(struct $struct_name:path { $($field:ident),* }) => { (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] #[inline]
fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&self, fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&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<W>) { __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher<W>) {
let $struct_name { let $struct_name {
$(ref $field),* $(ref $field),*
...@@ -106,10 +106,10 @@ fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&s ...@@ -106,10 +106,10 @@ fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&s
} }
}; };
(tuple_struct $struct_name:path { $($field:ident),* }) => { (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] #[inline]
fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&self, fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&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<W>) { __hasher: &mut ::rustc_data_structures::stable_hasher::StableHasher<W>) {
let $struct_name ( let $struct_name (
$(ref $field),* $(ref $field),*
...@@ -125,11 +125,11 @@ fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&s ...@@ -125,11 +125,11 @@ fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&s
macro_rules! impl_stable_hash_for_spanned { macro_rules! impl_stable_hash_for_spanned {
($T:path) => ( ($T:path) => (
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ::syntax::codemap::Spanned<$T> impl<'a, 'tcx, 'lcx> HashStable<StableHashingContext<'a, 'tcx, 'lcx>> for ::syntax::codemap::Spanned<$T>
{ {
#[inline] #[inline]
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'tcx, 'lcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
self.node.hash_stable(hcx, hasher); self.node.hash_stable(hcx, hasher);
self.span.hash_stable(hcx, hasher); self.span.hash_stable(hcx, hasher);
......
...@@ -498,7 +498,7 @@ pub fn is_suggestable(&self) -> bool { ...@@ -498,7 +498,7 @@ pub fn is_suggestable(&self) -> bool {
} }
} }
impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ty::TyS<'tcx> { impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for ty::TyS<'gcx> {
fn hash_stable<W: StableHasherResult>(&self, fn hash_stable<W: StableHasherResult>(&self,
hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>, hcx: &mut StableHashingContext<'a, 'gcx, 'tcx>,
hasher: &mut StableHasher<W>) { hasher: &mut StableHasher<W>) {
......
...@@ -214,6 +214,11 @@ pub fn type_id_hash(self, ty: Ty<'tcx>) -> u64 { ...@@ -214,6 +214,11 @@ pub fn type_id_hash(self, ty: Ty<'tcx>) -> u64 {
let mut hasher = StableHasher::new(); let mut hasher = StableHasher::new();
let mut hcx = StableHashingContext::new(self); 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.while_hashing_spans(false, |hcx| {
hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| {
ty.hash_stable(hcx, &mut hasher); ty.hash_stable(hcx, &mut hasher);
......
...@@ -45,6 +45,11 @@ fn main() { ...@@ -45,6 +45,11 @@ fn main() {
assert!(g != h); assert!(g != h);
assert!(g != i); assert!(g != i);
assert!(h != 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 // Boxed unboxed closures
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册