raw slices do not have to comply to the size limit

This commit is contained in:
Ralf Jung 2019-08-26 19:48:56 +02:00
parent 0c1cb32b84
commit ae78862058

View File

@ -3,7 +3,7 @@
use syntax_pos::symbol::{sym, Symbol};
use rustc::hir;
use rustc::ty::layout::{self, Size, TyLayout, LayoutOf, VariantIdx};
use rustc::ty::layout::{self, TyLayout, LayoutOf, VariantIdx};
use rustc::ty;
use rustc_data_structures::fx::FxHashSet;
@ -276,20 +276,11 @@ fn check_wide_ptr_meta(
// FIXME: More checks for the vtable.
}
ty::Slice(..) | ty::Str => {
let len = try_validation!(meta.unwrap().to_usize(self.ecx),
let _len = try_validation!(meta.unwrap().to_usize(self.ecx),
"non-integer slice length in wide pointer", self.path);
// check max slice length
let elem_size = match tail.sty {
ty::Str => Size::from_bytes(1),
ty::Slice(ty) => self.ecx.layout_of(ty)?.size,
_ => bug!("It cannot be another type"),
};
if elem_size.checked_mul(len, &*self.ecx.tcx).is_none() {
throw_validation_failure!(
"too large slice (longer than isize::MAX bytes)",
self.path
);
}
// We do not check that `len * elem_size <= isize::MAX`:
// that is only required for references, and there it falls out of the
// "dereferencable" check performed by Stacked Borrows.
}
ty::Foreign(..) => {
// Unsized, but not wide.