]> git.lizzy.rs Git - rust.git/blob - library/alloc/tests/vec.rs
Move vec-cycle test
[rust.git] / library / alloc / tests / vec.rs
1 use std::borrow::Cow;
2 use std::cell::Cell;
3 use std::collections::TryReserveError::*;
4 use std::fmt::Debug;
5 use std::iter::InPlaceIterable;
6 use std::mem::size_of;
7 use std::ops::Bound::*;
8 use std::panic::{catch_unwind, AssertUnwindSafe};
9 use std::rc::Rc;
10 use std::vec::{Drain, IntoIter};
11
12 struct DropCounter<'a> {
13     count: &'a mut u32,
14 }
15
16 impl Drop for DropCounter<'_> {
17     fn drop(&mut self) {
18         *self.count += 1;
19     }
20 }
21
22 #[test]
23 fn test_small_vec_struct() {
24     assert_eq!(size_of::<Vec<u8>>(), size_of::<usize>() * 3);
25 }
26
27 #[test]
28 fn test_double_drop() {
29     struct TwoVec<T> {
30         x: Vec<T>,
31         y: Vec<T>,
32     }
33
34     let (mut count_x, mut count_y) = (0, 0);
35     {
36         let mut tv = TwoVec { x: Vec::new(), y: Vec::new() };
37         tv.x.push(DropCounter { count: &mut count_x });
38         tv.y.push(DropCounter { count: &mut count_y });
39
40         // If Vec had a drop flag, here is where it would be zeroed.
41         // Instead, it should rely on its internal state to prevent
42         // doing anything significant when dropped multiple times.
43         drop(tv.x);
44
45         // Here tv goes out of scope, tv.y should be dropped, but not tv.x.
46     }
47
48     assert_eq!(count_x, 1);
49     assert_eq!(count_y, 1);
50 }
51
52 #[test]
53 fn test_reserve() {
54     let mut v = Vec::new();
55     assert_eq!(v.capacity(), 0);
56
57     v.reserve(2);
58     assert!(v.capacity() >= 2);
59
60     for i in 0..16 {
61         v.push(i);
62     }
63
64     assert!(v.capacity() >= 16);
65     v.reserve(16);
66     assert!(v.capacity() >= 32);
67
68     v.push(16);
69
70     v.reserve(16);
71     assert!(v.capacity() >= 33)
72 }
73
74 #[test]
75 fn test_zst_capacity() {
76     assert_eq!(Vec::<()>::new().capacity(), usize::MAX);
77 }
78
79 #[test]
80 fn test_indexing() {
81     let v: Vec<isize> = vec![10, 20];
82     assert_eq!(v[0], 10);
83     assert_eq!(v[1], 20);
84     let mut x: usize = 0;
85     assert_eq!(v[x], 10);
86     assert_eq!(v[x + 1], 20);
87     x = x + 1;
88     assert_eq!(v[x], 20);
89     assert_eq!(v[x - 1], 10);
90 }
91
92 #[test]
93 fn test_debug_fmt() {
94     let vec1: Vec<isize> = vec![];
95     assert_eq!("[]", format!("{:?}", vec1));
96
97     let vec2 = vec![0, 1];
98     assert_eq!("[0, 1]", format!("{:?}", vec2));
99
100     let slice: &[isize] = &[4, 5];
101     assert_eq!("[4, 5]", format!("{:?}", slice));
102 }
103
104 #[test]
105 fn test_push() {
106     let mut v = vec![];
107     v.push(1);
108     assert_eq!(v, [1]);
109     v.push(2);
110     assert_eq!(v, [1, 2]);
111     v.push(3);
112     assert_eq!(v, [1, 2, 3]);
113 }
114
115 #[test]
116 fn test_extend() {
117     let mut v = Vec::new();
118     let mut w = Vec::new();
119
120     v.extend(w.clone());
121     assert_eq!(v, &[]);
122
123     v.extend(0..3);
124     for i in 0..3 {
125         w.push(i)
126     }
127
128     assert_eq!(v, w);
129
130     v.extend(3..10);
131     for i in 3..10 {
132         w.push(i)
133     }
134
135     assert_eq!(v, w);
136
137     v.extend(w.clone()); // specializes to `append`
138     assert!(v.iter().eq(w.iter().chain(w.iter())));
139
140     // Zero sized types
141     #[derive(PartialEq, Debug)]
142     struct Foo;
143
144     let mut a = Vec::new();
145     let b = vec![Foo, Foo];
146
147     a.extend(b);
148     assert_eq!(a, &[Foo, Foo]);
149
150     // Double drop
151     let mut count_x = 0;
152     {
153         let mut x = Vec::new();
154         let y = vec![DropCounter { count: &mut count_x }];
155         x.extend(y);
156     }
157     assert_eq!(count_x, 1);
158 }
159
160 #[test]
161 fn test_extend_from_slice() {
162     let a: Vec<isize> = vec![1, 2, 3, 4, 5];
163     let b: Vec<isize> = vec![6, 7, 8, 9, 0];
164
165     let mut v: Vec<isize> = a;
166
167     v.extend_from_slice(&b);
168
169     assert_eq!(v, [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);
170 }
171
172 #[test]
173 fn test_extend_ref() {
174     let mut v = vec![1, 2];
175     v.extend(&[3, 4, 5]);
176
177     assert_eq!(v.len(), 5);
178     assert_eq!(v, [1, 2, 3, 4, 5]);
179
180     let w = vec![6, 7];
181     v.extend(&w);
182
183     assert_eq!(v.len(), 7);
184     assert_eq!(v, [1, 2, 3, 4, 5, 6, 7]);
185 }
186
187 #[test]
188 fn test_slice_from_ref() {
189     let values = vec![1, 2, 3, 4, 5];
190     let slice = &values[1..3];
191
192     assert_eq!(slice, [2, 3]);
193 }
194
195 #[test]
196 fn test_slice_from_mut() {
197     let mut values = vec![1, 2, 3, 4, 5];
198     {
199         let slice = &mut values[2..];
200         assert!(slice == [3, 4, 5]);
201         for p in slice {
202             *p += 2;
203         }
204     }
205
206     assert!(values == [1, 2, 5, 6, 7]);
207 }
208
209 #[test]
210 fn test_slice_to_mut() {
211     let mut values = vec![1, 2, 3, 4, 5];
212     {
213         let slice = &mut values[..2];
214         assert!(slice == [1, 2]);
215         for p in slice {
216             *p += 1;
217         }
218     }
219
220     assert!(values == [2, 3, 3, 4, 5]);
221 }
222
223 #[test]
224 fn test_split_at_mut() {
225     let mut values = vec![1, 2, 3, 4, 5];
226     {
227         let (left, right) = values.split_at_mut(2);
228         {
229             let left: &[_] = left;
230             assert!(&left[..left.len()] == &[1, 2]);
231         }
232         for p in left {
233             *p += 1;
234         }
235
236         {
237             let right: &[_] = right;
238             assert!(&right[..right.len()] == &[3, 4, 5]);
239         }
240         for p in right {
241             *p += 2;
242         }
243     }
244
245     assert_eq!(values, [2, 3, 5, 6, 7]);
246 }
247
248 #[test]
249 fn test_clone() {
250     let v: Vec<i32> = vec![];
251     let w = vec![1, 2, 3];
252
253     assert_eq!(v, v.clone());
254
255     let z = w.clone();
256     assert_eq!(w, z);
257     // they should be disjoint in memory.
258     assert!(w.as_ptr() != z.as_ptr())
259 }
260
261 #[test]
262 fn test_clone_from() {
263     let mut v = vec![];
264     let three: Vec<Box<_>> = vec![box 1, box 2, box 3];
265     let two: Vec<Box<_>> = vec![box 4, box 5];
266     // zero, long
267     v.clone_from(&three);
268     assert_eq!(v, three);
269
270     // equal
271     v.clone_from(&three);
272     assert_eq!(v, three);
273
274     // long, short
275     v.clone_from(&two);
276     assert_eq!(v, two);
277
278     // short, long
279     v.clone_from(&three);
280     assert_eq!(v, three)
281 }
282
283 #[test]
284 fn test_retain() {
285     let mut vec = vec![1, 2, 3, 4];
286     vec.retain(|&x| x % 2 == 0);
287     assert_eq!(vec, [2, 4]);
288 }
289
290 #[test]
291 fn test_dedup() {
292     fn case(a: Vec<i32>, b: Vec<i32>) {
293         let mut v = a;
294         v.dedup();
295         assert_eq!(v, b);
296     }
297     case(vec![], vec![]);
298     case(vec![1], vec![1]);
299     case(vec![1, 1], vec![1]);
300     case(vec![1, 2, 3], vec![1, 2, 3]);
301     case(vec![1, 1, 2, 3], vec![1, 2, 3]);
302     case(vec![1, 2, 2, 3], vec![1, 2, 3]);
303     case(vec![1, 2, 3, 3], vec![1, 2, 3]);
304     case(vec![1, 1, 2, 2, 2, 3, 3], vec![1, 2, 3]);
305 }
306
307 #[test]
308 fn test_dedup_by_key() {
309     fn case(a: Vec<i32>, b: Vec<i32>) {
310         let mut v = a;
311         v.dedup_by_key(|i| *i / 10);
312         assert_eq!(v, b);
313     }
314     case(vec![], vec![]);
315     case(vec![10], vec![10]);
316     case(vec![10, 11], vec![10]);
317     case(vec![10, 20, 30], vec![10, 20, 30]);
318     case(vec![10, 11, 20, 30], vec![10, 20, 30]);
319     case(vec![10, 20, 21, 30], vec![10, 20, 30]);
320     case(vec![10, 20, 30, 31], vec![10, 20, 30]);
321     case(vec![10, 11, 20, 21, 22, 30, 31], vec![10, 20, 30]);
322 }
323
324 #[test]
325 fn test_dedup_by() {
326     let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"];
327     vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b));
328
329     assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
330
331     let mut vec = vec![("foo", 1), ("foo", 2), ("bar", 3), ("bar", 4), ("bar", 5)];
332     vec.dedup_by(|a, b| {
333         a.0 == b.0 && {
334             b.1 += a.1;
335             true
336         }
337     });
338
339     assert_eq!(vec, [("foo", 3), ("bar", 12)]);
340 }
341
342 #[test]
343 fn test_dedup_unique() {
344     let mut v0: Vec<Box<_>> = vec![box 1, box 1, box 2, box 3];
345     v0.dedup();
346     let mut v1: Vec<Box<_>> = vec![box 1, box 2, box 2, box 3];
347     v1.dedup();
348     let mut v2: Vec<Box<_>> = vec![box 1, box 2, box 3, box 3];
349     v2.dedup();
350     // If the boxed pointers were leaked or otherwise misused, valgrind
351     // and/or rt should raise errors.
352 }
353
354 #[test]
355 fn zero_sized_values() {
356     let mut v = Vec::new();
357     assert_eq!(v.len(), 0);
358     v.push(());
359     assert_eq!(v.len(), 1);
360     v.push(());
361     assert_eq!(v.len(), 2);
362     assert_eq!(v.pop(), Some(()));
363     assert_eq!(v.pop(), Some(()));
364     assert_eq!(v.pop(), None);
365
366     assert_eq!(v.iter().count(), 0);
367     v.push(());
368     assert_eq!(v.iter().count(), 1);
369     v.push(());
370     assert_eq!(v.iter().count(), 2);
371
372     for &() in &v {}
373
374     assert_eq!(v.iter_mut().count(), 2);
375     v.push(());
376     assert_eq!(v.iter_mut().count(), 3);
377     v.push(());
378     assert_eq!(v.iter_mut().count(), 4);
379
380     for &mut () in &mut v {}
381     unsafe {
382         v.set_len(0);
383     }
384     assert_eq!(v.iter_mut().count(), 0);
385 }
386
387 #[test]
388 fn test_partition() {
389     assert_eq!(vec![].into_iter().partition(|x: &i32| *x < 3), (vec![], vec![]));
390     assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 4), (vec![1, 2, 3], vec![]));
391     assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 2), (vec![1], vec![2, 3]));
392     assert_eq!(vec![1, 2, 3].into_iter().partition(|x| *x < 0), (vec![], vec![1, 2, 3]));
393 }
394
395 #[test]
396 fn test_zip_unzip() {
397     let z1 = vec![(1, 4), (2, 5), (3, 6)];
398
399     let (left, right): (Vec<_>, Vec<_>) = z1.iter().cloned().unzip();
400
401     assert_eq!((1, 4), (left[0], right[0]));
402     assert_eq!((2, 5), (left[1], right[1]));
403     assert_eq!((3, 6), (left[2], right[2]));
404 }
405
406 #[test]
407 fn test_cmp() {
408     let x: &[isize] = &[1, 2, 3, 4, 5];
409     let cmp: &[isize] = &[1, 2, 3, 4, 5];
410     assert_eq!(&x[..], cmp);
411     let cmp: &[isize] = &[3, 4, 5];
412     assert_eq!(&x[2..], cmp);
413     let cmp: &[isize] = &[1, 2, 3];
414     assert_eq!(&x[..3], cmp);
415     let cmp: &[isize] = &[2, 3, 4];
416     assert_eq!(&x[1..4], cmp);
417
418     let x: Vec<isize> = vec![1, 2, 3, 4, 5];
419     let cmp: &[isize] = &[1, 2, 3, 4, 5];
420     assert_eq!(&x[..], cmp);
421     let cmp: &[isize] = &[3, 4, 5];
422     assert_eq!(&x[2..], cmp);
423     let cmp: &[isize] = &[1, 2, 3];
424     assert_eq!(&x[..3], cmp);
425     let cmp: &[isize] = &[2, 3, 4];
426     assert_eq!(&x[1..4], cmp);
427 }
428
429 #[test]
430 fn test_vec_truncate_drop() {
431     static mut DROPS: u32 = 0;
432     struct Elem(i32);
433     impl Drop for Elem {
434         fn drop(&mut self) {
435             unsafe {
436                 DROPS += 1;
437             }
438         }
439     }
440
441     let mut v = vec![Elem(1), Elem(2), Elem(3), Elem(4), Elem(5)];
442     assert_eq!(unsafe { DROPS }, 0);
443     v.truncate(3);
444     assert_eq!(unsafe { DROPS }, 2);
445     v.truncate(0);
446     assert_eq!(unsafe { DROPS }, 5);
447 }
448
449 #[test]
450 #[should_panic]
451 fn test_vec_truncate_fail() {
452     struct BadElem(i32);
453     impl Drop for BadElem {
454         fn drop(&mut self) {
455             let BadElem(ref mut x) = *self;
456             if *x == 0xbadbeef {
457                 panic!("BadElem panic: 0xbadbeef")
458             }
459         }
460     }
461
462     let mut v = vec![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
463     v.truncate(0);
464 }
465
466 #[test]
467 fn test_index() {
468     let vec = vec![1, 2, 3];
469     assert!(vec[1] == 2);
470 }
471
472 #[test]
473 #[should_panic]
474 fn test_index_out_of_bounds() {
475     let vec = vec![1, 2, 3];
476     let _ = vec[3];
477 }
478
479 #[test]
480 #[should_panic]
481 fn test_slice_out_of_bounds_1() {
482     let x = vec![1, 2, 3, 4, 5];
483     &x[!0..];
484 }
485
486 #[test]
487 #[should_panic]
488 fn test_slice_out_of_bounds_2() {
489     let x = vec![1, 2, 3, 4, 5];
490     &x[..6];
491 }
492
493 #[test]
494 #[should_panic]
495 fn test_slice_out_of_bounds_3() {
496     let x = vec![1, 2, 3, 4, 5];
497     &x[!0..4];
498 }
499
500 #[test]
501 #[should_panic]
502 fn test_slice_out_of_bounds_4() {
503     let x = vec![1, 2, 3, 4, 5];
504     &x[1..6];
505 }
506
507 #[test]
508 #[should_panic]
509 fn test_slice_out_of_bounds_5() {
510     let x = vec![1, 2, 3, 4, 5];
511     &x[3..2];
512 }
513
514 #[test]
515 #[should_panic]
516 fn test_swap_remove_empty() {
517     let mut vec = Vec::<i32>::new();
518     vec.swap_remove(0);
519 }
520
521 #[test]
522 fn test_move_items() {
523     let vec = vec![1, 2, 3];
524     let mut vec2 = vec![];
525     for i in vec {
526         vec2.push(i);
527     }
528     assert_eq!(vec2, [1, 2, 3]);
529 }
530
531 #[test]
532 fn test_move_items_reverse() {
533     let vec = vec![1, 2, 3];
534     let mut vec2 = vec![];
535     for i in vec.into_iter().rev() {
536         vec2.push(i);
537     }
538     assert_eq!(vec2, [3, 2, 1]);
539 }
540
541 #[test]
542 fn test_move_items_zero_sized() {
543     let vec = vec![(), (), ()];
544     let mut vec2 = vec![];
545     for i in vec {
546         vec2.push(i);
547     }
548     assert_eq!(vec2, [(), (), ()]);
549 }
550
551 #[test]
552 fn test_drain_items() {
553     let mut vec = vec![1, 2, 3];
554     let mut vec2 = vec![];
555     for i in vec.drain(..) {
556         vec2.push(i);
557     }
558     assert_eq!(vec, []);
559     assert_eq!(vec2, [1, 2, 3]);
560 }
561
562 #[test]
563 fn test_drain_items_reverse() {
564     let mut vec = vec![1, 2, 3];
565     let mut vec2 = vec![];
566     for i in vec.drain(..).rev() {
567         vec2.push(i);
568     }
569     assert_eq!(vec, []);
570     assert_eq!(vec2, [3, 2, 1]);
571 }
572
573 #[test]
574 fn test_drain_items_zero_sized() {
575     let mut vec = vec![(), (), ()];
576     let mut vec2 = vec![];
577     for i in vec.drain(..) {
578         vec2.push(i);
579     }
580     assert_eq!(vec, []);
581     assert_eq!(vec2, [(), (), ()]);
582 }
583
584 #[test]
585 #[should_panic]
586 fn test_drain_out_of_bounds() {
587     let mut v = vec![1, 2, 3, 4, 5];
588     v.drain(5..6);
589 }
590
591 #[test]
592 fn test_drain_range() {
593     let mut v = vec![1, 2, 3, 4, 5];
594     for _ in v.drain(4..) {}
595     assert_eq!(v, &[1, 2, 3, 4]);
596
597     let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect();
598     for _ in v.drain(1..4) {}
599     assert_eq!(v, &[1.to_string(), 5.to_string()]);
600
601     let mut v: Vec<_> = (1..6).map(|x| x.to_string()).collect();
602     for _ in v.drain(1..4).rev() {}
603     assert_eq!(v, &[1.to_string(), 5.to_string()]);
604
605     let mut v: Vec<_> = vec![(); 5];
606     for _ in v.drain(1..4).rev() {}
607     assert_eq!(v, &[(), ()]);
608 }
609
610 #[test]
611 fn test_drain_inclusive_range() {
612     let mut v = vec!['a', 'b', 'c', 'd', 'e'];
613     for _ in v.drain(1..=3) {}
614     assert_eq!(v, &['a', 'e']);
615
616     let mut v: Vec<_> = (0..=5).map(|x| x.to_string()).collect();
617     for _ in v.drain(1..=5) {}
618     assert_eq!(v, &["0".to_string()]);
619
620     let mut v: Vec<String> = (0..=5).map(|x| x.to_string()).collect();
621     for _ in v.drain(0..=5) {}
622     assert_eq!(v, Vec::<String>::new());
623
624     let mut v: Vec<_> = (0..=5).map(|x| x.to_string()).collect();
625     for _ in v.drain(0..=3) {}
626     assert_eq!(v, &["4".to_string(), "5".to_string()]);
627
628     let mut v: Vec<_> = (0..=1).map(|x| x.to_string()).collect();
629     for _ in v.drain(..=0) {}
630     assert_eq!(v, &["1".to_string()]);
631 }
632
633 #[test]
634 fn test_drain_max_vec_size() {
635     let mut v = Vec::<()>::with_capacity(usize::MAX);
636     unsafe {
637         v.set_len(usize::MAX);
638     }
639     for _ in v.drain(usize::MAX - 1..) {}
640     assert_eq!(v.len(), usize::MAX - 1);
641
642     let mut v = Vec::<()>::with_capacity(usize::MAX);
643     unsafe {
644         v.set_len(usize::MAX);
645     }
646     for _ in v.drain(usize::MAX - 1..=usize::MAX - 1) {}
647     assert_eq!(v.len(), usize::MAX - 1);
648 }
649
650 #[test]
651 #[should_panic]
652 fn test_drain_index_overflow() {
653     let mut v = Vec::<()>::with_capacity(usize::MAX);
654     unsafe {
655         v.set_len(usize::MAX);
656     }
657     v.drain(0..=usize::MAX);
658 }
659
660 #[test]
661 #[should_panic]
662 fn test_drain_inclusive_out_of_bounds() {
663     let mut v = vec![1, 2, 3, 4, 5];
664     v.drain(5..=5);
665 }
666
667 #[test]
668 #[should_panic]
669 fn test_drain_start_overflow() {
670     let mut v = vec![1, 2, 3];
671     v.drain((Excluded(usize::MAX), Included(0)));
672 }
673
674 #[test]
675 #[should_panic]
676 fn test_drain_end_overflow() {
677     let mut v = vec![1, 2, 3];
678     v.drain((Included(0), Included(usize::MAX)));
679 }
680
681 #[test]
682 fn test_drain_leak() {
683     static mut DROPS: i32 = 0;
684
685     #[derive(Debug, PartialEq)]
686     struct D(u32, bool);
687
688     impl Drop for D {
689         fn drop(&mut self) {
690             unsafe {
691                 DROPS += 1;
692             }
693
694             if self.1 {
695                 panic!("panic in `drop`");
696             }
697         }
698     }
699
700     let mut v = vec![
701         D(0, false),
702         D(1, false),
703         D(2, false),
704         D(3, false),
705         D(4, true),
706         D(5, false),
707         D(6, false),
708     ];
709
710     catch_unwind(AssertUnwindSafe(|| {
711         v.drain(2..=5);
712     }))
713     .ok();
714
715     assert_eq!(unsafe { DROPS }, 4);
716     assert_eq!(v, vec![D(0, false), D(1, false), D(6, false),]);
717 }
718
719 #[test]
720 fn test_splice() {
721     let mut v = vec![1, 2, 3, 4, 5];
722     let a = [10, 11, 12];
723     v.splice(2..4, a.iter().cloned());
724     assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
725     v.splice(1..3, Some(20));
726     assert_eq!(v, &[1, 20, 11, 12, 5]);
727 }
728
729 #[test]
730 fn test_splice_inclusive_range() {
731     let mut v = vec![1, 2, 3, 4, 5];
732     let a = [10, 11, 12];
733     let t1: Vec<_> = v.splice(2..=3, a.iter().cloned()).collect();
734     assert_eq!(v, &[1, 2, 10, 11, 12, 5]);
735     assert_eq!(t1, &[3, 4]);
736     let t2: Vec<_> = v.splice(1..=2, Some(20)).collect();
737     assert_eq!(v, &[1, 20, 11, 12, 5]);
738     assert_eq!(t2, &[2, 10]);
739 }
740
741 #[test]
742 #[should_panic]
743 fn test_splice_out_of_bounds() {
744     let mut v = vec![1, 2, 3, 4, 5];
745     let a = [10, 11, 12];
746     v.splice(5..6, a.iter().cloned());
747 }
748
749 #[test]
750 #[should_panic]
751 fn test_splice_inclusive_out_of_bounds() {
752     let mut v = vec![1, 2, 3, 4, 5];
753     let a = [10, 11, 12];
754     v.splice(5..=5, a.iter().cloned());
755 }
756
757 #[test]
758 fn test_splice_items_zero_sized() {
759     let mut vec = vec![(), (), ()];
760     let vec2 = vec![];
761     let t: Vec<_> = vec.splice(1..2, vec2.iter().cloned()).collect();
762     assert_eq!(vec, &[(), ()]);
763     assert_eq!(t, &[()]);
764 }
765
766 #[test]
767 fn test_splice_unbounded() {
768     let mut vec = vec![1, 2, 3, 4, 5];
769     let t: Vec<_> = vec.splice(.., None).collect();
770     assert_eq!(vec, &[]);
771     assert_eq!(t, &[1, 2, 3, 4, 5]);
772 }
773
774 #[test]
775 fn test_splice_forget() {
776     let mut v = vec![1, 2, 3, 4, 5];
777     let a = [10, 11, 12];
778     std::mem::forget(v.splice(2..4, a.iter().cloned()));
779     assert_eq!(v, &[1, 2]);
780 }
781
782 #[test]
783 fn test_into_boxed_slice() {
784     let xs = vec![1, 2, 3];
785     let ys = xs.into_boxed_slice();
786     assert_eq!(&*ys, [1, 2, 3]);
787 }
788
789 #[test]
790 fn test_append() {
791     let mut vec = vec![1, 2, 3];
792     let mut vec2 = vec![4, 5, 6];
793     vec.append(&mut vec2);
794     assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
795     assert_eq!(vec2, []);
796 }
797
798 #[test]
799 fn test_split_off() {
800     let mut vec = vec![1, 2, 3, 4, 5, 6];
801     let orig_capacity = vec.capacity();
802     let vec2 = vec.split_off(4);
803     assert_eq!(vec, [1, 2, 3, 4]);
804     assert_eq!(vec2, [5, 6]);
805     assert_eq!(vec.capacity(), orig_capacity);
806 }
807
808 #[test]
809 fn test_split_off_take_all() {
810     let mut vec = vec![1, 2, 3, 4, 5, 6];
811     let orig_ptr = vec.as_ptr();
812     let orig_capacity = vec.capacity();
813     let vec2 = vec.split_off(0);
814     assert_eq!(vec, []);
815     assert_eq!(vec2, [1, 2, 3, 4, 5, 6]);
816     assert_eq!(vec.capacity(), orig_capacity);
817     assert_eq!(vec2.as_ptr(), orig_ptr);
818 }
819
820 #[test]
821 fn test_into_iter_as_slice() {
822     let vec = vec!['a', 'b', 'c'];
823     let mut into_iter = vec.into_iter();
824     assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
825     let _ = into_iter.next().unwrap();
826     assert_eq!(into_iter.as_slice(), &['b', 'c']);
827     let _ = into_iter.next().unwrap();
828     let _ = into_iter.next().unwrap();
829     assert_eq!(into_iter.as_slice(), &[]);
830 }
831
832 #[test]
833 fn test_into_iter_as_mut_slice() {
834     let vec = vec!['a', 'b', 'c'];
835     let mut into_iter = vec.into_iter();
836     assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
837     into_iter.as_mut_slice()[0] = 'x';
838     into_iter.as_mut_slice()[1] = 'y';
839     assert_eq!(into_iter.next().unwrap(), 'x');
840     assert_eq!(into_iter.as_slice(), &['y', 'c']);
841 }
842
843 #[test]
844 fn test_into_iter_debug() {
845     let vec = vec!['a', 'b', 'c'];
846     let into_iter = vec.into_iter();
847     let debug = format!("{:?}", into_iter);
848     assert_eq!(debug, "IntoIter(['a', 'b', 'c'])");
849 }
850
851 #[test]
852 fn test_into_iter_count() {
853     assert_eq!(vec![1, 2, 3].into_iter().count(), 3);
854 }
855
856 #[test]
857 fn test_into_iter_clone() {
858     fn iter_equal<I: Iterator<Item = i32>>(it: I, slice: &[i32]) {
859         let v: Vec<i32> = it.collect();
860         assert_eq!(&v[..], slice);
861     }
862     let mut it = vec![1, 2, 3].into_iter();
863     iter_equal(it.clone(), &[1, 2, 3]);
864     assert_eq!(it.next(), Some(1));
865     let mut it = it.rev();
866     iter_equal(it.clone(), &[3, 2]);
867     assert_eq!(it.next(), Some(3));
868     iter_equal(it.clone(), &[2]);
869     assert_eq!(it.next(), Some(2));
870     iter_equal(it.clone(), &[]);
871     assert_eq!(it.next(), None);
872 }
873
874 #[test]
875 fn test_into_iter_leak() {
876     static mut DROPS: i32 = 0;
877
878     struct D(bool);
879
880     impl Drop for D {
881         fn drop(&mut self) {
882             unsafe {
883                 DROPS += 1;
884             }
885
886             if self.0 {
887                 panic!("panic in `drop`");
888             }
889         }
890     }
891
892     let v = vec![D(false), D(true), D(false)];
893
894     catch_unwind(move || drop(v.into_iter())).ok();
895
896     assert_eq!(unsafe { DROPS }, 3);
897 }
898
899 #[test]
900 fn test_from_iter_specialization() {
901     let src: Vec<usize> = vec![0usize; 1];
902     let srcptr = src.as_ptr();
903     let sink = src.into_iter().collect::<Vec<_>>();
904     let sinkptr = sink.as_ptr();
905     assert_eq!(srcptr, sinkptr);
906 }
907
908 #[test]
909 fn test_from_iter_partially_drained_in_place_specialization() {
910     let src: Vec<usize> = vec![0usize; 10];
911     let srcptr = src.as_ptr();
912     let mut iter = src.into_iter();
913     iter.next();
914     iter.next();
915     let sink = iter.collect::<Vec<_>>();
916     let sinkptr = sink.as_ptr();
917     assert_eq!(srcptr, sinkptr);
918 }
919
920 #[test]
921 fn test_from_iter_specialization_with_iterator_adapters() {
922     fn assert_in_place_trait<T: InPlaceIterable>(_: &T) {};
923     let src: Vec<usize> = vec![0usize; 256];
924     let srcptr = src.as_ptr();
925     let iter = src
926         .into_iter()
927         .enumerate()
928         .map(|i| i.0 + i.1)
929         .zip(std::iter::repeat(1usize))
930         .map(|(a, b)| a + b)
931         .map_while(Option::Some)
932         .peekable()
933         .skip(1)
934         .map(|e| std::num::NonZeroUsize::new(e));
935     assert_in_place_trait(&iter);
936     let sink = iter.collect::<Vec<_>>();
937     let sinkptr = sink.as_ptr();
938     assert_eq!(srcptr, sinkptr as *const usize);
939 }
940
941 #[test]
942 fn test_from_iter_specialization_head_tail_drop() {
943     let drop_count: Vec<_> = (0..=2).map(|_| Rc::new(())).collect();
944     let src: Vec<_> = drop_count.iter().cloned().collect();
945     let srcptr = src.as_ptr();
946     let iter = src.into_iter();
947     let sink: Vec<_> = iter.skip(1).take(1).collect();
948     let sinkptr = sink.as_ptr();
949     assert_eq!(srcptr, sinkptr, "specialization was applied");
950     assert_eq!(Rc::strong_count(&drop_count[0]), 1, "front was dropped");
951     assert_eq!(Rc::strong_count(&drop_count[1]), 2, "one element was collected");
952     assert_eq!(Rc::strong_count(&drop_count[2]), 1, "tail was dropped");
953     assert_eq!(sink.len(), 1);
954 }
955
956 #[test]
957 fn test_from_iter_specialization_panic_drop() {
958     let drop_count: Vec<_> = (0..=2).map(|_| Rc::new(())).collect();
959     let src: Vec<_> = drop_count.iter().cloned().collect();
960     let iter = src.into_iter();
961
962     let _ = std::panic::catch_unwind(AssertUnwindSafe(|| {
963         let _ = iter
964             .enumerate()
965             .filter_map(|(i, e)| {
966                 if i == 1 {
967                     std::panic!("aborting iteration");
968                 }
969                 Some(e)
970             })
971             .collect::<Vec<_>>();
972     }));
973
974     assert!(
975         drop_count.iter().map(Rc::strong_count).all(|count| count == 1),
976         "all items were dropped once"
977     );
978 }
979
980 #[test]
981 fn test_cow_from() {
982     let borrowed: &[_] = &["borrowed", "(slice)"];
983     let owned = vec!["owned", "(vec)"];
984     match (Cow::from(owned.clone()), Cow::from(borrowed)) {
985         (Cow::Owned(o), Cow::Borrowed(b)) => assert!(o == owned && b == borrowed),
986         _ => panic!("invalid `Cow::from`"),
987     }
988 }
989
990 #[test]
991 fn test_from_cow() {
992     let borrowed: &[_] = &["borrowed", "(slice)"];
993     let owned = vec!["owned", "(vec)"];
994     assert_eq!(Vec::from(Cow::Borrowed(borrowed)), vec!["borrowed", "(slice)"]);
995     assert_eq!(Vec::from(Cow::Owned(owned)), vec!["owned", "(vec)"]);
996 }
997
998 #[allow(dead_code)]
999 fn assert_covariance() {
1000     fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> {
1001         d
1002     }
1003     fn into_iter<'new>(i: IntoIter<&'static str>) -> IntoIter<&'new str> {
1004         i
1005     }
1006 }
1007
1008 #[test]
1009 fn from_into_inner() {
1010     let vec = vec![1, 2, 3];
1011     let ptr = vec.as_ptr();
1012     let vec = vec.into_iter().collect::<Vec<_>>();
1013     assert_eq!(vec, [1, 2, 3]);
1014     assert_eq!(vec.as_ptr(), ptr);
1015
1016     let ptr = &vec[1] as *const _;
1017     let mut it = vec.into_iter();
1018     it.next().unwrap();
1019     let vec = it.collect::<Vec<_>>();
1020     assert_eq!(vec, [2, 3]);
1021     assert!(ptr != vec.as_ptr());
1022 }
1023
1024 #[test]
1025 fn overaligned_allocations() {
1026     #[repr(align(256))]
1027     struct Foo(usize);
1028     let mut v = vec![Foo(273)];
1029     for i in 0..0x1000 {
1030         v.reserve_exact(i);
1031         assert!(v[0].0 == 273);
1032         assert!(v.as_ptr() as usize & 0xff == 0);
1033         v.shrink_to_fit();
1034         assert!(v[0].0 == 273);
1035         assert!(v.as_ptr() as usize & 0xff == 0);
1036     }
1037 }
1038
1039 #[test]
1040 fn drain_filter_empty() {
1041     let mut vec: Vec<i32> = vec![];
1042
1043     {
1044         let mut iter = vec.drain_filter(|_| true);
1045         assert_eq!(iter.size_hint(), (0, Some(0)));
1046         assert_eq!(iter.next(), None);
1047         assert_eq!(iter.size_hint(), (0, Some(0)));
1048         assert_eq!(iter.next(), None);
1049         assert_eq!(iter.size_hint(), (0, Some(0)));
1050     }
1051     assert_eq!(vec.len(), 0);
1052     assert_eq!(vec, vec![]);
1053 }
1054
1055 #[test]
1056 fn drain_filter_zst() {
1057     let mut vec = vec![(), (), (), (), ()];
1058     let initial_len = vec.len();
1059     let mut count = 0;
1060     {
1061         let mut iter = vec.drain_filter(|_| true);
1062         assert_eq!(iter.size_hint(), (0, Some(initial_len)));
1063         while let Some(_) = iter.next() {
1064             count += 1;
1065             assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
1066         }
1067         assert_eq!(iter.size_hint(), (0, Some(0)));
1068         assert_eq!(iter.next(), None);
1069         assert_eq!(iter.size_hint(), (0, Some(0)));
1070     }
1071
1072     assert_eq!(count, initial_len);
1073     assert_eq!(vec.len(), 0);
1074     assert_eq!(vec, vec![]);
1075 }
1076
1077 #[test]
1078 fn drain_filter_false() {
1079     let mut vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1080
1081     let initial_len = vec.len();
1082     let mut count = 0;
1083     {
1084         let mut iter = vec.drain_filter(|_| false);
1085         assert_eq!(iter.size_hint(), (0, Some(initial_len)));
1086         for _ in iter.by_ref() {
1087             count += 1;
1088         }
1089         assert_eq!(iter.size_hint(), (0, Some(0)));
1090         assert_eq!(iter.next(), None);
1091         assert_eq!(iter.size_hint(), (0, Some(0)));
1092     }
1093
1094     assert_eq!(count, 0);
1095     assert_eq!(vec.len(), initial_len);
1096     assert_eq!(vec, vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
1097 }
1098
1099 #[test]
1100 fn drain_filter_true() {
1101     let mut vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1102
1103     let initial_len = vec.len();
1104     let mut count = 0;
1105     {
1106         let mut iter = vec.drain_filter(|_| true);
1107         assert_eq!(iter.size_hint(), (0, Some(initial_len)));
1108         while let Some(_) = iter.next() {
1109             count += 1;
1110             assert_eq!(iter.size_hint(), (0, Some(initial_len - count)));
1111         }
1112         assert_eq!(iter.size_hint(), (0, Some(0)));
1113         assert_eq!(iter.next(), None);
1114         assert_eq!(iter.size_hint(), (0, Some(0)));
1115     }
1116
1117     assert_eq!(count, initial_len);
1118     assert_eq!(vec.len(), 0);
1119     assert_eq!(vec, vec![]);
1120 }
1121
1122 #[test]
1123 fn drain_filter_complex() {
1124     {
1125         //                [+xxx++++++xxxxx++++x+x++]
1126         let mut vec = vec![
1127             1, 2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36, 37,
1128             39,
1129         ];
1130
1131         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
1132         assert_eq!(removed.len(), 10);
1133         assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
1134
1135         assert_eq!(vec.len(), 14);
1136         assert_eq!(vec, vec![1, 7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]);
1137     }
1138
1139     {
1140         //                [xxx++++++xxxxx++++x+x++]
1141         let mut vec = vec![
1142             2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36, 37, 39,
1143         ];
1144
1145         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
1146         assert_eq!(removed.len(), 10);
1147         assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
1148
1149         assert_eq!(vec.len(), 13);
1150         assert_eq!(vec, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35, 37, 39]);
1151     }
1152
1153     {
1154         //                [xxx++++++xxxxx++++x+x]
1155         let mut vec =
1156             vec![2, 4, 6, 7, 9, 11, 13, 15, 17, 18, 20, 22, 24, 26, 27, 29, 31, 33, 34, 35, 36];
1157
1158         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
1159         assert_eq!(removed.len(), 10);
1160         assert_eq!(removed, vec![2, 4, 6, 18, 20, 22, 24, 26, 34, 36]);
1161
1162         assert_eq!(vec.len(), 11);
1163         assert_eq!(vec, vec![7, 9, 11, 13, 15, 17, 27, 29, 31, 33, 35]);
1164     }
1165
1166     {
1167         //                [xxxxxxxxxx+++++++++++]
1168         let mut vec = vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];
1169
1170         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
1171         assert_eq!(removed.len(), 10);
1172         assert_eq!(removed, vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
1173
1174         assert_eq!(vec.len(), 10);
1175         assert_eq!(vec, vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
1176     }
1177
1178     {
1179         //                [+++++++++++xxxxxxxxxx]
1180         let mut vec = vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20];
1181
1182         let removed = vec.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>();
1183         assert_eq!(removed.len(), 10);
1184         assert_eq!(removed, vec![2, 4, 6, 8, 10, 12, 14, 16, 18, 20]);
1185
1186         assert_eq!(vec.len(), 10);
1187         assert_eq!(vec, vec![1, 3, 5, 7, 9, 11, 13, 15, 17, 19]);
1188     }
1189 }
1190
1191 // FIXME: re-enable emscripten once it can unwind again
1192 #[test]
1193 #[cfg(not(target_os = "emscripten"))]
1194 fn drain_filter_consumed_panic() {
1195     use std::rc::Rc;
1196     use std::sync::Mutex;
1197
1198     struct Check {
1199         index: usize,
1200         drop_counts: Rc<Mutex<Vec<usize>>>,
1201     };
1202
1203     impl Drop for Check {
1204         fn drop(&mut self) {
1205             self.drop_counts.lock().unwrap()[self.index] += 1;
1206             println!("drop: {}", self.index);
1207         }
1208     }
1209
1210     let check_count = 10;
1211     let drop_counts = Rc::new(Mutex::new(vec![0_usize; check_count]));
1212     let mut data: Vec<Check> = (0..check_count)
1213         .map(|index| Check { index, drop_counts: Rc::clone(&drop_counts) })
1214         .collect();
1215
1216     let _ = std::panic::catch_unwind(move || {
1217         let filter = |c: &mut Check| {
1218             if c.index == 2 {
1219                 panic!("panic at index: {}", c.index);
1220             }
1221             // Verify that if the filter could panic again on another element
1222             // that it would not cause a double panic and all elements of the
1223             // vec would still be dropped exactly once.
1224             if c.index == 4 {
1225                 panic!("panic at index: {}", c.index);
1226             }
1227             c.index < 6
1228         };
1229         let drain = data.drain_filter(filter);
1230
1231         // NOTE: The DrainFilter is explicitly consumed
1232         drain.for_each(drop);
1233     });
1234
1235     let drop_counts = drop_counts.lock().unwrap();
1236     assert_eq!(check_count, drop_counts.len());
1237
1238     for (index, count) in drop_counts.iter().cloned().enumerate() {
1239         assert_eq!(1, count, "unexpected drop count at index: {} (count: {})", index, count);
1240     }
1241 }
1242
1243 // FIXME: Re-enable emscripten once it can catch panics
1244 #[test]
1245 #[cfg(not(target_os = "emscripten"))]
1246 fn drain_filter_unconsumed_panic() {
1247     use std::rc::Rc;
1248     use std::sync::Mutex;
1249
1250     struct Check {
1251         index: usize,
1252         drop_counts: Rc<Mutex<Vec<usize>>>,
1253     };
1254
1255     impl Drop for Check {
1256         fn drop(&mut self) {
1257             self.drop_counts.lock().unwrap()[self.index] += 1;
1258             println!("drop: {}", self.index);
1259         }
1260     }
1261
1262     let check_count = 10;
1263     let drop_counts = Rc::new(Mutex::new(vec![0_usize; check_count]));
1264     let mut data: Vec<Check> = (0..check_count)
1265         .map(|index| Check { index, drop_counts: Rc::clone(&drop_counts) })
1266         .collect();
1267
1268     let _ = std::panic::catch_unwind(move || {
1269         let filter = |c: &mut Check| {
1270             if c.index == 2 {
1271                 panic!("panic at index: {}", c.index);
1272             }
1273             // Verify that if the filter could panic again on another element
1274             // that it would not cause a double panic and all elements of the
1275             // vec would still be dropped exactly once.
1276             if c.index == 4 {
1277                 panic!("panic at index: {}", c.index);
1278             }
1279             c.index < 6
1280         };
1281         let _drain = data.drain_filter(filter);
1282
1283         // NOTE: The DrainFilter is dropped without being consumed
1284     });
1285
1286     let drop_counts = drop_counts.lock().unwrap();
1287     assert_eq!(check_count, drop_counts.len());
1288
1289     for (index, count) in drop_counts.iter().cloned().enumerate() {
1290         assert_eq!(1, count, "unexpected drop count at index: {} (count: {})", index, count);
1291     }
1292 }
1293
1294 #[test]
1295 fn drain_filter_unconsumed() {
1296     let mut vec = vec![1, 2, 3, 4];
1297     let drain = vec.drain_filter(|&mut x| x % 2 != 0);
1298     drop(drain);
1299     assert_eq!(vec, [2, 4]);
1300 }
1301
1302 #[test]
1303 fn test_reserve_exact() {
1304     // This is all the same as test_reserve
1305
1306     let mut v = Vec::new();
1307     assert_eq!(v.capacity(), 0);
1308
1309     v.reserve_exact(2);
1310     assert!(v.capacity() >= 2);
1311
1312     for i in 0..16 {
1313         v.push(i);
1314     }
1315
1316     assert!(v.capacity() >= 16);
1317     v.reserve_exact(16);
1318     assert!(v.capacity() >= 32);
1319
1320     v.push(16);
1321
1322     v.reserve_exact(16);
1323     assert!(v.capacity() >= 33)
1324 }
1325
1326 #[test]
1327 #[cfg_attr(miri, ignore)] // Miri does not support signalling OOM
1328 #[cfg_attr(target_os = "android", ignore)] // Android used in CI has a broken dlmalloc
1329 fn test_try_reserve() {
1330     // These are the interesting cases:
1331     // * exactly isize::MAX should never trigger a CapacityOverflow (can be OOM)
1332     // * > isize::MAX should always fail
1333     //    * On 16/32-bit should CapacityOverflow
1334     //    * On 64-bit should OOM
1335     // * overflow may trigger when adding `len` to `cap` (in number of elements)
1336     // * overflow may trigger when multiplying `new_cap` by size_of::<T> (to get bytes)
1337
1338     const MAX_CAP: usize = isize::MAX as usize;
1339     const MAX_USIZE: usize = usize::MAX;
1340
1341     // On 16/32-bit, we check that allocations don't exceed isize::MAX,
1342     // on 64-bit, we assume the OS will give an OOM for such a ridiculous size.
1343     // Any platform that succeeds for these requests is technically broken with
1344     // ptr::offset because LLVM is the worst.
1345     let guards_against_isize = usize::BITS < 64;
1346
1347     {
1348         // Note: basic stuff is checked by test_reserve
1349         let mut empty_bytes: Vec<u8> = Vec::new();
1350
1351         // Check isize::MAX doesn't count as an overflow
1352         if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1353             panic!("isize::MAX shouldn't trigger an overflow!");
1354         }
1355         // Play it again, frank! (just to be sure)
1356         if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP) {
1357             panic!("isize::MAX shouldn't trigger an overflow!");
1358         }
1359
1360         if guards_against_isize {
1361             // Check isize::MAX + 1 does count as overflow
1362             if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_CAP + 1) {
1363             } else {
1364                 panic!("isize::MAX + 1 should trigger an overflow!")
1365             }
1366
1367             // Check usize::MAX does count as overflow
1368             if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_USIZE) {
1369             } else {
1370                 panic!("usize::MAX should trigger an overflow!")
1371             }
1372         } else {
1373             // Check isize::MAX + 1 is an OOM
1374             if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_CAP + 1) {
1375             } else {
1376                 panic!("isize::MAX + 1 should trigger an OOM!")
1377             }
1378
1379             // Check usize::MAX is an OOM
1380             if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_USIZE) {
1381             } else {
1382                 panic!("usize::MAX should trigger an OOM!")
1383             }
1384         }
1385     }
1386
1387     {
1388         // Same basic idea, but with non-zero len
1389         let mut ten_bytes: Vec<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1390
1391         if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1392             panic!("isize::MAX shouldn't trigger an overflow!");
1393         }
1394         if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 10) {
1395             panic!("isize::MAX shouldn't trigger an overflow!");
1396         }
1397         if guards_against_isize {
1398             if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_CAP - 9) {
1399             } else {
1400                 panic!("isize::MAX + 1 should trigger an overflow!");
1401             }
1402         } else {
1403             if let Err(AllocError { .. }) = ten_bytes.try_reserve(MAX_CAP - 9) {
1404             } else {
1405                 panic!("isize::MAX + 1 should trigger an OOM!")
1406             }
1407         }
1408         // Should always overflow in the add-to-len
1409         if let Err(CapacityOverflow) = ten_bytes.try_reserve(MAX_USIZE) {
1410         } else {
1411             panic!("usize::MAX should trigger an overflow!")
1412         }
1413     }
1414
1415     {
1416         // Same basic idea, but with interesting type size
1417         let mut ten_u32s: Vec<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1418
1419         if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 10) {
1420             panic!("isize::MAX shouldn't trigger an overflow!");
1421         }
1422         if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 10) {
1423             panic!("isize::MAX shouldn't trigger an overflow!");
1424         }
1425         if guards_against_isize {
1426             if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_CAP / 4 - 9) {
1427             } else {
1428                 panic!("isize::MAX + 1 should trigger an overflow!");
1429             }
1430         } else {
1431             if let Err(AllocError { .. }) = ten_u32s.try_reserve(MAX_CAP / 4 - 9) {
1432             } else {
1433                 panic!("isize::MAX + 1 should trigger an OOM!")
1434             }
1435         }
1436         // Should fail in the mul-by-size
1437         if let Err(CapacityOverflow) = ten_u32s.try_reserve(MAX_USIZE - 20) {
1438         } else {
1439             panic!("usize::MAX should trigger an overflow!");
1440         }
1441     }
1442 }
1443
1444 #[test]
1445 #[cfg_attr(miri, ignore)] // Miri does not support signalling OOM
1446 #[cfg_attr(target_os = "android", ignore)] // Android used in CI has a broken dlmalloc
1447 fn test_try_reserve_exact() {
1448     // This is exactly the same as test_try_reserve with the method changed.
1449     // See that test for comments.
1450
1451     const MAX_CAP: usize = isize::MAX as usize;
1452     const MAX_USIZE: usize = usize::MAX;
1453
1454     let guards_against_isize = size_of::<usize>() < 8;
1455
1456     {
1457         let mut empty_bytes: Vec<u8> = Vec::new();
1458
1459         if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1460             panic!("isize::MAX shouldn't trigger an overflow!");
1461         }
1462         if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP) {
1463             panic!("isize::MAX shouldn't trigger an overflow!");
1464         }
1465
1466         if guards_against_isize {
1467             if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_CAP + 1) {
1468             } else {
1469                 panic!("isize::MAX + 1 should trigger an overflow!")
1470             }
1471
1472             if let Err(CapacityOverflow) = empty_bytes.try_reserve_exact(MAX_USIZE) {
1473             } else {
1474                 panic!("usize::MAX should trigger an overflow!")
1475             }
1476         } else {
1477             if let Err(AllocError { .. }) = empty_bytes.try_reserve_exact(MAX_CAP + 1) {
1478             } else {
1479                 panic!("isize::MAX + 1 should trigger an OOM!")
1480             }
1481
1482             if let Err(AllocError { .. }) = empty_bytes.try_reserve_exact(MAX_USIZE) {
1483             } else {
1484                 panic!("usize::MAX should trigger an OOM!")
1485             }
1486         }
1487     }
1488
1489     {
1490         let mut ten_bytes: Vec<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1491
1492         if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1493             panic!("isize::MAX shouldn't trigger an overflow!");
1494         }
1495         if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 10) {
1496             panic!("isize::MAX shouldn't trigger an overflow!");
1497         }
1498         if guards_against_isize {
1499             if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1500             } else {
1501                 panic!("isize::MAX + 1 should trigger an overflow!");
1502             }
1503         } else {
1504             if let Err(AllocError { .. }) = ten_bytes.try_reserve_exact(MAX_CAP - 9) {
1505             } else {
1506                 panic!("isize::MAX + 1 should trigger an OOM!")
1507             }
1508         }
1509         if let Err(CapacityOverflow) = ten_bytes.try_reserve_exact(MAX_USIZE) {
1510         } else {
1511             panic!("usize::MAX should trigger an overflow!")
1512         }
1513     }
1514
1515     {
1516         let mut ten_u32s: Vec<u32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1517
1518         if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 10) {
1519             panic!("isize::MAX shouldn't trigger an overflow!");
1520         }
1521         if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 10) {
1522             panic!("isize::MAX shouldn't trigger an overflow!");
1523         }
1524         if guards_against_isize {
1525             if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 9) {
1526             } else {
1527                 panic!("isize::MAX + 1 should trigger an overflow!");
1528             }
1529         } else {
1530             if let Err(AllocError { .. }) = ten_u32s.try_reserve_exact(MAX_CAP / 4 - 9) {
1531             } else {
1532                 panic!("isize::MAX + 1 should trigger an OOM!")
1533             }
1534         }
1535         if let Err(CapacityOverflow) = ten_u32s.try_reserve_exact(MAX_USIZE - 20) {
1536         } else {
1537             panic!("usize::MAX should trigger an overflow!")
1538         }
1539     }
1540 }
1541
1542 #[test]
1543 fn test_stable_pointers() {
1544     /// Pull an element from the iterator, then drop it.
1545     /// Useful to cover both the `next` and `drop` paths of an iterator.
1546     fn next_then_drop<I: Iterator>(mut i: I) {
1547         i.next().unwrap();
1548         drop(i);
1549     }
1550
1551     // Test that, if we reserved enough space, adding and removing elements does not
1552     // invalidate references into the vector (such as `v0`).  This test also
1553     // runs in Miri, which would detect such problems.
1554     // Note that this test does *not* constitute a stable guarantee that all these functions do not
1555     // reallocate! Only what is explicitly documented at
1556     // <https://doc.rust-lang.org/nightly/std/vec/struct.Vec.html#guarantees> is stably guaranteed.
1557     let mut v = Vec::with_capacity(128);
1558     v.push(13);
1559
1560     // Laundering the lifetime -- we take care that `v` does not reallocate, so that's okay.
1561     let v0 = &mut v[0];
1562     let v0 = unsafe { &mut *(v0 as *mut _) };
1563     // Now do a bunch of things and occasionally use `v0` again to assert it is still valid.
1564
1565     // Pushing/inserting and popping/removing
1566     v.push(1);
1567     v.push(2);
1568     v.insert(1, 1);
1569     assert_eq!(*v0, 13);
1570     v.remove(1);
1571     v.pop().unwrap();
1572     assert_eq!(*v0, 13);
1573     v.push(1);
1574     v.swap_remove(1);
1575     assert_eq!(v.len(), 2);
1576     v.swap_remove(1); // swap_remove the last element
1577     assert_eq!(*v0, 13);
1578
1579     // Appending
1580     v.append(&mut vec![27, 19]);
1581     assert_eq!(*v0, 13);
1582
1583     // Extending
1584     v.extend_from_slice(&[1, 2]);
1585     v.extend(&[1, 2]); // `slice::Iter` (with `T: Copy`) specialization
1586     v.extend(vec![2, 3]); // `vec::IntoIter` specialization
1587     v.extend(std::iter::once(3)); // `TrustedLen` specialization
1588     v.extend(std::iter::empty::<i32>()); // `TrustedLen` specialization with empty iterator
1589     v.extend(std::iter::once(3).filter(|_| true)); // base case
1590     v.extend(std::iter::once(&3)); // `cloned` specialization
1591     assert_eq!(*v0, 13);
1592
1593     // Truncation
1594     v.truncate(2);
1595     assert_eq!(*v0, 13);
1596
1597     // Resizing
1598     v.resize_with(v.len() + 10, || 42);
1599     assert_eq!(*v0, 13);
1600     v.resize_with(2, || panic!());
1601     assert_eq!(*v0, 13);
1602
1603     // No-op reservation
1604     v.reserve(32);
1605     v.reserve_exact(32);
1606     assert_eq!(*v0, 13);
1607
1608     // Partial draining
1609     v.resize_with(10, || 42);
1610     next_then_drop(v.drain(5..));
1611     assert_eq!(*v0, 13);
1612
1613     // Splicing
1614     v.resize_with(10, || 42);
1615     next_then_drop(v.splice(5.., vec![1, 2, 3, 4, 5])); // empty tail after range
1616     assert_eq!(*v0, 13);
1617     next_then_drop(v.splice(5..8, vec![1])); // replacement is smaller than original range
1618     assert_eq!(*v0, 13);
1619     next_then_drop(v.splice(5..6, vec![1; 10].into_iter().filter(|_| true))); // lower bound not exact
1620     assert_eq!(*v0, 13);
1621
1622     // Smoke test that would fire even outside Miri if an actual relocation happened.
1623     *v0 -= 13;
1624     assert_eq!(v[0], 0);
1625 }
1626
1627 // https://github.com/rust-lang/rust/pull/49496 introduced specialization based on:
1628 //
1629 // ```
1630 // unsafe impl<T: ?Sized> IsZero for *mut T {
1631 //     fn is_zero(&self) -> bool {
1632 //         (*self).is_null()
1633 //     }
1634 // }
1635 // ```
1636 //
1637 // … to call `RawVec::with_capacity_zeroed` for creating `Vec<*mut T>`,
1638 // which is incorrect for fat pointers since `<*mut T>::is_null` only looks at the data component.
1639 // That is, a fat pointer can be “null” without being made entirely of zero bits.
1640 #[test]
1641 fn vec_macro_repeating_null_raw_fat_pointer() {
1642     let raw_dyn = &mut (|| ()) as &mut dyn Fn() as *mut dyn Fn();
1643     let vtable = dbg!(ptr_metadata(raw_dyn));
1644     let null_raw_dyn = ptr_from_raw_parts(std::ptr::null_mut(), vtable);
1645     assert!(null_raw_dyn.is_null());
1646
1647     let vec = vec![null_raw_dyn; 1];
1648     dbg!(ptr_metadata(vec[0]));
1649     assert!(vec[0] == null_raw_dyn);
1650
1651     // Polyfill for https://github.com/rust-lang/rfcs/pull/2580
1652
1653     fn ptr_metadata(ptr: *mut dyn Fn()) -> *mut () {
1654         unsafe { std::mem::transmute::<*mut dyn Fn(), DynRepr>(ptr).vtable }
1655     }
1656
1657     fn ptr_from_raw_parts(data: *mut (), vtable: *mut ()) -> *mut dyn Fn() {
1658         unsafe { std::mem::transmute::<DynRepr, *mut dyn Fn()>(DynRepr { data, vtable }) }
1659     }
1660
1661     #[repr(C)]
1662     struct DynRepr {
1663         data: *mut (),
1664         vtable: *mut (),
1665     }
1666 }
1667
1668 // This test will likely fail if you change the capacities used in
1669 // `RawVec::grow_amortized`.
1670 #[test]
1671 fn test_push_growth_strategy() {
1672     // If the element size is 1, we jump from 0 to 8, then double.
1673     {
1674         let mut v1: Vec<u8> = vec![];
1675         assert_eq!(v1.capacity(), 0);
1676
1677         for _ in 0..8 {
1678             v1.push(0);
1679             assert_eq!(v1.capacity(), 8);
1680         }
1681
1682         for _ in 8..16 {
1683             v1.push(0);
1684             assert_eq!(v1.capacity(), 16);
1685         }
1686
1687         for _ in 16..32 {
1688             v1.push(0);
1689             assert_eq!(v1.capacity(), 32);
1690         }
1691
1692         for _ in 32..64 {
1693             v1.push(0);
1694             assert_eq!(v1.capacity(), 64);
1695         }
1696     }
1697
1698     // If the element size is 2..=1024, we jump from 0 to 4, then double.
1699     {
1700         let mut v2: Vec<u16> = vec![];
1701         let mut v1024: Vec<[u8; 1024]> = vec![];
1702         assert_eq!(v2.capacity(), 0);
1703         assert_eq!(v1024.capacity(), 0);
1704
1705         for _ in 0..4 {
1706             v2.push(0);
1707             v1024.push([0; 1024]);
1708             assert_eq!(v2.capacity(), 4);
1709             assert_eq!(v1024.capacity(), 4);
1710         }
1711
1712         for _ in 4..8 {
1713             v2.push(0);
1714             v1024.push([0; 1024]);
1715             assert_eq!(v2.capacity(), 8);
1716             assert_eq!(v1024.capacity(), 8);
1717         }
1718
1719         for _ in 8..16 {
1720             v2.push(0);
1721             v1024.push([0; 1024]);
1722             assert_eq!(v2.capacity(), 16);
1723             assert_eq!(v1024.capacity(), 16);
1724         }
1725
1726         for _ in 16..32 {
1727             v2.push(0);
1728             v1024.push([0; 1024]);
1729             assert_eq!(v2.capacity(), 32);
1730             assert_eq!(v1024.capacity(), 32);
1731         }
1732
1733         for _ in 32..64 {
1734             v2.push(0);
1735             v1024.push([0; 1024]);
1736             assert_eq!(v2.capacity(), 64);
1737             assert_eq!(v1024.capacity(), 64);
1738         }
1739     }
1740
1741     // If the element size is > 1024, we jump from 0 to 1, then double.
1742     {
1743         let mut v1025: Vec<[u8; 1025]> = vec![];
1744         assert_eq!(v1025.capacity(), 0);
1745
1746         for _ in 0..1 {
1747             v1025.push([0; 1025]);
1748             assert_eq!(v1025.capacity(), 1);
1749         }
1750
1751         for _ in 1..2 {
1752             v1025.push([0; 1025]);
1753             assert_eq!(v1025.capacity(), 2);
1754         }
1755
1756         for _ in 2..4 {
1757             v1025.push([0; 1025]);
1758             assert_eq!(v1025.capacity(), 4);
1759         }
1760
1761         for _ in 4..8 {
1762             v1025.push([0; 1025]);
1763             assert_eq!(v1025.capacity(), 8);
1764         }
1765
1766         for _ in 8..16 {
1767             v1025.push([0; 1025]);
1768             assert_eq!(v1025.capacity(), 16);
1769         }
1770
1771         for _ in 16..32 {
1772             v1025.push([0; 1025]);
1773             assert_eq!(v1025.capacity(), 32);
1774         }
1775
1776         for _ in 32..64 {
1777             v1025.push([0; 1025]);
1778             assert_eq!(v1025.capacity(), 64);
1779         }
1780     }
1781 }
1782
1783 macro_rules! generate_assert_eq_vec_and_prim {
1784     ($name:ident<$B:ident>($type:ty)) => {
1785         fn $name<A: PartialEq<$B> + Debug, $B: Debug>(a: Vec<A>, b: $type) {
1786             assert!(a == b);
1787             assert_eq!(a, b);
1788         }
1789     };
1790 }
1791
1792 generate_assert_eq_vec_and_prim! { assert_eq_vec_and_slice  <B>(&[B])   }
1793 generate_assert_eq_vec_and_prim! { assert_eq_vec_and_array_3<B>([B; 3]) }
1794
1795 #[test]
1796 fn partialeq_vec_and_prim() {
1797     assert_eq_vec_and_slice(vec![1, 2, 3], &[1, 2, 3]);
1798     assert_eq_vec_and_array_3(vec![1, 2, 3], [1, 2, 3]);
1799 }
1800
1801 macro_rules! assert_partial_eq_valid {
1802     ($a2:ident, $a3:ident; $b2:ident, $b3: ident) => {
1803         assert!($a2 == $b2);
1804         assert!($a2 != $b3);
1805         assert!($a3 != $b2);
1806         assert!($a3 == $b3);
1807         assert_eq!($a2, $b2);
1808         assert_ne!($a2, $b3);
1809         assert_ne!($a3, $b2);
1810         assert_eq!($a3, $b3);
1811     };
1812 }
1813
1814 #[test]
1815 fn partialeq_vec_full() {
1816     let vec2: Vec<_> = vec![1, 2];
1817     let vec3: Vec<_> = vec![1, 2, 3];
1818     let slice2: &[_] = &[1, 2];
1819     let slice3: &[_] = &[1, 2, 3];
1820     let slicemut2: &[_] = &mut [1, 2];
1821     let slicemut3: &[_] = &mut [1, 2, 3];
1822     let array2: [_; 2] = [1, 2];
1823     let array3: [_; 3] = [1, 2, 3];
1824     let arrayref2: &[_; 2] = &[1, 2];
1825     let arrayref3: &[_; 3] = &[1, 2, 3];
1826
1827     assert_partial_eq_valid!(vec2,vec3; vec2,vec3);
1828     assert_partial_eq_valid!(vec2,vec3; slice2,slice3);
1829     assert_partial_eq_valid!(vec2,vec3; slicemut2,slicemut3);
1830     assert_partial_eq_valid!(slice2,slice3; vec2,vec3);
1831     assert_partial_eq_valid!(slicemut2,slicemut3; vec2,vec3);
1832     assert_partial_eq_valid!(vec2,vec3; array2,array3);
1833     assert_partial_eq_valid!(vec2,vec3; arrayref2,arrayref3);
1834 }
1835
1836 #[test]
1837 fn test_vec_cycle() {
1838     #[derive(Debug)]
1839     struct C<'a> {
1840         v: Vec<Cell<Option<&'a C<'a>>>>,
1841     }
1842
1843     impl<'a> C<'a> {
1844         fn new() -> C<'a> {
1845             C { v: Vec::new() }
1846         }
1847     }
1848
1849     let mut c1 = C::new();
1850     let mut c2 = C::new();
1851     let mut c3 = C::new();
1852
1853     // Push
1854     c1.v.push(Cell::new(None));
1855     c1.v.push(Cell::new(None));
1856
1857     c2.v.push(Cell::new(None));
1858     c2.v.push(Cell::new(None));
1859
1860     c3.v.push(Cell::new(None));
1861     c3.v.push(Cell::new(None));
1862
1863     // Set
1864     c1.v[0].set(Some(&c2));
1865     c1.v[1].set(Some(&c3));
1866
1867     c2.v[0].set(Some(&c2));
1868     c2.v[1].set(Some(&c3));
1869
1870     c3.v[0].set(Some(&c1));
1871     c3.v[1].set(Some(&c2));
1872 }