Skip to content

Commit 6dac8c8

Browse files
authored
Added failing test for #353 and fixed bug (#354)
1 parent d0f49bc commit 6dac8c8

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -961,10 +961,11 @@ impl<T, const N: usize> SmallVec<T, N> {
961961
// SAFETY: see above
962962
debug_assert!(self.spilled());
963963
let len = self.len();
964-
let (ptr, cap) = self.raw.heap;
964+
let cap = self.raw.heap.1;
965965
if len == cap {
966966
self.reserve(1);
967967
}
968+
let ptr = self.raw.heap.0;
968969
ptr.as_ptr().add(len).write(value);
969970
self.set_len(len + 1)
970971
}

src/tests.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,3 +1128,23 @@ fn max_insert() {
11281128
let mut sv: SmallVec<i32, 2> = smallvec![0];
11291129
sv.insert(usize::MAX, 0);
11301130
}
1131+
1132+
#[test]
1133+
fn collect_from_iter() {
1134+
// Regression test for https://github.com/servo/rust-smallvec/issues/353
1135+
struct IterNoHint<I: Iterator>(I);
1136+
1137+
impl<I: Iterator> Iterator for IterNoHint<I> {
1138+
type Item = I::Item;
1139+
fn next(&mut self) -> Option<Self::Item> { self.0.next() }
1140+
1141+
// no implementation of size_hint means it returns (0, None) - which forces from_iter to
1142+
// grow the allocated space iteratively.
1143+
}
1144+
1145+
// A length of 3 is fine to trigger this bug under valgrind, but making the vector 1 million
1146+
// elements makes it crash - which is much easier to detect.
1147+
let iter = IterNoHint(std::iter::repeat(1u8).take(1_000_000));
1148+
1149+
let _y: SmallVec<u8, 1> = SmallVec::from_iter(iter);
1150+
}

0 commit comments

Comments
 (0)