Skip to content

Commit e1e34e9

Browse files
committed
Reintroduce non-null assumptions in core::slice iterators
The previous assumptions were not valid for slices of zero-sized elements.
1 parent 52efe55 commit e1e34e9

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/libcore/slice.rs

+16-8
Original file line numberDiff line numberDiff line change
@@ -665,10 +665,14 @@ macro_rules! iterator {
665665
#[inline]
666666
fn next(&mut self) -> Option<$elem> {
667667
// could be implemented with slices, but this avoids bounds checks
668-
unsafe {
669-
if self.ptr == self.end {
670-
None
671-
} else {
668+
if self.ptr == self.end {
669+
None
670+
} else {
671+
unsafe {
672+
if mem::size_of::<T>() != 0 {
673+
::intrinsics::assume(!self.ptr.is_null());
674+
::intrinsics::assume(!self.end.is_null());
675+
}
672676
let old = self.ptr;
673677
self.ptr = slice_offset!(self.ptr, 1);
674678
Some(slice_ref!(old))
@@ -706,11 +710,15 @@ macro_rules! iterator {
706710
#[inline]
707711
fn next_back(&mut self) -> Option<$elem> {
708712
// could be implemented with slices, but this avoids bounds checks
709-
unsafe {
710-
if self.end == self.ptr {
711-
None
712-
} else {
713+
if self.end == self.ptr {
714+
None
715+
} else {
716+
unsafe {
713717
self.end = slice_offset!(self.end, -1);
718+
if mem::size_of::<T>() != 0 {
719+
::intrinsics::assume(!self.ptr.is_null());
720+
::intrinsics::assume(!self.end.is_null());
721+
}
714722
Some(slice_ref!(self.end))
715723
}
716724
}

0 commit comments

Comments
 (0)