Skip to content

Commit 3ae8953

Browse files
committed
auto merge of rust-lang#9557 : blake2-ppc/rust/vec-lifetime-token, r=thestinger
std::vec: Use a valid value as lifetime dummy in iterator The current implementation uses `&v[0]` for the lifetime struct field, but that is a dangling pointer for iterators derived from zero-length slices. Example: let v: [int, ..0] = []; println!("{:?}", v.iter()) std::vec::VecIterator<,int>{ptr: (0x7f3768626100 as *()), end: (0x7f3768626100 as *()), lifetime: &139875951207128} To replace this parameter, use a field of type `Option<&'self ()>` that is simply initialized with `None`, but still allows the iterator to have a lifetime parameter.
2 parents 6828d2e + c0e1c09 commit 3ae8953

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

src/libstd/vec.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -932,11 +932,11 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
932932
if sys::size_of::<T>() == 0 {
933933
VecIterator{ptr: p,
934934
end: (p as uint + self.len()) as *T,
935-
lifetime: cast::transmute(p)}
935+
lifetime: None}
936936
} else {
937937
VecIterator{ptr: p,
938938
end: p.offset(self.len() as int),
939-
lifetime: cast::transmute(p)}
939+
lifetime: None}
940940
}
941941
}
942942
}
@@ -1940,11 +1940,11 @@ impl<'self,T> MutableVector<'self, T> for &'self mut [T] {
19401940
if sys::size_of::<T>() == 0 {
19411941
VecMutIterator{ptr: p,
19421942
end: (p as uint + self.len()) as *mut T,
1943-
lifetime: cast::transmute(p)}
1943+
lifetime: None}
19441944
} else {
19451945
VecMutIterator{ptr: p,
19461946
end: p.offset(self.len() as int),
1947-
lifetime: cast::transmute(p)}
1947+
lifetime: None}
19481948
}
19491949
}
19501950
}
@@ -2389,7 +2389,7 @@ impl<'self, T> RandomAccessIterator<&'self T> for VecIterator<'self, T> {
23892389
pub struct VecIterator<'self, T> {
23902390
priv ptr: *T,
23912391
priv end: *T,
2392-
priv lifetime: &'self T // FIXME: #5922
2392+
priv lifetime: Option<&'self ()> // FIXME: #5922
23932393
}
23942394
iterator!{impl VecIterator -> &'self T}
23952395
double_ended_iterator!{impl VecIterator -> &'self T}
@@ -2407,7 +2407,7 @@ impl<'self, T> Clone for VecIterator<'self, T> {
24072407
pub struct VecMutIterator<'self, T> {
24082408
priv ptr: *mut T,
24092409
priv end: *mut T,
2410-
priv lifetime: &'self mut T // FIXME: #5922
2410+
priv lifetime: Option<&'self mut ()> // FIXME: #5922
24112411
}
24122412
iterator!{impl VecMutIterator -> &'self mut T}
24132413
double_ended_iterator!{impl VecMutIterator -> &'self mut T}

0 commit comments

Comments
 (0)