]> git.lizzy.rs Git - rust.git/commitdiff
prevent potential bug in `encode_with_shorthand`.
authorBastian Kauschke <bastian_kauschke@hotmail.de>
Sat, 16 Jan 2021 23:25:18 +0000 (00:25 +0100)
committerBastian Kauschke <bastian_kauschke@hotmail.de>
Sat, 16 Jan 2021 23:34:54 +0000 (00:34 +0100)
compiler/rustc_middle/src/ty/codec.rs

index df594690215bd767639d9c79f12c00a24e02326a..7ad80e748aadedb6622efa56174e5c9d947250d5 100644 (file)
@@ -18,7 +18,6 @@
 use rustc_hir::def_id::{CrateNum, DefId};
 use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
 use rustc_span::Span;
-use std::convert::{TryFrom, TryInto};
 use std::hash::Hash;
 use std::intrinsics;
 use std::marker::DiscriminantKind;
@@ -95,7 +94,8 @@ pub fn encode_with_shorthand<E, T, M>(encoder: &mut E, value: &T, cache: M) -> R
     E: TyEncoder<'tcx>,
     M: for<'b> Fn(&'b mut E) -> &'b mut FxHashMap<T, usize>,
     T: EncodableWithShorthand<'tcx, E>,
-    <T::Variant as DiscriminantKind>::Discriminant: Ord + TryFrom<usize>,
+    // The discriminant and shorthand must have the same size.
+    T::Variant: DiscriminantKind<Discriminant = isize>,
 {
     let existing_shorthand = cache(encoder).get(value).copied();
     if let Some(shorthand) = existing_shorthand {
@@ -111,7 +111,7 @@ pub fn encode_with_shorthand<E, T, M>(encoder: &mut E, value: &T, cache: M) -> R
     // The shorthand encoding uses the same usize as the
     // discriminant, with an offset so they can't conflict.
     let discriminant = intrinsics::discriminant_value(variant);
-    assert!(discriminant < SHORTHAND_OFFSET.try_into().ok().unwrap());
+    assert!(SHORTHAND_OFFSET > discriminant as usize);
 
     let shorthand = start + SHORTHAND_OFFSET;