@@ -884,17 +884,20 @@ macro_rules! iterator {
884884 if self . ptr == self . end {
885885 None
886886 } else {
887- let old = self . ptr;
888- self . ptr = if mem:: size_of:: <T >( ) == 0 {
887+ if mem:: size_of:: <T >( ) == 0 {
889888 // purposefully don't use 'ptr.offset' because for
890889 // vectors with 0-size elements this would return the
891890 // 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) )
893895 } else {
894- self . ptr. offset ( 1 )
895- } ;
896+ let old = self . ptr;
897+ self . ptr = self . ptr . offset ( 1 ) ;
896898
897- Some ( transmute( old) )
899+ Some ( transmute( old) )
900+ }
898901 }
899902 }
900903 }
@@ -916,13 +919,17 @@ macro_rules! iterator {
916919 if self . end == self . ptr {
917920 None
918921 } else {
919- self . end = if mem:: size_of:: <T >( ) == 0 {
922+ if mem:: size_of:: <T >( ) == 0 {
920923 // 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) )
922928 } 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+ }
926933 }
927934 }
928935 }
@@ -956,7 +963,12 @@ impl<'a, T> RandomAccessIterator<&'a T> for Items<'a, T> {
956963 fn idx ( & mut self , index : uint ) -> Option < & ' a T > {
957964 unsafe {
958965 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+ }
960972 } else {
961973 None
962974 }
0 commit comments