From 80f56cdc2a749f1262518d2aa7597cf908b9e059 Mon Sep 17 00:00:00 2001 From: lcnr Date: Fri, 18 Feb 2022 12:31:12 +0100 Subject: [PATCH] review --- compiler/rustc_middle/src/ty/impls_ty.rs | 8 ++++++++ compiler/rustc_middle/src/ty/subst.rs | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_middle/src/ty/impls_ty.rs b/compiler/rustc_middle/src/ty/impls_ty.rs index 4e3661dda175f..54a345daec8a5 100644 --- a/compiler/rustc_middle/src/ty/impls_ty.rs +++ b/compiler/rustc_middle/src/ty/impls_ty.rs @@ -70,12 +70,20 @@ impl<'a, 'tcx> HashStable> for ty::subst::GenericArgKin // See `fn intern_type_list` for more details. // // We therefore hash types without adding a hash for their discriminant. + // + // In order to make it very unlikely for the sequence of bytes being hashed for + // a `GenericArgKind::Type` to be the same as the sequence of bytes being + // hashed for one of the other variants, we hash a `0xFF` byte before hashing + // their discriminant (since the discriminant of `TyKind` is unlikely to ever start + // with 0xFF). ty::subst::GenericArgKind::Type(ty) => ty.hash_stable(hcx, hasher), ty::subst::GenericArgKind::Const(ct) => { + 0xFFu8.hash_stable(hcx, hasher); mem::discriminant(self).hash_stable(hcx, hasher); ct.hash_stable(hcx, hasher); } ty::subst::GenericArgKind::Lifetime(lt) => { + 0xFFu8.hash_stable(hcx, hasher); mem::discriminant(self).hash_stable(hcx, hasher); lt.hash_stable(hcx, hasher); } diff --git a/compiler/rustc_middle/src/ty/subst.rs b/compiler/rustc_middle/src/ty/subst.rs index 59a560f7342c8..364ba07a44167 100644 --- a/compiler/rustc_middle/src/ty/subst.rs +++ b/compiler/rustc_middle/src/ty/subst.rs @@ -51,7 +51,8 @@ pub enum GenericArgKind<'tcx> { /// This function goes from `&'a [Ty<'tcx>]` to `&'a [GenericArg<'tcx>]` /// /// This is sound as, for types, `GenericArg` is just -/// `NonZeroUsize::new_unchecked(ty as *const _ as usize)`. +/// `NonZeroUsize::new_unchecked(ty as *const _ as usize)` as +/// long as we use `0` for the `TYPE_TAG`. pub fn ty_slice_as_generic_args<'a, 'tcx>(ts: &'a [Ty<'tcx>]) -> &'a [GenericArg<'tcx>] { assert_eq!(TYPE_TAG, 0); // SAFETY: the whole slice is valid and immutable.