]> git.lizzy.rs Git - rust.git/commitdiff
sort: Guard the fast path by length check
authorUlrik Sverdrup <bluss@users.noreply.github.com>
Sat, 7 Nov 2015 17:09:20 +0000 (18:09 +0100)
committerUlrik Sverdrup <bluss@users.noreply.github.com>
Sat, 7 Nov 2015 17:09:20 +0000 (18:09 +0100)
The right part must not be empty.

src/libcollections/slice.rs

index cb3f39e0cac4b2c187da438cbd6dccd8c2895964..9ea3389e81cc461478635479c93b6e6198b6adab 100644 (file)
@@ -1066,10 +1066,12 @@ fn merge_sort<T, F>(v: &mut [T], mut compare: F) where F: FnMut(&T, &T) -> Order
                 let mut out = buf_tmp.offset(start as isize);
                 let out_end = buf_tmp.offset(right_end_idx as isize);
 
-                // if left[last] <= right[0], they are already in order:
+                // If left[last] <= right[0], they are already in order:
                 // fast-forward the left side (the right side is handled
                 // in the loop).
-                if compare(&*right.offset(-1), &*right) != Greater {
+                // If `right` is not empty then left is not empty, and
+                // the offsets are in bounds.
+                if right != right_end && compare(&*right.offset(-1), &*right) != Greater {
                     let elems = (right_start as usize - left as usize) / mem::size_of::<T>();
                     ptr::copy_nonoverlapping(&*left, out, elems);
                     out = out.offset(elems as isize);