@@ -1686,6 +1686,40 @@ fn truncate_leak() {
16861686 assert_eq ! ( unsafe { DROPS } , 7 ) ;
16871687}
16881688
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+
16891723#[ test]
16901724#[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
16911725fn test_drain_leak ( ) {
@@ -1863,3 +1897,38 @@ fn test_collect_from_into_iter_keeps_allocation() {
18631897 assert_eq ! ( v. capacity( ) , 13 ) ;
18641898 }
18651899}
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