review
This commit is contained in:
parent
c909b6dc22
commit
80f56cdc2a
2 changed files with 10 additions and 1 deletions
|
@ -70,12 +70,20 @@ impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for ty::subst::GenericArgKin
|
||||||
// See `fn intern_type_list` for more details.
|
// See `fn intern_type_list` for more details.
|
||||||
//
|
//
|
||||||
// We therefore hash types without adding a hash for their discriminant.
|
// 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::Type(ty) => ty.hash_stable(hcx, hasher),
|
||||||
ty::subst::GenericArgKind::Const(ct) => {
|
ty::subst::GenericArgKind::Const(ct) => {
|
||||||
|
0xFFu8.hash_stable(hcx, hasher);
|
||||||
mem::discriminant(self).hash_stable(hcx, hasher);
|
mem::discriminant(self).hash_stable(hcx, hasher);
|
||||||
ct.hash_stable(hcx, hasher);
|
ct.hash_stable(hcx, hasher);
|
||||||
}
|
}
|
||||||
ty::subst::GenericArgKind::Lifetime(lt) => {
|
ty::subst::GenericArgKind::Lifetime(lt) => {
|
||||||
|
0xFFu8.hash_stable(hcx, hasher);
|
||||||
mem::discriminant(self).hash_stable(hcx, hasher);
|
mem::discriminant(self).hash_stable(hcx, hasher);
|
||||||
lt.hash_stable(hcx, hasher);
|
lt.hash_stable(hcx, hasher);
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,8 @@ pub enum GenericArgKind<'tcx> {
|
||||||
/// This function goes from `&'a [Ty<'tcx>]` to `&'a [GenericArg<'tcx>]`
|
/// This function goes from `&'a [Ty<'tcx>]` to `&'a [GenericArg<'tcx>]`
|
||||||
///
|
///
|
||||||
/// This is sound as, for types, `GenericArg` is just
|
/// 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>] {
|
pub fn ty_slice_as_generic_args<'a, 'tcx>(ts: &'a [Ty<'tcx>]) -> &'a [GenericArg<'tcx>] {
|
||||||
assert_eq!(TYPE_TAG, 0);
|
assert_eq!(TYPE_TAG, 0);
|
||||||
// SAFETY: the whole slice is valid and immutable.
|
// SAFETY: the whole slice is valid and immutable.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue