@@ -1686,6 +1686,40 @@ fn truncate_leak() {
1686
1686
assert_eq ! ( unsafe { DROPS } , 7 ) ;
1687
1687
}
1688
1688
1689
+ #[ test]
1690
+ #[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
1691
+ fn truncate_front_leak ( ) {
1692
+ static mut DROPS : i32 = 0 ;
1693
+
1694
+ struct D ( bool ) ;
1695
+
1696
+ impl Drop for D {
1697
+ fn drop ( & mut self ) {
1698
+ unsafe {
1699
+ DROPS += 1 ;
1700
+ }
1701
+
1702
+ if self . 0 {
1703
+ panic ! ( "panic in `drop`" ) ;
1704
+ }
1705
+ }
1706
+ }
1707
+
1708
+ let mut q = VecDeque :: new ( ) ;
1709
+ q. push_back ( D ( false ) ) ;
1710
+ q. push_back ( D ( false ) ) ;
1711
+ q. push_back ( D ( false ) ) ;
1712
+ q. push_back ( D ( false ) ) ;
1713
+ q. push_back ( D ( false ) ) ;
1714
+ q. push_front ( D ( true ) ) ;
1715
+ q. push_front ( D ( false ) ) ;
1716
+ q. push_front ( D ( false ) ) ;
1717
+
1718
+ catch_unwind ( AssertUnwindSafe ( || q. truncate_front ( 1 ) ) ) . ok ( ) ;
1719
+
1720
+ assert_eq ! ( unsafe { DROPS } , 7 ) ;
1721
+ }
1722
+
1689
1723
#[ test]
1690
1724
#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
1691
1725
fn test_drain_leak ( ) {
@@ -1863,3 +1897,38 @@ fn test_collect_from_into_iter_keeps_allocation() {
1863
1897
assert_eq ! ( v. capacity( ) , 13 ) ;
1864
1898
}
1865
1899
}
1900
+
1901
+ #[ test]
1902
+ fn test_truncate_front ( ) {
1903
+ let mut v = VecDeque :: with_capacity ( 13 ) ;
1904
+ v. extend ( 0 ..7 ) ;
1905
+ assert_eq ! ( v. as_slices( ) , ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ] . as_slice( ) , [ ] . as_slice( ) ) ) ;
1906
+ v. truncate_front ( 10 ) ;
1907
+ assert_eq ! ( v. len( ) , 7 ) ;
1908
+ assert_eq ! ( v. as_slices( ) , ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ] . as_slice( ) , [ ] . as_slice( ) ) ) ;
1909
+ v. truncate_front ( 7 ) ;
1910
+ assert_eq ! ( v. len( ) , 7 ) ;
1911
+ assert_eq ! ( v. as_slices( ) , ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ] . as_slice( ) , [ ] . as_slice( ) ) ) ;
1912
+ v. truncate_front ( 3 ) ;
1913
+ assert_eq ! ( v. as_slices( ) , ( [ 4 , 5 , 6 ] . as_slice( ) , [ ] . as_slice( ) ) ) ;
1914
+ assert_eq ! ( v. len( ) , 3 ) ;
1915
+ v. truncate_front ( 0 ) ;
1916
+ assert_eq ! ( v. as_slices( ) , ( [ ] . as_slice( ) , [ ] . as_slice( ) ) ) ;
1917
+ assert_eq ! ( v. len( ) , 0 ) ;
1918
+
1919
+ v. clear ( ) ;
1920
+ v. extend ( 0 ..7 ) ;
1921
+ assert_eq ! ( v. as_slices( ) , ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ] . as_slice( ) , [ ] . as_slice( ) ) ) ;
1922
+ v. push_front ( 9 ) ;
1923
+ v. push_front ( 8 ) ;
1924
+ v. push_front ( 7 ) ;
1925
+ assert_eq ! ( v. as_slices( ) , ( [ 7 , 8 , 9 ] . as_slice( ) , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ] . as_slice( ) ) ) ;
1926
+ v. truncate_front ( 12 ) ;
1927
+ assert_eq ! ( v. as_slices( ) , ( [ 7 , 8 , 9 ] . as_slice( ) , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ] . as_slice( ) ) ) ;
1928
+ v. truncate_front ( 10 ) ;
1929
+ assert_eq ! ( v. as_slices( ) , ( [ 7 , 8 , 9 ] . as_slice( ) , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ] . as_slice( ) ) ) ;
1930
+ v. truncate_front ( 8 ) ;
1931
+ assert_eq ! ( v. as_slices( ) , ( [ 9 ] . as_slice( ) , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ] . as_slice( ) ) ) ;
1932
+ v. truncate_front ( 5 ) ;
1933
+ assert_eq ! ( v. as_slices( ) , ( [ 2 , 3 , 4 , 5 , 6 ] . as_slice( ) , [ ] . as_slice( ) ) ) ;
1934
+ }
0 commit comments