@@ -884,17 +884,20 @@ macro_rules! iterator {
884
884
if self . ptr == self . end {
885
885
None
886
886
} else {
887
- let old = self . ptr;
888
- self . ptr = if mem:: size_of:: <T >( ) == 0 {
887
+ if mem:: size_of:: <T >( ) == 0 {
889
888
// purposefully don't use 'ptr.offset' because for
890
889
// vectors with 0-size elements this would return the
891
890
// same pointer.
892
- transmute( self . ptr as uint + 1 )
891
+ self . ptr = transmute( self . ptr as uint + 1 ) ;
892
+
893
+ // Use a non-null pointer value
894
+ Some ( transmute( 1 u) )
893
895
} else {
894
- self . ptr. offset ( 1 )
895
- } ;
896
+ let old = self . ptr;
897
+ self . ptr = self . ptr . offset ( 1 ) ;
896
898
897
- Some ( transmute( old) )
899
+ Some ( transmute( old) )
900
+ }
898
901
}
899
902
}
900
903
}
@@ -916,13 +919,17 @@ macro_rules! iterator {
916
919
if self . end == self . ptr {
917
920
None
918
921
} else {
919
- self . end = if mem:: size_of:: <T >( ) == 0 {
922
+ if mem:: size_of:: <T >( ) == 0 {
920
923
// See above for why 'ptr.offset' isn't used
921
- transmute( self . end as uint - 1 )
924
+ self . end = transmute( self . end as uint - 1 ) ;
925
+
926
+ // Use a non-null pointer value
927
+ Some ( transmute( 1 u) )
922
928
} else {
923
- self . end. offset( -1 )
924
- } ;
925
- Some ( transmute( self . end) )
929
+ self . end = self . end. offset( -1 ) ;
930
+
931
+ Some ( transmute( self . end) )
932
+ }
926
933
}
927
934
}
928
935
}
@@ -956,7 +963,12 @@ impl<'a, T> RandomAccessIterator<&'a T> for Items<'a, T> {
956
963
fn idx ( & mut self , index : uint ) -> Option < & ' a T > {
957
964
unsafe {
958
965
if index < self . indexable ( ) {
959
- transmute ( self . ptr . offset ( index as int ) )
966
+ if mem:: size_of :: < T > ( ) == 0 {
967
+ // Use a non-null pointer value
968
+ Some ( transmute ( 1 u) )
969
+ } else {
970
+ Some ( transmute ( self . ptr . offset ( index as int ) ) )
971
+ }
960
972
} else {
961
973
None
962
974
}
0 commit comments