@@ -473,8 +473,10 @@ impl<T> Vec<T> {
473
473
let begin = ptr as * const T ;
474
474
let end = if mem:: size_of :: < T > ( ) == 0 {
475
475
( ptr as usize + self . len ( ) ) as * const T
476
+ } else if self . cap == 0 {
477
+ begin
476
478
} else {
477
- ptr . offset ( self . len ( ) as isize ) as * const T
479
+ begin . offset ( self . len ( ) as isize )
478
480
} ;
479
481
mem:: forget ( self ) ;
480
482
IntoIter { allocation : ptr, cap : cap, ptr : begin, end : end }
@@ -772,6 +774,8 @@ impl<T> Vec<T> {
772
774
let begin = * self . ptr as * const T ;
773
775
let end = if mem:: size_of :: < T > ( ) == 0 {
774
776
( * self . ptr as usize + self . len ( ) ) as * const T
777
+ } else if self . cap == 0 {
778
+ begin
775
779
} else {
776
780
( * self . ptr ) . offset ( self . len ( ) as isize ) as * const T
777
781
} ;
@@ -883,16 +887,23 @@ impl<T> Vec<T> {
883
887
//
884
888
// 2) If the size of the elements in the vector is >1, the `usize` ->
885
889
// `isize` conversion can't overflow.
886
- let offset = vec. len ( ) as isize ;
887
890
let start = vec. as_mut_ptr ( ) ;
888
891
892
+ let end = if vec. cap == 0 {
893
+ start
894
+ } else {
895
+ unsafe {
896
+ start. offset ( vec. len ( ) as isize )
897
+ }
898
+ } ;
899
+
889
900
let mut pv = PartialVecNonZeroSized {
890
901
vec : vec,
891
902
892
903
start_t : start,
893
904
// This points inside the vector, as the vector has length
894
905
// `offset`.
895
- end_t : unsafe { start . offset ( offset ) } ,
906
+ end_t : end ,
896
907
start_u : start as * mut U ,
897
908
end_u : start as * mut U ,
898
909
@@ -1054,17 +1065,18 @@ impl<T> Vec<T> {
1054
1065
assert ! ( at <= self . len( ) , "`at` out of bounds" ) ;
1055
1066
1056
1067
let other_len = self . len - at;
1068
+ let ptr = if self . cap == 0 {
1069
+ self . as_ptr ( )
1070
+ } else {
1071
+ self . as_ptr ( ) . offset ( at as isize )
1072
+ } ;
1057
1073
let mut other = Vec :: with_capacity ( other_len) ;
1058
1074
1059
1075
// Unsafely `set_len` and copy items to `other`.
1060
1076
unsafe {
1061
1077
self . set_len ( at) ;
1062
1078
other. set_len ( other_len) ;
1063
-
1064
- ptr:: copy_nonoverlapping (
1065
- self . as_ptr ( ) . offset ( at as isize ) ,
1066
- other. as_mut_ptr ( ) ,
1067
- other. len ( ) ) ;
1079
+ ptr:: copy_nonoverlapping ( ptr, other. as_mut_ptr ( ) , other. len ( ) ) ;
1068
1080
}
1069
1081
other
1070
1082
}
0 commit comments